我有一个公共插件,该插件利用Google Apps脚本锁定服务来防止在进行写入之前读取电子表格。
var lock = LockService.getDocumentLock();
var success = lock.tryLock(240000); // 4 minutes
if (!success) {
console.warn('Could not obtain lock after 4 minutes.');
return;
}
//perform some function then release lock
lock.releaseLock();
我继续收到错误消息:
针对同一脚本的LockService操作过多。
最初,我认为此错误是“基于用户的”错误,并且可能存在针对每个用户 的锁定服务操作数量的配额,但是我最近开始发现,在30个以上的用户中,该错误出现的频率更高过去几天。
每个用户 或每个脚本的LockService操作的数量是否有限制?
如果是,限制是什么?
我在Google Apps Script quotas内没有看到对配额的任何引用
中也看不到任何关于配额的引用答案 0 :(得分:2)
我不知道问题的答案(因此,我不会将此答案标记为已接受),但这是我的解决方法。
这不是最优雅的解决方案,因为它不能防止所有情况(触发快速连续运行,有时会不按顺序触发),因此请经验丰富的人员提供指导。
try{
for(var i=1; i<11; i++){ //attempt 10 times, then run and hope for the best
var documentLock = PropertiesService.getDocumentProperties().getProperty('documentLock');
if(documentLock){
Utilities.sleep(20000); //if locked, sleep for 20 seconds
console.log('Wait ' + i + ' for documentLock to be released.');
}else{break;}
}
PropertiesService.getDocumentProperties().setProperty('documentLock', true);
runSomeFunction()
}
catch(err){
console.error(err);
console.error(err["stack"]);
}
finally{
PropertiesService.getDocumentProperties().deleteProperty('documentLock');
}
答案 1 :(得分:2)
有关于此的报告:https://issuetracker.google.com/issues/112384851
看来这可能偶尔发生。一位Google员工回答了以下问题:
只需对此进行更新:Apps脚本团队建议:
1)在LockService调用周围使用try / catch块,并假定错误表示“未获取锁”(无论该脚本试图执行的逻辑是什么)。
2)如果“未获取锁定”表示“脚本应重试”,则在重试LockService操作之前,请在其中休眠几秒钟(甚至可能是指数退避)。
目前我们没有其他解决方案,一旦对Apps Script进行了某些更改,我们可能会进行更新。
答案 2 :(得分:1)
当有多个触发器试图同时访问同一Google表格时,可能会发生这种情况。 Google配额页面未在任何地方记录确切的限制,但尝试减少与工作表关联的触发器的数量,它应该可以工作。