claspでGASのソースをGit管理


はじめに

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

これ、バージョン管理だけでなく、ローカル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のワンコマンドでインストールされる

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/[email protected]
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

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

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 [..以下略...]

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

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

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

Authorization successful.

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

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

GASからプロジェクトのclone

ここでのclonegitのコマンドでなく、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に含まれるこれ

(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する。

そして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

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対象外っぽいので、トリッキーなことをしてなければ?設定しなくても大丈夫そう(たぶん)

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へも適用まで自動化とか、頑張ればできるかな?(未検討)