Google Apps Scriptをローカルで開発するための環境整備やることまとめ

この記事の趣旨
=============================
- Google Apps Scriptをローカルでの開発が最近になってできることは[Google Apps Developer Blog](http://googleappsdeveloper.blogspot.jp/2015/12/advanced-development-process-with-apps.html)を見つけて以来知っていたのですが、ようやく時間があったので実際にやったことをまとめます。
- 参考記事には一般的な環境整備のしかたが簡潔に書かれているのでこの記事では自分自身がはまるなぁとおもったことを主に書きます。

始める前に理解が必要なこと
==========================
- Standalone scriptでないとローカルでの開発環境構築ができない
  - Standalone scriptとはその他Google Appsに紐付いていないスクリプトのことです。
  - これと対になっているscriptのことをBound scriptと呼び、これはドキュメントやSpreadsheetに紐付いているscriptのことです。
  - Standalone scriptではBound Scriptでは使えるgetActiveSpreadsheetなど幾つかの関数は使えません。
  - 制限等は[GoogleのStandaloneの公式ドキュメント](https://developers.google.com/apps-script/guides/standalone)を見ておくと良いです。Bound Scriptも[ドキュメント](https://developers.google.com/apps-script/guides/bound)を見ておくことをおすすめします。
  - チームで開発等していてStandaloneかどうかわからない場合は主に以下の2つのやり方で確認できます。
      1. URLを見て https://script.google.com/d/hogehoge/edit?splash=yes のように/d/の後にスクリプトID（ここではhogehoge）となっているものはStandaloneです。逆にBound scriptは `/d/macros/hogehoge` のようにmacrosというpathがついています。
      2. [Google Drive画面](https://drive.google.com/)でドライブを検索してみてスクリプトが見つけられるかどうか。検索にでてくるものはStandaloneスクリプトです。

- Standalone scriptをBound scriptから参照する際にはLibraryとしておかないといけない
  - 独立したモジュールとして利用することになるのでstandalone scriptに版をつくります。この手順については以下の手順10で説明します。
 
手順
===============
上記が理解できれば後は作業するだけです。

1. まず、npmパッケージマネージャをつかってnode-google-apps-scriptをローカルマシーンにインストール  
  - `npm install -g node-google-apps-script`
2. Standalone scriptを作るには https://script.google.com からスクリプトの作成が一番手っ取り早いです。この画面に沿ってscriptファイルを作成します。
3. scriptファイルを作ったら、以下のようにリソースタブ内で「Developer Console プロジェクト」を選択。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/32427/170f0c19-51c6-a455-e16d-93e5b2911c15.png)
4. 上の画像のように「このスクリプトが現在関連付けられているプロジェクト」(This script is currently associated with project)内に表示されているリンク)をクリックするとAPI Manager Console画面が開きます 
5. ダッシュボード画面が開いたはずです。この中で、左側の API & Services を選択し、Credintialsをさらに選択すると、client IDを設定することができます。OAuth client IDを選び、OAuth client ID->「その他(もしくはothers)」を選択してIDを発行します。（すでに一回やっている場合はothersにあるIDをダウンロードするだけです）
6.  作成したOAuth 2.0 クライアントのjsonファイルをダウンロードします。
7. ダウンロードしたjsonファイルには認証情報が書かれているのでこの情報を使ってローカルマシーンを以下のコマンドで認証
  - `gapps auth <jsonファイル>`
8. これでローカルマシーンからGASへのプッシュができる状態になったはずです。GASにプッシュできるかどうかは以下のコマンドで確認してみてください。
  -  `gapps upload`
9. この状態でローカルマシーンにGASがダウンロードできるのでgitなどの分散型バージョン管理システムでバージョン管理ができるようになります。
10. 後は毎回修正をおこなう度にStandalone Scriptの版を以下のように作成して、参照先のbound scriptでその版を参照する必要があります。
<img width="650" alt="manage_version.png" src="https://qiita-image-store.s3.amazonaws.com/0/32427/087ada47-fa08-63fd-2548-13efc431276d.png">
11. 以上です。楽しいscript作りに励んでください〜！

やってみて思ったこと
===============================
- 初期の `gapps upload` まで持っていくのは慣れてしまうとそんなに手間ではないですが、Libraryとしているスクリプトのバージョンをいちいち発行させて、参照している側でそのバージョンを参照し直さないといけないのが非常に面倒です。

gapps uploadでBad Requestが出るとき
======================================================================
- `An error occured while running upload command: Bad Request` とでることがありますがこれは実はコード上にエラーが有るときのようです。 実際にコードをgoogle script上で貼り付けて保存しようとするとより適切なエラーが出ますので注意してください。


参考
=============
- [Advanced Development Process with Apps Script](http://googleappsdeveloper.blogspot.jp/2015/12/advanced-development-process-with-apps.html)
- [Apps Script による高度な開発プロセス](http://googledevjp.blogspot.jp/2016/01/apps-script.html)(上記リンクの日本語訳)
- [GoogleAppsScriptローカル開発用の公式CLI(node-google-apps-script)がついに登場したので試してみる](http://qiita.com/zaki-yama/items/9a301542137febd8876c)
- [Google Apps Scriptをローカルで開発する](http://qiita.com/ttyokoyama/items/a4edfdcfcad56d664522)