【GAS】クラスを作って外部ライブラリとして呼び出したい場合は、ファクトリメソッドを作ろう
515 語
3 分
【GAS】クラスを作って外部ライブラリとして呼び出したい場合は、ファクトリメソッドを作ろう
はじまり

リサちゃん
ぐああ・・・、せっかくライブラリ化したのに、外部のGASから呼び出せないよお・・・

135ml
おお、そのライブラリ化した処理って、classとか使ってないかね?

リサちゃん
使ってますね。やっぱりそれだとダメ?

135ml
うむ、今回はファクトリメソッドを使って、classで書いていた処理を外部ライブラリから呼び出せるようにします!

リサちゃん
教えてくれ〜!
ここをこう書き換える。
まず、こんな風にclassを使って書かれている処理があるとします。
この書き方だと、Executorオブジェクトを呼べません。
// クラス宣言していた部分class Executor{ constructor(){ this.name = "executor"; } plusOne = function(num){ let num1 = num + 1; return num1; }}
// 別ライブラリからの呼び出し部分function callExecutor(){ let tester = Executor(); // ここでエラーになる。 let num2 = tester.plusOne(3); console.log(num2); // 4}その処理をこのように、classを使わずにファクトリメソッドを使ってobjectの生成を行います。
// ファクトリメソッドfunction createExecutor() { return new Executor();}// 補完用ダミーメソッドfunction plusOne() { throw new Error("Call this method after calling createExecutor.");}// Executorは補完させないようにする(function(global){ function Executor() { this.name = "executor"; } Executor.prototype.plusOne = function(num){ let num1 = num + 1; return num1; }} global.Executor = Executor;})(this);
// 別ライブラリからの呼び出し部分function callExecutor(){ let tester = createExecutor(); let num2 = tester.plusOne(3); console.log(num2); // 4}どうなっているかと言うと・・・
GASでは、別ライブラリからクラスを直接呼び出すことは出来ません。
そのため、createExecutorというクラスをオブジェクト化させる「ファクトリメソッド」というものを作って、そこからクラスから生成したオブジェクトを受け取ります。
// ファクトリメソッドfunction createExecutor() { return new Executor();}しかし、こう書くと困ったことに、ExecutorのメソッドであるplusOneが別のライブラリから入力する時に補完されないのです。
plusOneは、Executorのメソッドであり、かつExecutorは補完されると困るので、function(global)のスコープ内で定義される必要があります。
そのため、plusOneというメソッドを、スコープ外で別の関数として定義して、別ライブラリから使う時に補完させるようにします。
// 補完用ダミーメソッドfunction plusOne() { throw new Error("Call this method after calling createExecutor.");}// Executorは補完させないようにする(function(global){ function Executor() { this.name = "executor"; } Executor.prototype.plusOne = function(num){ let num1 = num + 1; return num1; }} global.Executor = Executor;})(this);おしまい

リサちゃん
おお、これでGASライブラリを呼び出せるねえ!

135ml
自分が過去に書いた処理をもう一度別のGASライブラリに書き写すのは面倒だよねえ。なので、今回の方法で、classにしてた処理も呼び出せるようになりました!。

135ml
また、今回の方法は、この記事がものすごい参考になったので、良ければこちらも見てみていただければと思います。
GASのライブラリでクラス化と補完 - Qiita
今回はGASのライブラリでクラス化を補完について書きます。 GASでライブラリをクラス化と補完の問題 GASのライブラリは補完が有効になるため、開発をラクにする為にも、 ライブラリをとりあえず作るシーンはよくあります。 またライブラリを設計する上で、内部でクラスを作り、 ...
qiita.com

以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!
【GAS】クラスを作って外部ライブラリとして呼び出したい場合は、ファクトリメソッドを作ろう
https://endorphinbath.com/posts/gas-make-factory-method-to-call-outer-class/ 関連記事 スマート
1
【GAS】Google Apps Scriptで作った自作関数に対してテストコードを書けるライブラリ「TestGAS」を作りました!
Code Google Apps Scriptで作った関数に対して、テストコードを使って動作を検証するためのツール「TestGAS」を作成および公開しました。初めて作ったテストツールですが、個人的にかなり便利なものになったので、ぜひ使ってみて下さい。
2
【GAS】「承認が必要です:このプロジェクトがあなたのデータへのアクセス権限を必要としています。」の表示工程を省くようにするスコープ設定
Code GAS実行時のOAuth承認プロセスを省くために必要なappsscript.jsonのスコープ設定について紹介します。
3
【GAS】スクリプトプロパティがGUIで確認できないのでJSONに入れることにした
Code GASのエディタでスクリプトプロパティを編集出来なくなる事象を回避するために、プロパティの値をJSONで格納するように実装していく記事です。
4
【GAS】「Exception: Invalid argument: id」が出た時の対処方法
Code Google Apps Scriptで開発を行っている際に、たまに遭遇するエラー文です。シートとかファイルのオブジェクトに関係してきます。
5
【GAS】「We're sorry, a server error occurred while reading from storage. Error code NOT_FOUND.」というエラーメッセージが出てきた時。
Code Google Apps Scriptを使用した時に、「Error code NOT_FOUND」エラーに直面したときの体験談になります。
ランダム記事 ランダム