Che*_*mik 2 concurrency google-apps-script google-spreadsheet-api
我的问题是如何确保在并发访问时不会丢失任何数据.
我将脚本发布为web-app.我想在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;
}
Run Code Online (Sandbox Code Playgroud)
但似乎这不起作用.当我打开两个表单并在一秒钟内单击"提交"按钮时,它会在statsLabel中显示相同的范围并将数据写入相同的范围.所以我从一个表单中丢失了数据.
这段代码有什么问题?似乎tryLock()不会阻止脚本.
有没有其他方法可以防止对工作表的并发写访问?
值得一看appendRow()
,而不是使用getLastRow()
/ setValues()
等等.
允许将行原子附加到电子表格; 即使多个脚本实例同时运行,也可以安全地使用.以前,必须调用getLastRow(),然后写入该行.但是如果脚本的两次调用同时运行,它们可能都会为getLastRow()读取相同的值,然后覆盖彼此的值.
归档时间: |
|
查看次数: |
1062 次 |
最近记录: |