Google Apps Script をローカル環境で快適に開発するためのテンプレートを作りました

[gas-clasp-starter](https://github.com/howdy39/gas-clasp-starter) という [Google Apps Script](https://developers.google.com/apps-script/) を ローカル環境で開発するためのテンプレートを作りました。
2018年に登場した、[google/clasp](https://github.com/google/clasp) をベースに [webpack](https://webpack.js.org/), [TypeScript](http://www.typescriptlang.org/), [TSLint](https://palantir.github.io/tslint/), [Prettier](https://prettier.io/), [Jest](https://facebook.github.io/jest/) を利用したテンプレートになっています。
`GAS って新しい構文で書けないしソース管理もできないから微妙` `もっと便利に利用できないかな` みたいな方に読んでもらえれば幸いです。

本記事では、[gas-clasp-starter](https://github.com/howdy39/gas-clasp-starter) を使うことによるメリットや、利用する際の流れを解説します。


## ブラウザ上のスクリプトエディタで開発するのではだめなの?
小さなコードならスクリプトエディタで十分です。
ただし、ある程度のコードになる場合はローカル環境に切り替えたほうが良いでしょう。

GAS は JavaScript ベースの言語でコーディングを行いますが、ES2015 などの新しい構文に対応していないため、とても開発効率が悪くモジュールを分けることもできません。
テストコードもかけません、Lintもできません、使い慣れたエディタももちろん使えません。

また、GAS をスクリプトエディタで開発をしているとソースコードの管理ができません。
次のようなケースはよくあるパターンです。
`Aさんが作っているのと似たようなスクリプトを作りたいから参考にしたい` `異動するので誰かにスクリプトを引き継がないといけない` そのようなときに GitHub などでソース管理されていればとてもスムーズです。
公開してよいスクリプトなら OSS として公開するのも良いでしょう。

[gas-clasp-starter](https://github.com/howdy39/gas-clasp-starter) を使用すると上記のすべてが解決できます。


## 開発の流れ
まず次の3つをインストールしておきましょう。

- [Git](https://git-scm.com/) 
- [Node.js](https://nodejs.org/)
- [google/clasp](https://github.com/google/clasp) 
    - `npm i @google/clasp -g`

### リポジトリをクローン
次にテンプレートをローカルに持ってきます。
`<project_name>` は任意の文字列に変えます。

```
git clone --depth=1 https://github.com/howdy39/gas-clasp-starter.git <project_name>
```

### 依存ライブラリをインストール
先程の`<project_name>`で指定したディレクトリができているので移動し、依存ライブラリをインストールします。

```
cd <project_name>
npm install
```

### `.clasp.json` を開いてスクリプトIDを変更

`.clasp.json` は次のようになっています。
この `scriptId` に変更したいGASのスクリプトIDを設定する必要があります。

```json:.clasp.json
{
  "scriptId": <your_script_id>,
  "rootDir": "dist"
}
```

#### ScriptId とは
スクリプトエディタを開き、ブラウザのURLに出ているのがスクリプトIDです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/46a59e20-4398-4382-6c00-1727811cc835.png)

そのため、事前にGASを作っておく必要があります。（SpreadSheetに付属するGASでも、単体のGASでも大丈夫です）
上記画像の場合は次のようになります。

```json:.clasp.json
{
  "scriptId": "1EpE50L0O9EBIsVmZrutRONBliHaFVrNQEJ_Sn8TPX7kzPoVeMKxOzadu",
  "rootDir": "dist"
}
```


### 開発してビルド
本来はここで開発が入りますが、テンプレートにサンプルコードを入れてあるので、ここではそのままビルドします。

```
npm run build
```

### Claspの設定(初めてClaspを入れた人のみ行う）
デプロイの前に、初めてClaspを使う方は次の手順が必要です、既に設定済みの方は飛ばしてOKです。

次のコマンドでclaspにログインします。

```
clasp login
```

また、次のURLを開いて Google Apps Script API を使って良いかの設定をONにします。
https://script.google.com/home/usersettings

ここでONにしないと次のようなエラーメッセージが表示されてしまいます。

```
User has not enabled the Apps Script API. 
Enable it by visiting https://script.google.com/home/usersettings then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
```


### デプロイ
デプロイは clasp の push コマンドを使います。
※既存のGASを指定するときは、上書きしてしまうので気をつけましょう。

```
clasp push
```

### スクリプトエディタで開いてみる
スクリプトエディタで対象のGASを開いてみましょう。(`clasp open`でも開けます）
ビルド後のコードが設定されています。
あとは実行するなり、トリガーを設定するなりいつものGAS開発と同じです！
※テンプレートコードはスプレッドシートをマイドライブ上に作成するものです、メニューの`実行`から`createNewFile`を実行してみましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/652ccde1-4ecb-6bcc-5f72-83b8b981b926.png)


## テンプレートの解説
### コード補完
[TypeScript](http://www.typescriptlang.org/) を使っているためスクリプトエディタ同様にコード補完が可能です。
使い慣れたエディタで開発しましょう。（この画像では [Visual Studio Code](https://code.visualstudio.com/) を使用しています）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/15ee3989-eaf7-1143-d371-949f4b1c355c.png)

### TSLint/Prettier
ビルド実行時に自動で動くようになっているため、強制的に統一されたコードになります。
このあたりは好みがわかれるので `tslint.json` をいじると良いでしょう。

[TSLint](https://palantir.github.io/tslint/) を通すことで、**自動で「'」に統一したり、インデント調整が行われる**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f4258755-e2bc-2fdf-885e-5c7fd87adc83.png)
上記のコードは自動で次のようにきれいなコードになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/4eaa82c3-673a-347e-0496-ff924c951ff6.png)


### テスト
[Jest](https://facebook.github.io/jest/) を組み込んであります。
受信メールの解析や、送信メール文の構築など、コードが複雑になるところではテストを書くと良いでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/58574c11-1f65-fd3c-b483-066cccf3f6ef.png)

# ここからは余談です
## テンプレートを作った契機
もともと [node-google-apps-script](https://github.com/danthareja/node-google-apps-script) というローカルで開発するためのライブラリがありましたが、事前準備が面倒かつスタンドアロンのGASでないと使えなかったので、使う気が起きませんでした。

そんな中 [clasp](https://github.com/google/clasp) という Google が作った公式ライブラリが2018年の頭に誕生しました。
Clasp については次の記事を見ると良いでしょう。
[Google Apps Scriptの新しい3つの機能 その③ CLI Tool Clasp - Qiita](https://qiita.com/soundTricker/items/354a993e354016945e44)

ただし、当初の Clasp では私の要望は満たせていませんでした。
プロジェクトフォルダの構成がそのまま GAS にアップロードされる形だったため TypeScript や webpack などを使用した開発と相性が悪かったのです。
しかし、[バージョン1.1](https://github.com/google/clasp/releases/tag/v1.1)から `rootDir` 設定が追加され、ビルド後のディレクトリを指定できるようになりました。
`これならローカル開発の方が効率よさそうだしテンプレート作るか` と思い、作成しました。

また最近 Google Home や IoT が流行ってきたためか GAS をつかった人気記事を見かけるのがとても増えました。

- [Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3)
- [JSONを返す無料APIを3分で作る方法 - Qiita](https://qiita.com/ykhirao/items/a41322085ab55837b88e)
- [LINEからDMMのアダルト動画のサンプルを見れる、変態コンシェルジュ作りました！ - Qiita](https://qiita.com/kkdmgs110/items/3483ad6cb5c85983ffc6)
- [遅くまで会社にいたら自動で「帰り遅くなる」とメールする - Qiita](https://qiita.com/ikechan/items/5e4bf2b9868d0d804af5)
- [Google Homeで子供の朝支度を促してみる - Qiita](https://qiita.com/hideo-works/items/db25a748889d47d5eff2)

GAS はローカルでも開発できることを多くの人に知ってほしかった、というのも理由の一つです。

## 最後に
[gas-clasp-starter](https://github.com/howdy39/gas-clasp-starter) を使うなり、オレオレテンプレートを作るなりして GAS を便利に使っていきましょう。

----

2018/3/22 gas-clasp-starter に CIを導入する記事を書きました！
[Google Apps Script のデプロイを Circle CI から行う - Qiita](https://qiita.com/howdy39/items/2c21251331e011d04512)