【发布时间】: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() 一行似乎可以解决问题。但是……为什么?
【问题讨论】:
-
这可能是与v8 runtime 相关的错误,因为我在使用旧的 Rhino 解释器时无法重现它。如果您需要做的只是追加一行,请尝试使用
appendRow()方法,它应该可以在没有锁的情况下工作。 -
如果你认为这是一个错误,你可以在Issue Tracker提出这个问题
标签: google-apps-script google-sheets web-applications