2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASの関数をPromiseでラップする (魔法のオブジェクトProxy)

Last updated at Posted at 2024-10-31

株式会社 ONE WEDGE@Shankouです。
今回は少し短めにGAS(Google Apps Script)の関数をWebアプリ側から呼び出す際に?少しだけ使いやすくする工夫を紹介したいと思います。
みなさんはProxy使ってますか??

今回は以下の様なGASの関数を例に使います。

/**
 * 利用者自身の情報を取得する関数
 * @return {Object} - { email: String, name:String, parson: Object }
 */
function getSelf () {
  const response = People.People.getBatchGet({
    resourceNames: ['people/me'],
    personFields: 'names,emailAddresses'
  }).responses[0];

  // エラーハンドリング
  if (!response || !response.person) {
    throw new Error('利用者情報の取得に失敗しました。');
  }

  const person = response.person;

  return {
    email: person.emailAddresses?.[0]?.value || 'メールアドレスがありません',
    name: `${person.names?.[0]?.familyName || ''} ${person.names?.[0]?.givenName || ''}`.trim(),
    person
  };
}

この関数をWEBアプリ側から使用する場合、以下のように使用することができます。

function onSuccessGetSelf(result) {
    console.info(result)
}

function onFailureGetSelf(e) {
    console.error(e)
}

google.script.run
    .withSuccessHandler(onSuccessGetSelf)
    .withFailureHandler(onFailureGetSelf)
    .getSelf();

別にこのままでも問題は特にないです。
でも、コールバック関数の形って今はあまり使わないですよね?
後続処理を書くのも大変ですし、、、
コールバック関数ではなく、async/awaitで書けた方が可読性も高いと思いませんか?
そんなあなたにおすすめしたいのがこの魔法のオブジェクト!Proxy!

// 魔法のオブジェクト!Proxy!
const GSRun = new Proxy(google.script.run, {
  get(target, method) {
    return (...args) => 
      new Promise((resolve, reject) => {
        target
          .withSuccessHandler(resolve)
          .withFailureHandler(reject)
          [method](...args);
      });
  }
});

// ざっくり使い方
(async () => {
    try {
        console.info(await GSRun.getSelf());
    } catch (e) {
        console.error(e);
    }
})();

まず、Google Apps Scriptのgoogle.script.runをラップするプロキシオブジェクトGSRunを定義します。
Proxyオブジェクトは、JavaScriptの機能の一つで、他のオブジェクトの動作をカスタマイズするためのものです。具体的には、オブジェクトのプロパティへのアクセスやメソッドの呼び出しなどの基本的な操作をトラップ(捕捉)し、これらの操作を制御したり、変更したりすることができます。
例えば、プロパティの取得時に特定の処理を行ったり、設定時にバリデーションを行ったりすることができます。
多用しすぎると処理が追いにくくなるので注意が必要ですが、一定の範囲であればとても便利な機能になります。

getトラップは、プロキシオブジェクトがプロパティにアクセスされた際に呼び出され、targetは元のオブジェクト(ここではgoogle.script.run)、methodは呼び出されるメソッドの名前を引数として受け取ります。
メソッドが呼び出されると、引数を受け取るアロー関数が返され、Promiseを作成します。

今回はgetSelfを例にしましたが、他のGAS関数が増えたとしても、特別気にすることもなく同様のコードを書くことで呼び出すことが可能です!
(呼び出しの関数名はProxyで動的に取得しているので、これ一つ置いておくだけで全て解決できます!)

言葉で説明すると難しいProxyですが、知っておくと便利な機能でもあるので、みなさんもぜひ使ってみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?