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

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

はじまり#

リサちゃん avatar
リサちゃん
ぐああ・・・、せっかくライブラリ化したのに、外部のGASから呼び出せないよお・・・
135ml avatar
135ml
おお、そのライブラリ化した処理って、classとか使ってないかね?
リサちゃん avatar
リサちゃん
使ってますね。やっぱりそれだとダメ?
135ml avatar
135ml
うむ、今回はファクトリメソッドを使って、classで書いていた処理を外部ライブラリから呼び出せるようにします!
リサちゃん avatar
リサちゃん
教えてくれ〜!

ここをこう書き換える。#

まず、こんな風に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);

おしまい#

リサちゃん avatar
リサちゃん
おお、これでGASライブラリを呼び出せるねえ!
135ml avatar
135ml
自分が過去に書いた処理をもう一度別のGASライブラリに書き写すのは面倒だよねえ。なので、今回の方法で、classにしてた処理も呼び出せるようになりました!。
135ml avatar
135ml
また、今回の方法は、この記事がものすごい参考になったので、良ければこちらも見てみていただければと思います。

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【GAS】クラスを作って外部ライブラリとして呼び出したい場合は、ファクトリメソッドを作ろう
https://endorphinbath.com/posts/gas-make-factory-method-to-call-outer-class/
著者
kinkinbeer135ml
公開日
2022-05-09
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
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」エラーに直面したときの体験談になります。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次