LockService - 单元格仍在被覆盖

LockService - Cell is still being overwritten

我已经将电子表格绑定脚本设置为处理获取请求的 Web 应用程序。我想防止电子表格覆盖行,这就是我使用 LockService 来防止这种情况的原因。为此,我正在使用 getScriptLock() 方法。

问题是当网络应用程序接收并发请求时,LockService 似乎失败了。我已经像这样设置了我的最小可重现示例:

function doGet(e) {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("Sheet1");

  const randomNumber = Math.round(Math.random() * 100);

  const lock = LockService.getScriptLock();
  const success = lock.tryLock(10000);

  if (success) {
    sheet.getRange(sheet.getLastRow() + 1, 1).setValue(randomNumber);
  }

  SpreadsheetApp.flush();
  lock.releaseLock();

  return ContentService.createTextOutput("Done");
}

我从一个空白的电子表格开始。它应该在第一列的新行中为每个请求存储一个随机数。为了确保它能很好地同时处理多个请求,我使用网络应用 url 设置了一个电子表格 20 次,并附加了一个递增值的参数。您可以同时打开这些 url,方法是全部选中它们并按键盘上的左 alt + enter。现在并发请求了。

我遇到的问题是单元格被覆盖了。我创建了一个视频来展示行为:https://www.youtube.com/watch?v=G9BiktDnhic

我做错了什么?出于某种原因,运行 SpreadsheetApp.flush() 调用 getScriptLock() 上方的一行似乎可以解决问题。但是……为什么?

The list of urls with an increasing parameter

锁定服务不会阻止单元格被覆盖,它只是阻止并发用户同时运行脚本。

这似乎是 Google Apps 脚本中的错误。该错误已修复。问题可以在这里找到:https://issuetracker.google.com/issues/193051316.