Blog, The

1 月 22 日生まれ、ブログ座です。

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) を返すようにしないとダメみたいですね。