claspでGASのソースをGit管理

# はじめに

GASからREST APIを使ってwebサービスを便利に操作するGoogleスプレッドシートを営業職メンバへ展開([これ](https://qiita.com/zaki-lknr/items/17d731955edfc19dcf8b)とか[これの別バージョン](https://qiita.com/zaki-lknr/items/9a03fb54c77f890e3bb4))したのはいいけど、機能追加したりする際に「運用中のスクリプトへの機能追加」が手作業だと自爆するほど難しい(というかバージョン管理したい)ので、ググった結果[claspというGoogle謹製のツール](https://github.com/google/clasp)が見つかったので、使ってみました。

- [Google Apps Scriptの新しい3つの機能 その③ CLI Tool Clasp - Qiita](https://qiita.com/soundTricker/items/354a993e354016945e44)
- [claspでGAS(GoogleAppsScript)ファイルをGit管理する。 – kin29.info](https://kin29.info/clasp%E3%81%A7gasgoogleappsscript%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92git%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%80%82/)
- [claspを使い、Google Apps Scriptプロジェクトをgitでバージョン管理する - Qiita](https://qiita.com/rf_p/items/7492375ddd684ba734f8)

これ、バージョン管理だけでなく、ローカルPC上でGASのコードを書けるようになる(書いたコードをGASへ後からアップロードする)ので、VSCodeとか好きなエディタでコーディングできるようになります😊

# install

claspを使うにあたってNode.jsが必要なのでセットアップする。

## Node.js

https://nodejs.org/ja/download/
https://qiita.com/maecho/items/ae71da38c88418b806ff

Windowsであれば、手順通りにインストーラをダウンロードして実行すればあとはほぼ半自動。デフォルトでOK

```
PS C:\Users\zaki> node --version
v10.16.0
PS C:\Users\zaki> npm --version
6.9.0
PS C:\Users\zaki>
```

## clasp

https://github.com/google/clasp
https://qiita.com/HeRo/items/4e65dcc82783b2766c03

`npm i @google/clasp -g`のワンコマンドでインストールされる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/b0301f04-22a8-8d9f-6347-bb676a11b7cd.png)


```
PS C:\Users\zaki> npm i @google/clasp -g
C:\Users\zaki\AppData\Roaming\npm\clasp -> C:\Users\zaki\AppData\Roaming\npm\node_modules\@google\clasp\src\index.js
+ @google/clasp@2.1.0
added 255 packages from 135 contributors in 29.616s
PS C:\Users\zaki>
PS C:\Users\zaki> clasp --version
2.1.0
PS C:\Users\zaki>
PS C:\Users\zaki> clasp --help
Usage: clasp <command> [options]

clasp - The Apps Script CLI

Options:
  -v, --version
  -h, --help                                  output usage information

Commands:
  login [options]                             Log in to script.google.com
  logout                                      Log out
  create [options]                            Create a script
  clone [options] [scriptId] [versionNumber]  Clone a project
  pull [options]                              Fetch a remote project
  push [options]                              Update the remote project
  status [options]                            Lists files that will be pushed by clasp
  open [options] [scriptId]                   Open a script
  deployments                                 List deployment ids of a script
  deploy [options]                            Deploy a project
  undeploy [options] [deploymentId]           Undeploy a deployment of a project
  version [description]                       Creates an immutable version of the script
  versions                                    List versions of a script
  list                                        List App Scripts projects
  logs [options]                              Shows the StackDriver logs
  run [options] [functionName]                Run a function in your Apps Scripts project
  apis [options]                              List, enable, or disable APIs
    list
    enable <api>
    disable <api>
  help                                        Display help
  setting|settings [settingKey] [newValue]    Update <settingKey> in .clasp.json
  *                                           Any other command is not supported
PS C:\Users\zaki>
```

# claspでGASのソースをローカルでも管理

## configure Google Apps Script API

https://script.google.com/home/usersettings

Google Apps Script APIの設定にアクセスして、デフォルトでオフになってるはずの設定をオンにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/2d9373bb-b859-7e4e-3417-aeb7ed406189.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/aa8c8ba1-08a3-06f9-2d7f-7b9df7a776d8.png)

## clasp login

```
PS C:\Users\zaki> clasp login
Logging in globally...
🔑 Authorize clasp by visiting this url:
https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.deployments%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fscript.projects%20http [..以下略...]
```

ブラウザが起動するので、権限を確認して許可する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/ad301d7e-b5f9-aa3a-4a73-7a281de33d6d.png)

許可を与えればログイン完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/0bc4c9a2-7091-7ae4-a0cf-ac94bc88dbce.png)

コンソールにもログイン完了の出力

```
Authorization successful.

Default credentials saved to: ~\.clasprc.json (C:\Users\zaki\.clasprc.json).
PS C:\Users\zaki>
```

ホームディレクトリに、トークンが保存された`.clasprc.json`ファイルが作成される。

## GASからプロジェクトのclone

ここでの`clone`は`git`のコマンドでなく、GASとローカル間のプロジェクトの`clone`。
要は、GAS上の作成済みスクリプトをローカルのPCへ持ってくる。

使うコマンドは

```
 clone [options] [scriptId] [versionNumber]
```

cloneのヘルプ。
ちょっと不親切…？

```
PS C:\Users\zaki\src\gas\trello> clasp clone --help
Usage: clone [options] [scriptId] [versionNumber]

Clone a project

Options:
  --rootDir <rootDir>  Local root directory in which clasp will store your project files.
  -h, --help           output usage information
```

というわけで、指定するスクリプトIDは、URLに含まれるこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/2b28fb7a-56ab-344c-2fa2-8024c0b3016e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/6c6ab613-5135-9121-3018-b49a2d8d99e7.png)

