GASのgoogle.script.runをPromise化する

GASでクライアント側のJavaScriptから、サーバ側のJavaScriptを呼び出す時、google.script.runを使用する。

ただこれは非同期処理でありながらPromiseを返さず、独自にwithSuccessHandlerwithFailureHandlerにコールバックを設定する必要があるので、ちょっと面倒。

ということで、Promise化するコードを作ってみた(V8エンジン限定)。

クライアント側のJavaScriptに下記コードを入れる。

function gasRun(func, ...args){
  return new Promise(function(resolve, reject){
    google.script.run.withSuccessHandler(function(...e){
      resolve(...e);
    }).withFailureHandler(function(...e){
      reject(...e);
    })[func](...args);
  });
}

使い方

GASサーバ側のdoSomething1, doSomething2, doSomething3を順番に呼び出す場合には、クライアント側で以下のように使う。

gasRun('doSomething1').then(function(e){
  // doSomething1成功時
  return gasRun('doSomething2');
}).then(function(e){
  // doSomething2成功時
  return gasRun('doSomething3');
}).catch(function(e){
  // エラー時
  console.log(e);
});

awaitを使って下記のように同期処理のようにも書ける(というかこちらのほうが圧倒的に書きやすくなる)。

(async ()=> {
  const result1 = await gasRun('doSomething1');
  const result2 = await gasRun('doSomething2');
  const result3 = await gasRun('doSomething3');
})();

doSomething(arg1, arg2, ...)のように引数を渡す時は以下のようにgasRunの第2引数以下に指定する。

gasRun('doSomething', arg1, arg2);

他の実装例