はじまり
ぐああ・・・、せっかくライブラリ化したのに、外部のGASから呼び出せないよお・・・
おお、そのライブラリ化した処理って、classとか使ってないかね?
使ってますね。やっぱりそれだとダメ?
うむ、今回はファクトリメソッドを使って、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ライブラリを呼び出せるねえ!
自分が過去に書いた処理をもう一度別のGASライブラリに書き写すのは面倒だよねえ。
なので、今回の方法で、classにしてた処理も呼び出せるようになりました!
また、今回の方法は、この記事がものすごい参考になったので、良ければこちらも見てみていただければと思います。
以上になります!
コメント
参考にさせていただいています。
GASで独自クラスを作ってライブラリ化した場合、呼び出し側でドキュメンテーションコメントが表示されません。
表示したいならクラスにせず、関数をそのままライブラリ化した方がいい、という認識で合っているでしょうか。
返信が遅れてすみません。
ドキュメンテーションコメントが表示されないというのは、createExecutor()の後にplusOne()が候補に出てこない点でしょうか?
だとすると確かに、「createExecutor().」では出てこず、「plusOne(」で初めて定義が表示されるので、困りますね・・・。
すみません、対処法が見い出せていません。
本記事はこういう書き方もあるんだという紹介でした。
JavaScriptで作るとなると、関数を使って返した方が書きやすい気が個人的には思いますね。