我在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失去“循环指针”的内容。可能吗?
答案 0 :(得分:1)
我对此没有任何好的解释,但它也发生在我身上。最好的解决方案是使用锁定服务,该服务将保证一次只能执行一个函数实例。 它很容易实现:
在你的函数开头得到一个像这样的锁:
...
var lock = LockService.getPublicLock();
var success = lock.tryLock(5000);
if (!success) {
Logger.log('tryLock failed to get the lock');
return
}
并在正常执行结束时释放锁定:
lock.releaseLock();
答案 1 :(得分:0)
在服务器请求运行时,只需在客户端禁用该按钮即可。但是你绝对应该为服务器和客户端处理程序使用相同的事件。
var button = app.createButton("Alocar");
button.addClickHandler(app.createClientHandler().forEventSource().setEnabled(false));
button.addClickHandler(app.createServerHandler("onAllocateTask").addCallbackElement(panel));