私の問題は、同時アクセス中にデータが失われないようにする方法です。
スクリプトを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;
}
しかし、これは機能しないようです。2つのフォームを開き、1秒以内に送信ボタンをクリックすると、statsLabelに同じ範囲が表示され、同じ範囲にデータが書き込まれます。そのため、1つのフォームからデータが失われます。
このコードの何が問題になっていますか?tryLock()はスクリプトをブロックしないようです。
シートへの同時書き込みアクセスを防ぐ方法は他にありますか?