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

Code

はじまり

リサちゃん
リサちゃん

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

135ml
135ml

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

リサちゃん
リサちゃん

使ってますね。やっぱりそれだとダメ?

135ml
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
135ml

自分が過去に書いた処理をもう一度別のGASライブラリに書き写すのは面倒だよねえ。

なので、今回の方法で、classにしてた処理も呼び出せるようになりました!

135ml
135ml

また、今回の方法は、この記事がものすごい参考になったので、良ければこちらも見てみていただければと思います。

GASのライブラリでクラス化と補完 - Qiita
今回はGASのライブラリでクラス化を補完について書きます。GASでライブラリをクラス化と補完の問題GASのライブラリは補完が有効になるため、開発をラクにする為にも、ライブラリをとりあえず作るシ…

以上になります!

コメント

  1. JUN より:

    参考にさせていただいています。

    GASで独自クラスを作ってライブラリ化した場合、呼び出し側でドキュメンテーションコメントが表示されません。

    表示したいならクラスにせず、関数をそのままライブラリ化した方がいい、という認識で合っているでしょうか。

    • kinkinbeer135ml より:

      返信が遅れてすみません。
      ドキュメンテーションコメントが表示されないというのは、createExecutor()の後にplusOne()が候補に出てこない点でしょうか?
      だとすると確かに、「createExecutor().」では出てこず、「plusOne(」で初めて定義が表示されるので、困りますね・・・。

      すみません、対処法が見い出せていません。
      本記事はこういう書き方もあるんだという紹介でした。
      JavaScriptで作るとなると、関数を使って返した方が書きやすい気が個人的には思いますね。

タイトルとURLをコピーしました