Google Apps Scriptで開発をしていると、だんだん似たようなコードや同じ仕組みを同じプロジェクトに何度も書く事が出てきます。しかし、そのままでは他のプロジェクトで使い回しをしたり、コードを簡潔に書くにはちょっと不都合です。また、1つのスプレッドシートに複数のプロジェクトファイルを追加した場合、プロジェクトプロパティなどはそのプロジェクト内のものしか参照出来ないので、複数のプロジェクトで参照させたい場合、これでは困った事になります。

そこで活用したいのが、ライブラリ機能。なるべくなるべく小さな関数や決まった処理をするルーチンはライブラリにまとめて、足りない部分だけをコードで記述するようにすると、開発がとっても早くなります。但し、公式サイトにも掲載されていますが、ライブラリは使用するとプログラムの実行速度は遅くなりますので、注意が必要です。5分の壁問題が生じる場合には、あえて使わない事も考慮すべきでしょう。

今回使用するスプレッドシート

プロジェクトキー:1whd-93s6r6-wxmMfRdaPLPOfyQMPh8kutBVa9R3Zb-OfdACjA-njTRlQ

ライブラリの作り方

コードを記述する

様々な処理を行う関数をまずプロジェクト内に記述しましょう。この時、他のプログラムから呼び出される事を意識してコードは書かなければなりません。あくまでも別々のプロジェクトなので、スプレッドシート操作などでgetActiveSpreadsheetなど使っても、ライブラリ側からはアクティブなスプレッドシートがどれなのかわかりませんから。

また、変わった使い方としては、ライブラリ側によく使うCSSやJavaScriptの塊をhtmlファイルとして用意しておき、HTML ServiceのgetContent()で取得し返して上げる。ライブラリ呼び出し側は、HtmlService.createTemplateFromFileにて表示したウェブアプリのコード内に、スクリプトレットとしてライブラリ側のCSSを呼び出してあげると、cssやjavascriptを使いまわしする事が出来るようになります。

スクリプトプロパティを共用してみた

ワークフローな仕組みを作る時に、例えば読み書きするスプレッドシートのIDなどや送信先メアドなどをプロパティサービスを使って保存し、プログラムで利用することがあります。しかし、申請用フォームと承認用フォームで共用の2つで共用したくとも、スクリプトプロパティはそのプロジェクト内しか参照できません。

そこでライブラリ機能を使って1箇所で読み書き出来るようにして使ってたりします。この場合そのスプレッドシートには申請用、承認用に加えてスクリプトプロパティ用の3つ目のプロジェクトを追加しておく必要があります。この3つ目がライブラリとなります。

読み書きコード

呼び出し側は、例えばlibrary.getPropでプロパティを取得します。library.setPropでプロパティを保存します。呼び出し側でPropertiesServiceをいちいち記述する必要もないので楽ちんです。共通設定用のプロジェクトとしてこれを版保存し呼び出し側のライブラリに追加してあげましょう。

CSSをライブラリとしてみた

GASのコード

css.htmlのコード

引数にcssnameを取っています。cssnameで使うcssファイルを切り替えられます。

呼び出し側コード

GAS側のコード

HTML側のコード

サンプルページ

注意事項

ライブラリを記述する時に注意しなければならないポイントがいくつかあります。

  1. もし同じプロジェクト内に同じ関数やクラスなどがある場合、オーバーライドされてしまいます。
  2. ライブラリ内でだけ使ってるプライベートな関数は、参照させたくないので、関数名の後にアンダーバー(_)を入力する。例えば、getkinoko()という関数ならば、getkinoko_()でプライベート関数になります。
  3. ライブラリへのアクセス権限がなければ、ライブラリを追加しても使えません。必ずそのライブラリが属するドキュメントに公開権限を付けるようにしましょう。
  4. ライブラリは最低でも1個は版として保存しなければ使えないので、必ず版を保存しましょう。また、版として保存しないと、反映もされないので、記述したのに出てこない時には注意。
  5. ライブラリを呼び出す側も版(バージョン)指定によって使える関数などが変わってくるので注意が必要です。提供する側も古い版は捨てるようにしましょう。
  6. ライブラリの関数をGoogleスプレッドシート上では直接呼び出せません。スプレッドシートのプロジェクト上で呼び出す関数を用意してあげましょう。

JSDocを記述しておく

JSDocとは、関数を記述する時に関数のリストや候補として出て来る文字列を用意しておくもので、利用者がどんな関数なのか?入力中にわかるようにしておく為のリストです。独特の記述方法があります。この記述を関数の前に記述しておく事で、その関数の使い方や引数の取り方などがわかるようになり、また、JSDocを記述することでライブラリのリファレンスも自動的に作成されます。

例えばとある関数のJSDocとしては以下のように記述してあります。

この関数を入力しようとするとオートコンプリートの候補として以下のように表示されます。

図:addUserの入力候補が出てきました

公開する

公開する時に必要なのは、スクリプトIDです。以前はプロジェクトキーを使っていたのですが現在は推奨されていません。公開するにはまずは現在の版を保存します。保存手順は以下のとおりです。

  1. スクリプトエディタに於いてメニューより「ファイル」⇒「版を管理」をクリック
  2. テキストボックスにバージョンの説明文を入れて、「新しいバージョンを保存」をクリック
  3. 改めてメニューより「ファイル」⇒「プロジェクトのプロパティ」をクリック
  4. 情報タブの中にある「スクリプトID」の文字列をコピー
  5. スクリプトIDを使ってもらいたい人に教える

図:スクリプトIDが重要なのです

ライブラリの使い方

