Google Apps Script で、SpreadSheet は関数実行が終わるまで同じ内容しか取得できない→SpreadsheetApp.flush()すれば取得できる

GoogleAppsScriptでCometの仕組みを使ったチャットを作ってみようかと思ったらこの罠にハマってしまった……。

var ss = SpreadsheetApp.openById(SPREAD_ID);
var sheet = ss.getSheets()[0];
Logger.log(sheet.getRange("A1").getValue()); // "あいうえお"が取得できるとする

Utilities.sleep(10 * 1000); // この待ち時間の間に、別のタブに開いてあるスプレッドシートでセルの内容を変更する "あいうえお"→"かきくけこ"

Logger.log(sheet.getRange("A1").getValue()); // "かきくけこ"ではなく、"あいうえお"が取得されてしまう



いろいろ試したら

SpreadsheetApp.flush();

……という、本来は保留中のすべてのスプレッドシートの変更を適用するためのAPIを実行すると、即座に他のユーザが更新した内容を取得できるようになることが判った。
この対策を入れるとComet方式のチャットを作ることができた。
名前はflushだがリフレッシュ的な動きもしてるっぽい。
上の例だと、以下だとうまくいく。

var ss = SpreadsheetApp.openById(SPREAD_ID);
var sheet = ss.getSheets()[0];
Logger.log(sheet.getRange("A1").getValue()); // "あいうえお"が取得できるとする

Utilities.sleep(10 * 1000); // この待ち時間の間に、別のタブに開いてあるスプレッドシートでセルの内容を変更する "あいうえお"→"かきくけこ"
SpreadsheetApp.flush(); // ●この行を追加

Logger.log(sheet.getRange("A1").getValue()); // ●"かきくけこ"が取得できる!