0

我在 GAS 上遇到了一个关于 Google 电子表格脚本的奇怪问题。

有时,由下面的“鼠标上移”事件触发的函数会执行两到三次,每次运行之间相差几秒。它不会每次都发生,问题看起来非常随机。

按钮:

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”在代码中只被调用一次(在上面的代码中)。另一个重要信息是此过程 (onAllocateTaskSheet) 的执行时间很长(它复制了数十个 Google Docs 文档)。

是否有重复执行此功能的解释?也许我使用了错误的事件?某些内部错误会导致程序重新执行?

再次感谢您的帮助!

编辑:

好的,现在我可以确认问题与按钮或事件 mouseUp 无关。问题是函数“onAllocateTask”在 X 分钟后被重新执行。当 onAllocateTask 快速完成时(例如不到 1 分钟),它不会发生。我猜这与一些超时或内部错误有关。

序列化延续 Google Apps 脚本时出现意外异常 这里有人说 Google Apps 脚本丢失了“循环指针”。有可能吗?

4

2 回答 2

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 回答