如果我的脚本有很多用户,我是否需要 LockService getScriptLock

Do I need LockService getScriptLock if my script has many users

我的 html 表单使用 Google 脚本将数据上传到电子表格。我使用以下功能来防止冲突,因为许多用户正在访问 Web 应用程序页面:

function lockservice() {
  var lock = LockService.getScriptLock();
  lock.waitLock(30000);
  lock.releaseLock();
}

我有另一个脚本来检索数据(单独的脚本),也有很多用户在访问它。那我还需要 getscriptlock 吗?

换句话说,用户之间是在获取数据时发生冲突,还是仅在上传时发生冲突?或者可能在这两种情况下。

如果您使用以下方式将数据写入电子表格:

sheet.appendRow(array);

那你写数据就不需要Lock Service了。如果您正在使用:

sheet.getRange().setValues(array_2_D);

那么您确实需要锁定服务。

所以,appendRow() 是 "atomic" 而 setValues() 不是。原子意味着每个操作彼此完全独立运行。

https://developers.google.com/apps-script/reference/spreadsheet/sheet?hl=en#appendRow(Object)

如果您有并发用户,获取值应该使用锁定服务。并发用户也有配额限制。 "Simultaneous Executions" 的限制是 30,(此时 post)

https://developers.google.com/apps-script/guides/services/quotas#current_limitations

其实我也有同样的理解但是:

我有一个脚本,其中使用了 Lock Service,锁定的部分还包括对 sheet 的 appendRow() 操作。 该脚本最多允许 30 个并发执行。

尽管知道 appendRow() 被声明为原子的,但我现在体验到 appendRow() 实际上可能会覆盖 sheet 上最后使用的行!

我从未在不使用 Lock Service 的情况下经历过这种行为。

还有其他人观察到这种意外行为吗?

在链接的屏幕截图中,您会看到先前记录的新 Date() 值被替换,而不是在下面附加了整个新行。

非常感谢任何克服这种行为的想法和建议。

屏幕截图:appendRow() 替换了 sheet 的最后一行: