これだけ読めば全部わかる、Google Apps Scriptライブラリの使い方

# 1. はじめに

本記事では、Google Apps Script(GAS)のライブラリの使い方を詳しく解説しています。

```
💡 この記事で得られる知識
・ Google Apps Scriptのランタイムについて
・ ライブラリの使い方
```

Google Apps Scriptでは作成したスクリプトをライブラリとして一般公開することができます。
もちろん組織内や特定ユーザーに限定することも可能です。
また、公開されているライブラリを自身のスクリプトで利用することもできます。

次よりライブラリの使い方を解説していきます。

# 2. 注意事項
ライブラリを使う際、作る際に共通する注意事項です。
必ず事前に目を通して留意してください。

## 2.1 ランタイムのバージョンとJavaScript仕様
Google Apps Scriptには「ランタイム」というスクリプトを実行するためのエンジンがあります。

Google Apps Scriptは元々「Rhino」と呼ばれるランタイムで動作していました。
その後の2020年2月に「V8」と呼ばれる新しいバージョンのランタイムが公開されました。
これに伴い、執筆時点では**新規にスクリプトを作成する場合はV8ランタイムがデフォルトで有効**になっています。

Google Apps ScriptはJavaScriptベースのスクリプト言語ですが、
ランタイムによって実装できるJavaScriptの仕様が異なります。

表1. Google Apps Scriptランタイムの歴史年表

| リリース日 | ランタイム | JavaScript仕様 |
| --- | --- | --- |
| 2009年08月19日 | [Rhino](https://ja.wikipedia.org/wiki/Rhino) | [ES5](https://www.w3schools.com/whatis/whatis_es5.asp) |
| 2020年02月06日 | [V8](https://ja.wikipedia.org/wiki/V8_(JavaScript%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)) | [ECMAScript](https://en.wikipedia.org/wiki/ECMAScript) |

RhinoランタイムとV８ランタイムでの構文や実装の違いは以下の記事を参照ください。

[Migrating scripts to the V8 runtime  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/v8-runtime/migration)
[Google Apps ScriptのV8 Runtime対応を検証してみた - Officeの社](https://officeforest.org/wp/2020/02/06/google-apps-script%E3%81%AEv8-runtime%E5%AF%BE%E5%BF%9C%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)

このランタイムのバージョンに違いがあることによる注意事項です。
作成しているスクリプトと、使用しているライブラリとで、有効なランタイムと実装されているJavaScript仕様が異なる場合、スクリプトが動作しないケースが存在します。

表2. 有効なランタイムとJavaScript仕様の差異と実行可否

| ランタイム | スクリプト | ライブラリ | 実行可否 |
| --- | --- | --- | --- |
| Rhino | ES5 | ES5 | ✅ |
| Rhino | ES5 | ECMAScript | ❌ |
| Rhino | ECMAScript | ES5 | ❌ |
| Rhino | ECMAScript | ECMAScript | ❌ |
| V8 | ES5 | ES5 | ✅ |
| V8 | ES5 | ECMAScript | ✅ |
| V8 | ECMAScript | ES5 | ✅ |
| V8 | ECMAScript | ECMAScript | ✅ |

---

表2の通り、**ECMAScript構文はV8ランタイムでしか動作しません。逆に下位互換性があるため、ES5構文はV8ランタイムでも動作します。**

例えば、以下の「let」はECMAScriptに対応した構文であるため、Rhinoでは動作しません。

```javascript:Rhinoで動作しない例
funtion myFunction() {
  let foo = 'var' // letは対応していないためエラー
}
```

上記のコードは保存する際に以下のようなエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/aa4ea6c9-6b88-6bb1-9d65-54523729a30f.png)

このように、ライブラリがECMAScriptに準拠した実装となっている場合、V8ランタイムが無効(=Rhinoランタイムが有効)な状態ではライブラリ内のスクリプトでエラーになります。

執筆時点では未だRhinoランタイムは有効ですので、以下の点に注意してください。

- 使う：ライブラリがどちらの仕様に準拠しているのか
- 作る：どちらの仕様に準拠させてライブラリを実装するのか（公開する際には明記しておくと良いでしょう）

# 3. ライブラリの使い方
ここからは外部から自身のスクリプトへライブラリを取り込む方法について説明します。
ライブラリは、スクリプトエディタからスクリプトIDを指定して取り込むことができます。

以下より詳しく解説していきます。

## 3-1. ライブラリを取り込む

スクリプトエディタでライブラリを使用するには以下の手順に従ってライブラリを追加します。　

1) メニュー > 「リソース」 > 「ライブラリ」 を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/4942e2d0-50ae-c989-55b3-5db0c773a7cb.png)
2) スクリプトのIDを入力してライブラリを追加する
「Add a library」の欄にスクリプトのIDを入力し、「追加」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/0493133b-1df0-2519-e925-324b249d7df4.png)