自分が作成したライブラリや他人が公開されてるライブラリは、公開されてるプロジェクトキーやスクリプトIDを追加する事で可能になります。尚現在、プロジェクトキーは使用は推奨されていませんので、公開する時はスクリプトIDを公開するようにしましょう。

さてこのキーやIDを追加し使えるようにしましょう。以下の手順で追加します。

追加手順

  1. スクリプトエディタのメニューより「リソース」⇒「ライブラリ」を開きます。
  2. ライブラリを追加のテキストボックスにプロジェクトキーやスクリプトIDを入れて、追加ボタンを押す
  3. ライブラリ一覧に追加されます。公開バージョンを選び、識別子を設定します。
  4. 識別子は関数を使う時に頭に付けるもので、ドット区切りでそのライブラリの関数を呼ぶので、例えばmomentと付けると、moment.hogehogeといった形でhogehoge関数呼び出します。日本語は使えません。
  5. 保存を押すと使えるようになります。

図:ライブラリ追加画面

ライブラリの関数を使う

追加すると、識別子にドットを付ければ、ライブラリの関数を呼び出す事が可能になります。自分のプロジェクトに作った関数と同じように使えるようになります。例えば、moment.jsを取り込み、識別子にmomentと指定した事例として

例えばある日付データがある日付データの属してる週と同じかどうかを検証する場合には

この時変数hanteiに、同じ週ならば、trueが入ります。違う週ならばfalseが入ります。識別子は大文字小文字区別するので注意して下さい。

公開してるライブラリ

Moment.js

もともとはJavaScriptで日付関係の処理をより簡単に扱う為に作られたMoment.jsをGoogle Apps Scriptでも使えるようにリファインしたライブラリ。自分でも簡単に用意出来るので、自分でソースコードをまるごとコピペして、ライブラリ化しても良いでしょう。公式リファレンスを見ながらそのまま使えます。

プロジェクトキー:MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48

Underscore.js

もともとはJavaScriptで配列やオブジェクト、各種関数などをもっと便利に使えるようにと用意されてるUnderscore.jsをGoogle Apps Scriptでも使えるようにしたライブラリです。Githubにてメンテナンスされています。100種類にもおよぶ数々の関数を使えるようになります。

プロジェクトキー:M3i7wmUA_5n0NSEaa6NnNqOBao7QLBR4j

HTML/XML Parser for Google Apps Script

Google Apps ScriptにてHTMLのスクレイピングやXMLファイルのパースを簡単に行えるようにと作られたライブラリで、Githubにてメンテナンスされています。使い方の説明は製作者のページに記載されています。

プロジェクトキー:1Jrnqmfa6dNvBTzIgTeilzdo6zk0aUUhcXwLlQEbtkhaRR-fi5eAf4tBJ

BetterLog

Google Apps ScriptはLogger.logにて各種ログを取得することができますが、ちょっと使いにくい。再度スクリプトを実行すると前のログは消えてしまいますし。そこでこのlogをスプレッドシートに書き出してくれるライブラリがこのライブラリ。Githubにてメンテナンスされています。

プロジェクトキー:MYB7yzedMbnJaMKECt6Sm7FLDhaBgl_dE

ChatWorkClient for GAS

チャットサービスである「ChatWork」のAPIをGoogle Apps Scriptから扱えるようにする為のライブラリです。公式サイトでメンテナンスされています。Google Apps Scriptからチャットを投げる事が可能になったりします。

プロジェクトキー:M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT

SlackApp for Google Apps Script

ビジネス向けとしてプッシュしてるチャットサービス「Slack」にGoogle Apps Scriptから投稿できるようにしてくれるライブラリです。作者のサイトでメンテナンスされています。ITのスタートアップ企業などでよくみかけますね。

プロジェクトキー:M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO

OAuth2 library for Google Apps Script

Google Apps Scriptにて外部のサービス認証で用いられてるOAuth2認証を手軽に出来るようにする為のライブラリです。これを用いることで、例えばFacebookなどのサービスにOAuth2認証して連携などが出来るようになります。Githubにてメンテナンスされています。各種サンプルも用意されているので、おすすめです。

プロジェクトキー:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

Google Service Account Library for Apps Script

Googleのプロジェクトに於いてサービスアカウントを容易に扱えるようにするためのライブラリです。Githubにてメンテナンスされています。あまり一般の人は使うことがないかもしれませんが、Google開発者としては利用する価値があるかもしれませんよ。

プロジェクトキー:MJ5317VIFJyKpi9HCkXOfS0MLm9v2IJHf

CryptoJS libraries for Google Apps Script

JavaScriptで用いられてる文字や画像類などをAES暗号化する為のライブラリです。こちらのサイトで詳細を見ることが出来ます。ソースコードはこちらから閲覧できます。

プロジェクトキー:MSJnPeIon6nzdLewGV60xWqi_d-phDA33

spreadsheets-sql

Googleスプレッドシート上のデータを更新や変更、削除をするのは結構手間が掛かります。この更新作業をSQLっぽい感じのコードで手軽に扱えるようにしてくれるライブラリです。Githubにてメンテナンスされています。公式サイトでドキュメントを見ることが可能です。

プロジェクトキー:MAoZrMsylZMiNUMljU4QtRHEMpGMKinCk

NCMB for Google Apps Script

Niftyが提供してるスマフォ向けのモバイルバックエンドサービスであるmBaaSをGoogle Apps Scriptから操作出来るようにしてくれるライブラリです。プッシュ通知に代表されるAPIが使えるのはとても便利ですね。公式サイトでメンテナンスされています。

プロジェクトキー:1yWnb7GfYsBCR-MZvi6r-TOYv_y-AV4le5P7kaG5B3iZ5VNnSk9Q55pSJ

関連リンク