(ID部分、ボカシてあるけどどちらも同じものです)

この部分に表示されているハッシュ値を引数に`clone`を実行すると、実行したディレクトリにGASのソースが`clone`(ダウンロード)される。

```
PS C:\Users\zaki\src\gas\trello> clasp clone 1n8****************************VZ1
Cloned 4 files.
└─ Trello操作.js
└─ appsscript.json
└─ スプレッドシート操作.js
└─ メイン.js
PS C:\Users\zaki\src\gas\trello>
PS C:\Users\zaki\src\gas\trello> ls


    ディレクトリ: C:\Users\zaki\src\gas\trello


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/06/23     10:37             73 .clasp.json
-a----       2019/06/23     10:37             92 appsscript.json
-a----       2019/06/23     10:37           4817 Trello操作.js
-a----       2019/06/23     10:37           6250 スプレッドシート操作.js
-a----       2019/06/23     10:37           3298 メイン.js


PS C:\Users\zaki\src\gas\trello>
```

GAS上のソースと別に、`appsscript.json`におそらくマニフェスト的なプロジェクトの設定ファイル、`.clasp.json`にスクリプトIDが保持される。

うーん、あまりよく考えずに作り始めた「初めてのGASプロジェクト」(の延長)だったので、スクリプト名とかめっちゃ日本語入ってるけど、git管理とかするならASCIIにしておけばよかったな(笑)

## ローカルの変更をGASへpush

ローカルのエディタ(VSCodeなど)でソースを変更し、それをGASへpushする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256859/35d1f88e-8416-3946-71ff-efcf4974340d.png)

そして`push`する

```
PS C:\Users\zaki\src\gas\trello> clasp push
└─ Trello操作.js
└─ appsscript.json
└─ スプレッドシート操作.js
└─ メイン.js
Pushed 4 files.
PS C:\Users\zaki\src\gas\trello>
```

これでGAS上でソースを開けば、ローカルで変更した内容が反映されているはず。

ちなみに`push`の対象は`.gs`,`.html`,`.json`のみとのこと。
また、jsonファイルは`appsscript.json`のみで、適当なファイル名のjsonファイルは`push`されない。
[Google Apps Scriptの新しい3つの機能 その③ CLI Tool Clasp](https://qiita.com/soundTricker/items/354a993e354016945e44)

### push対象のファイルは？

`clasp status`で確認できる

```
PS C:\Users\zaki\src\gas\trello> clasp status
Not ignored files:
└─ Trello操作.js
└─ appsscript.json
└─ スプレッドシート操作.js
└─ メイン.js

Ignored files:
└─ .clasp.json
PS C:\Users\zaki\src\gas\trello>
```

`.clasp.json`は無視される。
適当に`aaa.json`なんか作ってみると…？

```
PS C:\Users\zaki\src\gas\trello> clasp status
Not ignored files:
└─ Trello操作.js
└─ appsscript.json
└─ スプレッドシート操作.js
└─ メイン.js

Ignored files:
└─ .clasp.json
└─ aaa.json
```

なるほど、無視されるようだ。

## .claspignore

`.gitignore`と同じように、`push`対象外にしたいファイルを定義できる。
が、関係ないファイルはデフォルトで`push`対象外っぽいので、トリッキーなことをしてなければ？設定しなくても大丈夫そう(たぶん)

https://github.com/google/clasp#ignore-file-claspignore

# GASのソースをGitでも管理

ローカルにcloneしてきたファイルをgitのリポジトリに登録すればOK。

GitHubなんかでリポジトリを作れば「このコマンドを実行しろっ」って出てくるので、その通りに実行すればリポジトリが作成される。

Git for Windowsがインストールしてあれば、対象フォルダ右クリックで「Git Bash Here」してコンソールを起動して、その通りコマンド実行すればOK
(Git for Windowsなどは別途インストールすること)

```
zaki@mascarpone MINGW64 ~/src/gas/trello
$ echo "# gas to trello" >> README.md

zaki@mascarpone MINGW64 ~/src/gas/trello
$ git init
Initialized empty Git repository in C:/Users/zaki/src/gas/trello/.git/

zaki@mascarpone MINGW64 ~/src/gas/trello (master)
$ git add README.md

zaki@mascarpone MINGW64 ~/src/gas/trello (master)
$ git commit -m "first commit"
[master (root-commit) 523ac83] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

zaki@mascarpone MINGW64 ~/src/gas/trello (master)
$ git remote add origin https://github.com/zaki-lknr/****.git

zaki@mascarpone MINGW64 ~/src/gas/trello (master)
$ git push -u origin master
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 4.97 KiB | 2.48 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To https://github.com/zaki-lknr/****.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

zaki@mascarpone MINGW64 ~/src/gas/trello (master)
$
```

これで「ローカルPC上でスクリプト作成・Gitでバージョン管理しつつ、動作確認やリリースをGASへpush」という運用ができるようになった。

動作確認とリリースバージョンは、それぞれのGASのプロジェクトを用意し、`.clasp.json`の中身を切り替えて環境切り替えすると良いのかな。
その辺は使ってみて試していこう。

pipelineとか設定して、リポジトリへ`push`したらGASへも適用まで自動化とか、頑張ればできるかな？(未検討)