事件重复?

时间:2013-06-07 16:41:14

标签: google-apps-script

我在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无关。问题是在X分钟后重新执行“onAllocateTask”功能。当onAllocateTask快速完成时(例如,在不到1分钟内),它不会发生。我猜这与一些超时或内部错误有关。

Unexpected exception upon serializing continuation Google Apps Script 这里有人说了一些关于Google Apps Scripts失去“循环指针”的内容。可能吗?

2 个答案:

答案 0 :(得分:1)

我对此没有任何好的解释,但它也发生在我身上。最好的解决方案是使用锁定服务,该服务将保证一次只能执行一个函数实例。 它很容易实现:

在你的函数开头得到一个像这样的锁:

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

并在正常执行结束时释放锁定:

   lock.releaseLock();

(采取from documentation here

答案 1 :(得分:0)

在服务器请求运行时,只需在客户端禁用该按钮即可。但是你绝对应该为服务器和客户端处理程序使用相同的事件

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