Help us understand the problem. What is going on with this article?

google.script.run が Promise を返すようにする

期待を返せ

google.script.run は withSuccessHandler や withFailureHandler でコールバックを登録する仕様となっており、 Promise を返してくれません。
async / await ですっきり書きたいですよね。

理想
(async ()=> {
  const data1 = await google.script.run.myFunction();
  const data2 = await google.script.run.myFunction2(data1);
  console.log(data1);
  console.log(data2);
})();
現実
google.script.run
.withSuccessHandler( data1 => {
  google.script.run
  .withSuccessHandler( data2 => {
    console.log(data1);
    console.log(data2);
  })
  .withFailureHandler(console.error)
  .myFunction2(data1);
})
.withFailureHandler(console.error)
.myFunction();

Promiseを返さないなら自作関数で包んでしまえ

というわけで google.script.run を元に Promise を返す関数を動的に定義します。

const ServerScript = new class {
  constructor() {
    const createAsyncFunction = (methodName) => function() {
      return new Promise( (resolve, reject) => {
        google.script.run
        .withSuccessHandler(resolve)
        .withFailureHandler(reject)
        [methodName]
        .apply(null, arguments);
      });
    }.bind(this);
    for (const methodName in google.script.run) {
      const type = google.script.run[methodName].prototype.constructor.name;
      if (type != methodName) {
        this[methodName] = createAsyncFunction(methodName);
      }
    }
  }
};
(async ()=> {
  const data1 = await ServerScript.myFunction();
  const data2 = await ServerScript.myFunction2(data1);
  console.log(data1);
  console.log(data2);
})();

for 文の中の if は withSuccessHandler や withFailureHandler を弾くためのものなので、別に無くても問題ないです。呼ばなければ良い話ですから。

また、この条件でも doGet などが入ってきてしまうのですが、呼んでもエラーなどは起きずに undefined が返ってきます。元々の google.script.run からそのような動きをするようなので、こちらも特に気にしないことにします。

以上、快適なGASライフを!

37cohina
JavascriptとLinuxが大好き。もっと世の中を知りたい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away