はじまり
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_001-1.png)
ぐああ・・・、せっかくライブラリ化したのに、外部のGASから呼び出せないよお・・・
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
おお、そのライブラリ化した処理って、classとか使ってないかね?
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_001-1.png)
使ってますね。やっぱりそれだとダメ?
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
うむ、今回はファクトリメソッドを使って、classで書いていた処理を外部ライブラリから呼び出せるようにします!
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_001-1.png)
教えてくれ〜!
ここをこう書き換える。
まず、こんな風に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);
おしまい
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_001-1.png)
おお、これでGASライブラリを呼び出せるねえ!
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
自分が過去に書いた処理をもう一度別のGASライブラリに書き写すのは面倒だよねえ。
なので、今回の方法で、classにしてた処理も呼び出せるようになりました!
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
また、今回の方法は、この記事がものすごい参考になったので、良ければこちらも見てみていただければと思います。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9R0FTJUUzJTgxJUFFJUUzJTgzJUE5JUUzJTgyJUE0JUUzJTgzJTk2JUUzJTgzJUE5JUUzJTgzJUFBJUUzJTgxJUE3JUUzJTgyJUFGJUUzJTgzJUE5JUUzJTgyJUI5JUU1JThDJTk2JUUzJTgxJUE4JUU4JUEzJTlDJUU1JUFFJThDJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz04NTNhOTBlYzI5M2NhODQwZTM5MzRlNGIzZDRmMTE3OQ&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBzb3VuZFRyaWNrZXImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTgzZDI3OTE1Nzk4ZTExMGNkNjdkNWY5YmQzYzNhOTFj&blend-x=142&blend-y=486&blend-mode=normal&s=f9512db3c42f6c9a1bcb48f23024e7b5)
以上になります!
コメント