5

ImportRangeを使用して別のスプレッドシートソースからデータを取得するスプレッドシートターゲットがあります。

A6 = query(ImportRange("mykey", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0)

select句は、B3の値に一致するデータをサブ選択することです。このセルの値が変更されると、インポートは「すぐに」更新されます。

誰かがソーススプレッドシートの何かを変更した場合に強制的に更新して、ターゲットに「すぐに」反映されるようにしたいと思います。現在、これは「不特定の時間の後」にのみ発生します。これは最大1分程度であり、私の目的には遅すぎます。

アップデート:

以下の回答とコメントに従って、編集トリガー*から呼び出される関数UpdateTargetをソースに追加しました。

function UpdateTarget() {
  try {
    var ss = SpreadsheetApp.openById("targetID");
  }
  catch(err)
  {
    Browser.msgBox(err);
  }
  var sheet = ss.getSheetByName("Weekly");
  sheet.getRange("A4").setValue("=query(ImportRange("sourceID", "Weekly!B:BI"), CONCATENATE("select * WHERE Col1='",B3,"'"), 0) ");
  SpreadsheetApp.flush();
}

これはより効果的に機能するようですが、このルートをたどる場合は、更新された値をターゲットに直接書き込むスクリプトを使用することもできます。

他のユーザーが複製でき、マスターソースから特定の「ライブ」データを抽出できるテンプレートをターゲットにしたかったので、新しいターゲットが追加されたときに維持する必要のあるスクリプトをソースに実装するのは気が進まない。

私が本当に必要としているのは、編集可能なセルに依存し、再計算をトリガーするように数式を言い換える方法だと思いますが、結果には影響しませんか?

(*余談ですが、openByID関​​数は、明示的なトリガーを介して呼び出されない限り、「アクションは許可されていません」という例外を返しました。onEditは他のスプレッドシートの編集を禁止されています。https: //developers.google.com/apps-script/understanding_triggersを参照してください。 )。

4

3 に答える 3

3

数式は、ユーザーがスプレッドシートを開いたとき、または数式に影響する (同じスプレッドシート内の) セルが変更されたときに再計算されます。

2 つの異なるスプレッドシートで作業しているため、後者のケースは当てはまりません。

どのスプレッドシートから flush() 関数を呼び出していますか? ターゲットスプレッドシートにあると思います。これでは使いものになりません。

1 つの解決策は、ソースが編集されるたびにターゲット スプレッドシートを変更するスクリプトをソース スプレッドシートに記述することです。

于 2012-11-29T18:25:28.150 に答える
0

私もこの問題を抱えていました。一定の場所にあるセルを 1 つだけインポートする必要があります。

この問題を自分で解決するために私がしたことは、ターゲットシートで onEdit をトリガーする次の関数を使用することでした。

function Refresh() {
  var ss = SpreadsheetApp.openById('*yourtargetsheetID*');
  var sheet = ss.getSheetByName('*yourtargetsheetname*');
  sheet.getRange('*locationofyourimportrangeformula*').setFormula('*yourimportrangeformula*');
}
于 2016-09-09T04:09:43.553 に答える