導入
GASのWebアプリでサーバー側に処理をさせたい場合、google.script.runを使用しますが、コールバック地獄に陥りがちです。
//理想
const value = google.script.run.myFunction();
console.log(value);
//現実
google.script.run.withSuccecssHandler(console.log).myFunction();
今回は、理想通りに書けるようにするのが目的です。
ソースコード
const $ = new Proxy({},{
get(t,p){
return (...a) => new Promise((r1,r2) => {
google.script.run.withSuccessHandler(r1)
.withFailureHandler(r2)
[p](...a);
})
}
});
使い方
(async () => {
const value = await $.myFunction("hogehoge");
console.log(value);
})()
解説
Proxyの詳しい仕様はこちら(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
簡単にいえば、プロパティの読み込み時の動作をカスタマイズできるということです。
例えば、どんなプロパティを読み込んでも、特定の文字列を返すことができます。
const proxy = new Proxy({},{get(t,key){return key}});
console.log(proxy.aiueo) //aiueo
console.log(proxy.admo) //admo
//Proxyによって、全ての値をプロパティ名と同一にしている
これを利用して、サーバ側から呼び出す関数を指定しています。Proxyを使用しないと、
const $ = {
myFunction : (...argus) => new Promise(...),
//...
}
のように、すべての関数について逐一ソースコードを書き換える必要があるため、大変不便です。