针对同一脚本的LockService操作过多

时间:2018-11-13 08:53:51

标签: google-apps-script

我有一个公共插件,该插件利用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内没有看到对配额的任何引用

LockService documentation

中也看不到任何关于配额的引用

3 个答案:

答案 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配额页面未在任何地方记录确切的限制,但尝试减少与工作表关联的触发器的数量,它应该可以工作。