claspでGoogle Apps Scriptをローカルで開発しデプロイする

gcp

claspはGASをローカルで開発するための公式のツール。

$ npm install -g @google/clasp
$ clasp --version
2.3.0

設定でGASのAPIを有効にしてログインし、必要な権限を許可する。

$ clasp login
$ cat ~/.clasprc.json
{"token":{"access_token":"...

clasp createプロジェクトを作成する。typeを指定するとドキュメントが作られ、スクリプトがそれに紐づく。 紐づいているスクリプトからはSpreadsheetApp.getActiveSpreadsheet()のようにIDを指定することなくドキュメントを参照できる。

$ clasp create --type sheets --title "clasp test"
Created new Google Sheet: https://drive.google.com/open?id=*****
Created new Google Sheets Add-on script: https://script.google.com/d/*****/edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ appsscript.json

$ tree -a
.
├── .clasp.json
└── appsscript.json

$ cat .clasp.json
{"scriptId":"*****"}

$ cat appsscript.json 
{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

$ clasp open

clasp pullでスクリプトを持ってきてclasp pushで上書きする。

$ clasp pull
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 2 files.
└─ appsscript.json
└─ Code.js

$ clasp push

clasp runで実行するためにはGCPのプロジェクトを作成し、OAuthアプリの設定とGAS管理のプロジェクトからGCPのプロジェクトへの変更を行う必要がある

$ clasp setting projectId <GCP_PROJECT_ID>
$ open https://console.developers.google.com/apis/credentials/consent?project=<GCP_PROJECT_ID>
$ clasp open

GCPプロジェクトへの変更

OAuthアプリのクライアントID/シークレットを発行し、ダウンロードしたファイルでログインする。 テストユーザーに追加していないと失敗する。認証情報を公開しないように注意。

$ clasp open --creds
$ clasp login --creds creds.json
Authorization successful.

Local credentials saved to: ./.clasprc.json.
*Be sure to never commit this file!* It's basically a password.

$ cat .gitignore 
creds.json
.clasprc.json

$ cat .claspignore
!*.js
!appsscript.json

appsscript.jsonexecutionApiの設定を追加した。 これがないとScript API executable not published/deployed.のエラーが返る。

$ cat Code.js 
function myFunction() {
    return "HELLO"
}

$ cat appsscript.json 
{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "executionApi": {
    "access": "ANYONE"
  }
}

$ clasp push
$ clasp run myFunction
HELLO

clasp deployするとversionを切ってdeploymentが作成される。バージョンを指定してpullできる。

$ clasp deploy --description "version 1"
Created version 1.

$ clasp versions
~ 1 Version ~
1 - version 1

$ clasp pull --versionNumber 1

版を管理

$ clasp deployments
2 Deployments.
- ***** @HEAD 
- ***** @1 - version 1

これをトリガーに設定したりWebアプリケーションとして公開するのはWeb上で行う。