0

GAS の Google スプレッドシート スクリプトで奇妙な問題に直面しています。

以下のイベント「マウスアップ」によってトリガーされる機能が、2 回または 3 回実行され、各実行の間に秒の差がある場合があります。毎回発生するわけではありません。問題はかなりランダムに見えます。

ボタン:

var button = app.createButton("Alocar").addClickHandler(app.createClientHandler().forEventSource().setEnabled(false)).addMouseUpHandler(app.createServerHandler("onAllocateTask").addCallbackElement(panel));

「onAllocateTask」の始まり:

function onAllocateTaskSheet(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.toast("Aguarde alguns minutos.", "Atenção", 8);

  var task = e.parameter[TASK_ALLOCATION_PARAMETER];
  if (task == null || task == "") {
    return;
  }

  ... continues ...
}

関数「onAllocateTaskSheet」がコード内で (上記のコードで) 1 回だけ呼び出されることを保証できます。もう 1 つの重要な情報は、この手順 (onAllocateTaskSheet) の実行時間が長い (数十の Google ドキュメント ドキュメントをコピーする) ことです。

この関数の重複実行についての説明はありますか? おそらく私は間違ったイベントを使用していますか?内部エラーにより、プロシージャが再実行される可能性がありますか?

助けてくれてありがとう!

編集:

OK、問題がボタンまたはイベント mouseUp に関連していないことを確認できました。問題は、関数「onAllocateTask」が X 分後に再実行されることです。onAllocateTask がすぐに (たとえば 1 分未満で) 終了した場合は発生しません。タイムアウトまたは内部エラーに関連していると思います。

Google Apps Script の継続をシリアライズする際の予期しない例外 ここで、誰かが Google Apps Script が「ループ ポインタ」を失うことについて何か言っています。それは可能でしょうか?

4

2 に答える 2

1

これについては良い説明はありませんが、私にも起こりました。最善の解決策は、1 回のクリックで関数の 1 つのインスタンスのみが実行されることを保証するロック サービスを使用することです。実装は非常に簡単です:

関数の開始時に、次のようなロックを取得します。

  ...
  var lock = LockService.getPublicLock();
  var success = lock.tryLock(5000);
   if (!success) {
     Logger.log('tryLock failed to get the lock');
     return
   }

通常の実行の最後に、次のようにロックを解放します。

   lock.releaseLock();

こちらのドキュメントから取得)

于 2013-06-07T19:04:30.887 に答える
0

サーバーリクエストの実行中にクライアント側のボタンを無効にするだけです。ただし、サーバーとクライアントのハンドラには必ず同じイベントを使用する必要があります。

var button = app.createButton("Alocar");
button.addClickHandler(app.createClientHandler().forEventSource().setEnabled(false));
button.addClickHandler(app.createServerHandler("onAllocateTask").addCallbackElement(panel));
于 2013-06-07T22:11:20.570 に答える