【问题标题】:LockService - Cell is still being overwrittenLockService - 单元仍在被覆盖
【发布时间】:2021-07-07 18:57:07
【问题描述】:

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

问题是当 Web 应用程序接收并发请求时,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");
}

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

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

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

The list of urls with an increasing parameter

【问题讨论】:

  • 这可能是与v8 runtime 相关的错误,因为我在使用旧的 Rhino 解释器时无法重现它。如果您需要做的只是追加一行,请尝试使用appendRow() 方法,它应该可以在没有锁的情况下工作。
  • 如果你认为这是一个错误,你可以在Issue Tracker提出这个问题

标签: google-apps-script google-sheets web-applications


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多