📝 スクリプトIDとは
---
このスクリプトIDについてですが、Googleドライブ上のファイルにはユニークなIDが付与されています。
スクリプトファイルはGoogleドライブ上に作成しますが、スクリプトエディタで開くと以下のようなURLが表示されます。

```
https://script.google.com/a/{ドメイン}/d/{スクリプトID}/
```

また、これはスクリプトエディタのメニュー > 「ファイル」 > 「プロジェクトのプロパティ」からも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/138285dd-92dc-2f82-c160-fb250ebd84b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/5f3ec680-874b-591e-d789-e85516917502.png)

つまり、**ライブラリを公開する際にはスクリプトに採番されているスクリプトIDが共有・公開され、そのスクリプトIDを使ってライブラリとして取り込む**ということです。

尚、「プロジェクトキー」もライブラリとして取り込む際に指定できますが、執筆時点では非推奨となっています。
スクリプトIDを使用するようにした方が無難そうです。
※ 新IDEではスクリプトIDのみ対応となりました


3) ライブラリのバージョンを選択して保存する
ライブラリの使用するバージョンを選択して「保存」を押下します。バージョンによって使える機能や不具合の解消状況などが異なりますので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/b94ce98d-3111-c643-8780-bcb0b6dc2759.png)

📝 APIドキュメント
---
ライブラリのタイトルを押下するとAPIドキュメントが表示されます。ライブラリのAPIについて参考にすると良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/3c8b05ca-b81e-bac6-2a2e-0932a4309085.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/1cd39298-c2ab-aebc-00a2-b7a75bc69687.png)

📝 Identifier
---
スクリプト内で使用する際の任意の識別子です。パッケージ名のようなものです。
Google Apps Scriptが標準で提供している「DriveApp」や「SpreadsheetApp」などに相当するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/0230a361-1350-3544-92bc-a84722882e14.png)
例えばIdentifierを「TeamDriveLibrary」とした場合は、「識別子.関数名」のようにして利用できます。

```javascript
let teamDrive1 = TeamDriveLibrary.create('共有ドライブ1')
```

📝 Development mode
---
主に開発版として使用する場合に便利なモードです。
ONにすると、バージョンを指定する必要がなく、常に最新バージョンのライブラリが自動で参照されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/cff06cda-8aa3-a128-f504-a951e9d2a781.png)

## 3-2. ライブラリを実装に組み込む

取り込みが完了したらライブラリを実装に組み込むことができるようになります。
**識別子(Identifier)を用いてライブラリの機能を利用**しましょう。

折角ですので、Google Apps Scriptで利用できる便利なライブラリを紹介しつつ説明します。
ここで紹介するライブラリ以外にも様々なライブラリが公開されています。

参考）こちらの記事にたくさん紹介されていますのでリンクを掲載させていただきます
[GASのおすすめライブラリ18選！使い方やインポート手順についても解説！ | monoblog](https://monoblog.jp/archives/6019)

📝 「Moment.js」ライブラリ
---
日付計算を容易にするライブラリです。
JavaScriptで日付を扱う場合には「Date」を使うのが一般的ではありますが、日付の書式設定や加減算をしたい場合などはやや煩雑です。
Moment.jsはDateをラッピングして、より簡便でスッキリとしたコードを書くことができます。

スクリプトID: 15hgNOjKHUG4UtyZl9clqBbl23sDvWMS8pfDJOyIapZk5RBqwL3i-rlCo

ライブラリを使用しない場合と、使用した場合のコードを比較してみましょう。
識別子を「moment」とした場合の例です。

```javascript:Dateでの処理
// 1年半後を取得
var dt = new Date()
dt.setMonth(dt.getMonth() + 18)

// YYYY/MM/DDで出力
var ymd = dt.getFullYear() + '/' + (('0' + (dt.getMonth() + 1)).slice(-2)) + '/' + (('0' + dt.getDate()).slice(-2))
console.log(ymd)
```

```javascript:Moment.jsでの処理
// 1年半後を取得
var dt = moment().add(18, 'months')

// 1年半後をYYYY/MM/DDで出力
var ymd = dt.format("YYYY/MM/DD")
console.log(ymd)
```

# おわりに

何度も同じコードを実装するのはトータルコストが上がりやすい傾向にありますので、ライブラリの活用をオススメします。

有名なライブラリのスクリプトIDは以下の記事にまとめました。合わせてご覧ください。
https://qiita.com/shikumiya_hata/items/a9f03f94ad1dc27b2f57

読んでいただいて、ありがとうございました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/94fd031b-0c09-4f37-116f-c05271fdd7f9.png" width="200">
弊社は業務効率化・自動化など、仕組みで解決するお手伝いをさせていただいております。
お仕事のご依頼はコチラ↓までお願いいたします。

[株式会社シクミヤ](https://shikumiya.co.jp/)
note: [Visionary Base編集部](https://note.com/visionarybase)
Twitter: @shikumiya_hata