我的问题是如何确保在并发访问时不会丢失任何数据。
我将脚本发布为网络应用程序。我想向 DATA_SHEET 添加新行。处理提交按钮的函数如下所示:
function onButtonSubmit(e) {
var app = UiApp.getActiveApplication();
var lock = LockService.getPublicLock();
while (! lock.tryLock(1000))
;
var ssheet = SpreadsheetApp.openById(SHEET_ID);
var sheet = ssheet.getSheetByName(DATA_SHEET);
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
var rangeToInsert = sheet.getRange(lastRow+1, 1, 1, lastCol);
var statText = rangeToInsert.getA1Notation();
rangeToInsert.setValues(<some data from webapp form>);
app.getElementById('statusLabel').setText(statText);
lock.releaseLock();
return app;
}
但这似乎行不通。当我打开两个表单并在一秒钟内单击提交按钮时,它会在 statsLabel 中显示相同的范围并将数据写入相同的范围。所以我从一种表格中丢失了数据。
这段代码有什么问题?似乎 tryLock() 不会阻止脚本。
还有其他方法可以防止对工作表的并发写访问吗?