【问题标题】:Do I need LockService getScriptLock if my script has many users如果我的脚本有很多用户,我是否需要 LockService getScriptLock
【发布时间】:2020-03-23 19:30:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: google-apps-script google-sheets concurrency atomic


    【解决方案1】:

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

    sheet.appendRow(array);
    

    那么您不需要锁定服务来写入数据。如果您正在使用:

    sheet.getRange().setValues(array_2_D);
    

    那么你确实需要锁服务。

    所以,appendRow() 是“原子的”,setValues() 不是。原子意味着每个操作完全独立运行。

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

    如果您有并发用户,则获取值应使用锁定服务。并发用户也有配额限制。 “同时执行”的限制为 30,(在本文发布时)

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

    【讨论】:

    • 感谢朋友的更正和解释清楚的答案。
    【解决方案2】:

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

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

    尽管知道appendRow() 是原子的,但我现在体验到appendRow() 实际上可能会覆盖工作表上最后使用的行!

    如果不使用Lock Service,我从未经历过这种行为。

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

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

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

    屏幕截图:appendRow() 替换工作表的最后一行:

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多