gapps + git で Google Apps Script をローカルで開発してバージョン管理する

[gapps（node-google-apps-script）](https://github.com/danthareja/node-google-apps-script)を利用して Google Apps Script をローカルで開発する方法のメモです。好みのエディタで開発できるようになることに加え，ローカルのプロジェクトディレクトリを Git で管理することによりバージョン管理ができるようになります。


## gapps の導入

### Node.js をインストール

[gapps](https://github.com/danthareja/node-google-apps-script) には [Node.js](https://nodejs.org/ja/) v0.12.x 以降が必要とのことです。公式サイトのインストーラーを使ってもいいですが，Windows では [Chocolatey](https://chocolatey.org/packages/nodejs.install) でもインストールできます。

```ps1
PS> choco install nodejs.install
```

### node-google-apps-script をインストール

`npm` で `node-google-apps-script` をインストールします。これで `gapps` コマンドが使えるようになります。

```shell-session
$ npm install -g node-google-apps-script
$ gapps --version
1.1.15
```

## Google Drive Credentials の取得

Google Drive API を有効にして，OAuth 2.0 クライアント ID を取得して認証します。[README](https://github.com/danthareja/node-google-apps-script#1-get-google-drive-credentials) には 2 通りの方法が書かれていますが，要は [Google Developers Console](https://console.developers.google.com) に適当なプロジェクトを用意して，そのプロジェクトで設定を行えばよいということのようです。


### Cloud Platform プロジェクト

[Google Developers Console](https://console.developers.google.com) で新規プロジェクトを作成するか，Google Apps Script に関連づけられたプロジェクトを開きます。

Google Apps Script に関連づけられたプロジェクトを開くには，メニューから［リソース］→［Cloud Platform プロジェクト...］を開き，表示されたダイアログの［API コンソールを表示］ボタンをクリックします。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/11255/d9916da5-7f95-32cd-58fc-317f96ed7538.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/11255/4d893e2d-7289-a772-180b-b1e6115135b0.png)


### Google Drive API を有効にする

左上のハンバーガーメニューから［API とサービス］→［ライブラリ］を開き，［G Suite］のカテゴリにある［Google Drive API］を選択して［有効にする］ボタンをクリックします。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/11255/22e8f1e3-eeb6-6aa2-d80a-3318d375ea9c.png)

![004.png](https://qiita-image-store.s3.amazonaws.com/0/11255/6ad3922f-9246-a5c3-1a2f-8602b306df0e.png)

![005.png](https://qiita-image-store.s3.amazonaws.com/0/11255/4b4b59ba-5be2-c067-f710-18ec1e13bc9b.png)


### OAuth 2.0 クライアント ID を作成する

左上のハンバーガーメニューから［API とサービス］→［認証情報］を開き，［認証情報］タブの［認証情報を作成］ボタンをクリックして，［OAuth クライアント ID］を選択します。

![006.png](https://qiita-image-store.s3.amazonaws.com/0/11255/0ee6907d-1b43-8950-be99-7841f6afdbf1.png)

![007.png](https://qiita-image-store.s3.amazonaws.com/0/11255/c208be4d-58e5-84bb-312b-475050845028.png)

［アプリケーションの種類］は［その他］を選び，名前を適当に入力して［作成］ボタンをクリックします。

![008.png](https://qiita-image-store.s3.amazonaws.com/0/11255/62d7ccf4-4ed1-2321-3b85-ba1876130251.png)


## gapps の認証

### シークレットをダウンロードする

OAuth 2.0 クライアント ID の一覧で右側のダウンロードアイコンをクリックし，JSON ファイルとして保存します。

![009.png](https://qiita-image-store.s3.amazonaws.com/0/11255/fc4c0ded-728c-5a25-d3ba-d9af33c91581.png)

ファイル名は `client_secret_xxxxxxxx.apps.googleusercontent.com.json` のようになっています。


### gapps で認証コマンドを実行する

コマンドを実行すると，認証用の URL が表示されます。

```shell-session
$ gapps auth /path/to/credential.json

Please visit the following url in your browser (you'll only have to do this once): ...
```

ブラウザでアクセスして許可を与えると，以下のようなメッセージが表示されます。

```
You've been authenticated with Google Drive! You may close this page.
```

Mac や Linux では `$HOME` を，Windows では `%USERPROFILE%` を確認して `.gapps` ファイルが出来ていれば認証完了です。どうやら Windows 環境では `%HOME%` 環境変数を設定していても参照してくれないようです。


## ローカルで開発する流れ

### スクリプトのファイル ID をコピー

ローカルで開発したいスクリプトを Google Drive で開き，URL に含まれているファイル ID をコピーします。以下の `xxxxxxxx` の部分です。

```
https://script.google.com/d/xxxxxxxx/edit
```

### ダウンロード

プロジェクトを管理するディレクトリへ移動し，先ほどコピーしたファイル ID を引数に渡して `gapps init` を実行します。

```shell-session
$ cd /path/to/project
$ gapps init xxxxxxxx
```

`gapps.config.json` という設定ファイルと `src` ディレクトリが作成されます。

```shell-session
$ tree
.
├── gapps.config.json
└── src
    └── コード.js

1 directory, 2 files
```

`gapps.config.json` にはソースが格納されているディレクトリとファイル ID が保存されています。ファイル ID が含まれているので，プロジェクトを Git で管理する場合は `.gitignore` に追加しておいた方がよさそうです。

なお，Git で管理する場合，新しい PC でクローンした後は，このファイルをコピーしてくれば `gapps init` を実行しなくても Google Drive へのアップロードができるようになります（もちろん gapps の導入と認証は必要ですが）。

```shell-session
$ cat gapps.config.json
{
  "path": "src",
  "fileId": "xxxxxxxx"
}
```

### アップロード

ローカルでの変更を Google Drive に反映させるには `gapps upload` を実行します。

```shell-session
$ gapps upload
Pushing back up to Google Drive...
The latest files were successfully uploaded to your Apps Script project.
```

## Git でバージョン管理

ローカルリポジトリを初期化して，リモートリポジトリを追加します。

```shell-session
$ cd /path/to/project
$ git init
$ git remote add origin git@github.com:username/project.git
```

`gapps.config.json` にはファイル ID が含まれているので `.gitignore` に追加しておきます。

```shell-session
$ echo gapps.config.json > .gitignore
```

あとは普通に開発するだけです。

```shell-session
$ git add .
$ git commit -m "Initial commit"
$ git push origin master
```

2 台目以降で開発する場合は，まず gapps の導入と認証を済ませます。その後は，上記と同じ手順（`gapps init` → `git init` → `git remote add`）を繰り返してもよいですし，あるいは単にクローン後に `gapps.config.json` をコピーしてくるだけでも大丈夫なようです。


## 参考

* [danthareja/node\-google\-apps\-script: The easiest way to develop Google Apps Script projects](https://github.com/danthareja/node-google-apps-script)
* [GoogleAppsScriptローカル開発用の公式CLI\(node\-google\-apps\-script\)がついに登場したので試してみる \- Qiita](http://qiita.com/zaki-yama/items/9a301542137febd8876c)
* [Google Apps Scriptをローカルで開発する \- Qiita](http://qiita.com/ttyokoyama/items/a4edfdcfcad56d664522)
* [gapps を使って Google Apps Script を継続的にデプロイする \- kakakakakku blog](http://kakakakakku.hatenablog.com/entry/2017/02/26/034115)