google.script.run を async/await で使う

しかしまぁなんですね、Google Apps Script で、簡単なウェブアプリを作っている、部内SEと化している今日このごろでございまして。

クライアント側の JavaScript コードから、サーバー側の JavaScript コードと通信するとき、google.script.run を使うのが便利だ。サーバー側で doSomething() という関数がオブジェクトを返すように定義しておけば、クライアント側からは、doSomething() と書いて呼び出せる。Web API をかかなくていい。ただ、呼び出したあとの処理の書き方がだるい。

google.script.run
  .withSuccessHandler((result)=>{/*result使ってなんかする*/})
  .withFailureHandler((error)=>{/*errorを処理する*/})
  .doSomething();

実行順に、記述できるように .then とか使いたい。なんなら、async/await 使いたい。使ったことないけど。

書いてみた

// Wrap google.script.run
function doSomething() {
 return new Promise((resolve, reject) => {
   google.script.run
     .withSuccessHandler((result) => resolve(result))
     .withFailureHandler((error) => resolve(error))
     .doSomething();
 });
}

👆こんな風にラップしておくと、下のようにかける。

async function foo() {
  const result = await doSomething();
  /* ... result を使ってあれやこれや ... */
}

ほんとは、doSomething を中で定義せずに書きたかった。Python でいうところの __getattr__ がないので、簡単にはいかなかった。

でも、どうせ呼び出すべき関数名は分かっているんだから、__defineGetter__ を使ったりすればいいんだな、という気分になってきた。

この記事が気に入ったらサポートをしてみませんか?