Google Apps Script で UI が更新されないときに確認すること
最近、なんやかんやあって Google Apps Script やってます。
UI Services っていう、ちょっとしたフォームみたいなのを作る API があって、それを使ってスクリプトを書いてたんですよ。
2つリストボックスがあって、リストボックス1の何かが選択されたら、リストボックス2の項目を置き換えるっていう、
割とありがちな処理だと思うんですが・・・
function onOpen() { SpreadsheetApp.getActiveSpreadsheet().addMenu('Test', [ { name: 'Foo', functionName: 'onClickFoo' } ]); } function onClickFoo() { var app = UiApp.createApplication().setTitle('Foo'); var panel = app.createVerticalPanel(); app.add(panel); var listBox1 = app.createListBox().setId('listBox1'); listBox1.addChangeHandler(app.createServerChangeHandler('onSelectListBox1')); listBox1.addItem('1-1'); listBox1.addItem('1-2'); listBox1.addItem('1-3'); panel.add(listBox1); var listBox2 = app.createListBox().setId('listBox2'); listBox2.addItem('2-1'); listBox2.addItem('2-2'); listBox2.addItem('2-3'); panel.add(listBox2); SpreadsheetApp.getActiveSpreadsheet().show(app); } function onSelectListBox1() { var app = UiApp.getActiveApplication(); var listBox2 = app.getElementById('listBox2'); listBox2.clear(); listBox2.addItem('2-4'); listBox2.addItem('2-5'); listBox2.addItem('2-6'); }
どうも期待通りに動いてくれません。
英語わからないながら以下のページをぼーっと眺めてたら、
Ui Service - Google Apps Script — Google Developers
イベントハンドラの最後に必ず、
return app;
って書いてあったんで、おもむろに追加してみると、
// 省略... function onSelectListBox1() { var app = UiApp.getActiveApplication(); var listBox2 = app.getElementById('listBox2'); listBox2.clear(); listBox2.addItem('2-4'); listBox2.addItem('2-5'); listBox2.addItem('2-6'); return app; // ← 追加 }
いやー、動きました。
イベントハンドラは、必ず (かどうかはわかんないけど、少なくとも UI の更新が発生する時は) アプリケーション (UiInstance) を返すようにしないとダメみたいですね。