11

Google スプレッドシートは反復をサポートしていないため、スプレッドシート出力の計算に基づいて入力を調整する独自の簡単なアプリ スクリプトを作成しました。ただし、入力変数を変更すると、スプレッドシートは再計算されますが、アプリ スクリプトはその再計算を待機していないように見えるため、「Thinking...」や「#NA」などの値を取得してしまいます。スクリプトを一時停止し、計算が完了するのを待ってからスクリプトの次の行に移動する方法はありますか?

現在、ループを使用してセルを監視しているだけですが、シートの計算が完了するまで実行を一時停止するよりエレガントな方法があるかどうかを知りたいと思いました。

私は多くの Excel マクロを記述しており、Excel VBA は常に計算が完了するのを待ってから、コードの次の行に移動します。Apps Script はこれを行うようには見えないので、これを行う簡単な方法があることを願っています。

2 番目の質問: この繰り返しには時間がかかる場合があるため、スクリプトの実行を中断して終了するにはどうすればよいでしょうか? これを行う方法が見つからないようです。

4

5 に答える 5

5

スクリプトは約 6 分後にタイムアウトし、無限ループや継続的なプログラムの実行を防ぎます。スクリプトを手動で停止する方法はないと思います。

編集: おっと、最初の質問に答えるのを忘れました: 値が再計算された後に onEdit が実行されたと思いましたが、これを確認するのに十分な数式を使用していないようです。待機していない場合は、次のようにするのが最善の方法です。

while(value === "Thinking..." || value === "#NA") {
  Utilities.sleep(10000);
}

スクリプトを数秒間一時停止してから、再度チェックします。

于 2012-10-09T01:01:12.160 に答える
3

また、ネイティブの計算関数が便利な Excel VBA で少し書いています。計算が完了するたびにコードを実行したいので、Google Apps/Docs で同じ問題に何度か遭遇しました。これを処理するためのネイティブ関数が Google Apps/Docs にないのはなぜだろうか。とにかく、問題を解決するためにこのコードを書きました。それが役に立てば幸い。

function onEdit() {

Refresh();

};

function Refresh () {

     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
     var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

     // set the range wherever you want to make sure loading is done    

     var range = sheet.getRange('A:A')
     var values = range.getValues();

     var string = values.toString();

     var loading = "Loading";

                    do
                      {var randomWait = Math.floor(Math.random()*1+0); randomWait;}
                    while (string.search(loading) ==! 0);

      range.copyTo(sheet2.getRange('A1'), {contentsOnly:true});

customMsgBox();

};

function customMsgBox() {
  Browser.msgBox("Data refreshed.");
};

実際の例を次に示します:
https://docs.google.com/spreadsheet/ccc?key=0AkK50_KKCI_pdHJvQXdnTmpiOWM4Rk5PV2k5OUNudVE#gid=0

遊びたい場合は、コピーを作成してください。

于 2012-11-17T04:42:51.877 に答える
1

私も同じ問題を抱えていました。スプレッドシートに必要なデータが含まれていることを確認する必要があったため、2 つのスクリプトを使用して解決しました。

最初のスクリプトは、IMPORTXML 関数を介してスプレッドシートに入力するシード値を提供します。

2 番目のスクリプトは、このデータを処理します。

時間ベースのトリガーを使用してスクリプトを実行し、最初のスクリプトが完了するのに十分な時間を確保しました

于 2020-04-23T09:13:44.853 に答える
0

スプレッドシートではなく、code.js ファイルに再帰構造を配置できます。Javascript は再帰を非常にうまく処理できます。その後、反復ごと (または 100 回ごと) にスクリプトでスプレッドシートを更新することができます。

于 2012-10-10T20:05:06.043 に答える