Google Apps Scriptの新しい3つの機能 その③ CLI Tool Clasp

この記事は2018/1/11にGoogle Apps Scriptに新しく追加された3機能の紹介記事の3番目です。
https://gsuite-developers.googleblog.com/2018/01/three-new-tools-to-help-improve-your.html?m=1

# 新機能

1. [Dashboard](https://qiita.com/soundTricker/items/59979d0bb065fdd8d536)
2. [Apps Script API](https://qiita.com/soundTricker/items/13719acd2628ed87894c)
3. CLI Tool `clasp` (この記事です)

一つ一つが結構しっかりした機能なので記事を分けて説明したいと思います。
今回は3つ目のCLI Tool `clasp`です。

# CLI Tool `clasp`

`clasp`はオープンソースのGAS向けCLIツールです。
https://github.com/google/clasp

CLI上からGASプロジェクトに対して以下の様なことが行なえます。

* GASプロジェクトの新規作成
* GASプロジェクトのダウンロード
    * SheetsやDocumentsに紐付いているContainer Bound Scriptでも可能です。
* GASプロジェクトファイルのアップロード/ダウンロード
* GASプロジェクトのバージョン一覧の取得
* GASプロジェクトの新規バージョンを作成
* GASプロジェクトのデプロイ
* GASプロジェクトのデプロイ一覧の取得
* GASプロジェクトをエディタで開く

今まで喉から手が出るほど欲しかった機能が目白押しです。
なお既にCodelabも公開されているので、サラッと見ておくと言いと思います。
https://codelabs.developers.google.com/codelabs/clasp/#0

## インストール

`clasp`はNode.jsで書かれており、npmで配信されているので、Node.jsの4.7.4以降が必要になります。
そして以下のコマンドでインスタンスができます。

```bash
$ npm install -g @google/clasp
```

## 準備

利用するためには、まずGoogleアカウントのログインとAPIの認可が必要です。
以下のコマンドで、ログイン、認可を行います。

```bash
$ clasp login
```
するとブラウザが開きGoogleアカウントへのログイン、APIの認可が行われます。

## プロジェクトの作成

ログインが出来たらGASプロジェクトを作成します。

```bash
$ mkdir myFirstClasp
$ cd myFirstClasp
$ clasp create myFirstClasp
```
`clasp create`で新規にGASプロジェクトが作成され、その設定ファイルがローカルに保存されます。
2つのファイルが作成されており`.clasp.json`はGASのプロジェクトIDが記述されています。
多分今後機能が増えると色々設定が書かれるような気がします。

`appsscript.json`は最近作成されたmanifestファイルで、OAuth ScopeやLibraryが記述されます。

## プロジェクトのクローン

既に存在するGASプロジェクト(Container Bound Scriptを含む)をローカルに持ってきたい場合は、以下を行います。

```bash
$ clasp clone [GASプロジェクトのID]
```
GASプロジェクトのIDはGASエディタの`File > Project properties > Info`から取得できます。
なお、新規作成時と同じように、`.clasp.json`が作成されます。
雰囲気的にコードはこの時点ではダウンロードされないのでご注意ください。
コードのダウンロードは↓で書きます。
## コードのダウンロード

GASプロジェクトのコードをダウンロードする場合は、.clasp.jsonがある場所で、以下を行います。

```bash
$ clasp pull
```
するとGASプロジェクトのファイル群をダウンロードしてくれます。
## コードのアップロード

コードをアップロードするには、.clasp.jsonがある場所で以下を行います。

```bash
$ clasp push
```
するとローカルにあるファイルをGASプロジェクトへアップロードしてくれます。
ただ幾つか注意点(ある意味便利機能)があります。

* アップロードされるファイルの拡張子とignoreファイル
* アップロードされるファイルのディレクトリ構造と、ファイル名のマッピング

### アップロードされるファイルの拡張子とignoreファイル

`clasp push`を行った際、アップロードされるのは拡張子が`.gs`、`.html`、`.json`のみです。
また`.json`は`appsscript.json`でなければならず、それ以外の例えば`package.json`等があるとエラーになります。

これらのファイルをアップロードしないようにしたい場合は以下のように`.claspignore`ファイルをディレクトリ中に置く必要があります。
ドキュメントには記述されてないので注意してください。

```:.claspignore
package.json
```
### アップロードされるファイルのディレクトリ構造と、ファイル名のマッピング

ローカルでディレクトリの中にあるファイルは、`{ディレクトリ名}/{ファイル名}`という名前のファイル名でGASプロジェクト上保存されます。

```
# スクリプトエディタ上
├── tests/slides.gs
└── tests/sheets.gs

# ローカル
├── tests/
│   ├─ slides.gs
│   └─ sheets.gs
```

ローカルだと扱いやすいですが、スクリプトエディタ上の見た目はそのまま一ファイルになるのでちょっと見づらいです。

## バージョン一覧の取得、作成

以下でやれます。

```bash
$ clasp versions # 一覧取得
$ clasp version [バージョン名] [説明] # バージョン作成
```

## デプロイ

先にappsscrpt.jsonなどでwebappsの設定を行い、バージョンを作成していれば、ローカルからデプロイすることも可能です。

```bash
$ clasp deploy [バージョン名] [説明]
$ clasp undeploy <deploymentId>
```
また再デプロイも出来ます。
```bash
$ clasp redeploy <deploymentId> <バージョン名> <説明>
```

## スクリプトエディタを開く

以下で開けます。

```bash
$ clasp open
```

# まとめ

GASの開発で必要な機能は全て入っていますね。
個人的にはライブラリの検索や、もっと言えばnpmからインストールとか出来たりするともっと楽しいことになるのですが、
そうなる日も近いのではないでしょうか。

これからのGAS開発ではclaspは必須になるといってもいいでしょう。