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を参照してください。 )。