「GASで自作ライブラリを読み込む」に関しての考えをまとめました。

目次

GASはLINEbotの作成であったり、cronのように定期的にslackに通知するときに便利だ。ただ、コードが複雑になるにつれて、コードが肥大化したり共通ロジックなどをファイル単位で分けて管理したくなる。

通常ディレクトリやnamespaceで分けるのだが、あいにくGASにはそのような機能がない。その代わりとして自分だけが使用できるライブラリとして別ファイルに切り出すことができるようだ。

function myFunction() {
  console.log("Common:myFunction")
}

function myClass() {
  console.log("Common: myClass")
}

this.name = 'Common: name'

class Example {
  echo()
  {
    console.log("Common: class Example echo")
  }
}

ライブラリとして使用する

1.プロジェクトの設定からスクリプトIDを取得

ID

ID は、Apps Script プロジェクトの一意の識別子です。

スクリプト ID

3wrsdffhthtjyu-dsssssss-LOkeo

これをコピーしておく

2.新規アプリケーションの「ライブラリ」を選択する

検索ボックスに「1」で取得した値を入力して、検索する。

該当するファイルが出力されるので、それを選択する。このとき自分のアプリで使用するライブラリの呼び出し名を変更することができる。しかし理由がない限りは別ファイルの名前と同じでもよいだろう。

ライブラリとして使用できるようになる

※これはIDを知りえてしまうと任意の人が利用できるのか?公開範囲を指定できるか?

閲覧・利用権限はデフォルトで自分のみになっているようだ。

https://belltree.life/google-apps-script-library-publish/

3. 関数名を呼び出す

function myFunction() {
  Common.myFunction()
  console.log(Common.name)
}

ただ、ライブラリのクラスは呼び出すことはできない

function myFunction() {
  Common.Example.echo() //エラー
}

クラスの呼び出し方についてまとめる

ライブラリのクラスを呼び出す。

ライブラリではクラスを呼び出すことはできない。これはスコープによる定義のようだ。functionや、this.<***>などで定義されているものは、グローバルなスコープとなっている。いわゆる、`public`である。

一方で、classの定義などにおいては、ローカルなスコープとなっている。いわゆるprivateである。

そのため、クラスを使用するためにはスコープを変更するように次のような関数を作る

function factoryExampleClass(constructor)
{
  return new Example(constructor)
}

これで次のように呼び出すことができる。

function myFunction() {
  const example = Common.factoryExample()
  example.echo()
}

ただ、GASの場合は、ライブラリとして使うなら、ライブラリとして作成したファイル自体が一つのクラスのようなものとして利用されているため、わざわざ外部呼出しできるクラスを作る理由はないかなと思う。

https://qiita.com/shikumiya_hata/items/0aed6d0c67ee365d9161

まとめ

GASのライブラリを使って階層管理しよう。

てか、今まで日付を扱うようなDate関数をすべてのアプリに使いまわしていたの手間すぎたな・・・。