概要
GoogleAppsScriptのスクリプトエディタでコードを書いたときに、ファイル分割してコード管理したくなった際に、定義した関数をスクリプトエディタで使えるようにするための手順を試行錯誤したのでまとめてみます。
要するに以下のように2つ以上の.gsファイルを作って、それぞれロードして定義した関数を使えるようにしたいということです。
発生した問題
他の記事で、定義した関数をそのまま利用すれば良いだけとあったので、スクリプトエディタでmain.gsを実行(main.gsは内部でparser.gsで定義した関数を利用しています)。
実行開始後、処理が全く終わらず。デバッグすると、別ファイル(parser.gs)に定義済みのはずの関数で処理が止まっていた。
試したこと
トリガーから実行する
- 実行をスクリプトエディタ上で行っていたのを、トリガーを作成してSpreadSheet起動時にスクリプトが動作するように設定したところ、正常に別ファイル定義の関数も読み込まれた。
- SpreadSheetからだと関連付けてあるプロジェクトの全てのスクリプトが読み込まれる(?)様子。
プロジェクト自体をライブラリとして利用する
自分のプロジェクトをライブラリとして定義し、自分のプロジェクトに関連付けることでプロジェクト全体のロードがスクリプトエディタで書いたコード実行前に読み込まれる様子
- メニューの ファイル>版を管理 から「新しいバージョンを保存」でバージョン番号を発行しておく(ライブラリ追加の際に必要なため)
- メニューの ファイル>プロジェクトのプロパティ から「情報」タブの「プロジェクトキー」を取得します
- メニューの リソース>ライブラリ... から「ライブラリを追加」テキストボックスに先ほど取得したプロジェクトキーを入れて保存します
- このとき、以下のようにライブラリが追加されますので、事前に発行したバージョン番号をプルダウンで選択して保存します
以上でmainファイルから別ファイルに記述した関数を呼び出せるようになります。
ライブラリとして正しく利用する意味では、汎用的な処理を分割して別プロジェクトにしてしまい、本来の意味でのライブラリとして共通で利用するのが良いように思いました。
基本Googleの各種サービスとプロジェクトを紐付けて使うものなのでこのような仕様なのでしょうが、もっと簡単にできる方法あったらぜひ教えてください...。
余談ですが jsの alert() にあたる Browser.msgBox もSpreadSheet側からでないと処理が止まって動きませんでした(当然と言えば当然ですが...)
とは言えGASは便利なので、もう少しちゃんと調べてUPDATEしていきたいと思います。
参考
https://qiita.com/shirakiya/items/5e51e352faef6f7db9be
https://itami.info/tech/memorandum/googleappsscriptincludfunctions.html