GASのgoogle.script.runをPromise化する
GASでクライアント側のJavaScriptから、サーバ側のJavaScriptを呼び出す時、google.script.run
を使用する。
ただこれは非同期処理でありながらPromiseを返さず、独自にwithSuccessHandler
とwithFailureHandler
にコールバックを設定する必要があるので、ちょっと面倒。
ということで、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);