[Google Apps Script] clasp 入門

clasp を利用すると、ブラウザ上のエディタではなくローカルファイルとして扱えます。
Git を利用したり、IDE の支援を受けながら開発することができます。

インストール

clasp の利用には以下が必要です。

  • npm or yarn
  • node.js

yarn でグローバルインストールします。

% yarn global add @google/clasp
yarn global v1.17.3
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

success Installed "@google/clasp@2.2.1" with binaries:
      - clasp
✨  Done in 70.55s.
% clasp --version
2.2.1

初期アカウント設定

プロジェクトディレクトリを用意し、clasp login を実行します。
ブラウザが開き、Google アカウントとの紐付けが確認されますので許可します。

% clasp login

このままプロジェクトを作成すると下記のエラーが表示されます。

% clasp create
? Create which script? sheets
Created new Google Sheet: https://drive.google.com/open?id=foo
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.

指示に沿って https://script.google.com/home/usersettings にアクセスして Google Apps Script API をオンにします。

プロジェクトの作成

あらためて作成します。

clasp create で Google ドライブにファイルが生成されます。
--title オプションでファイル名を指定できます。

% clasp create --title file_name
? Create which script?
  standalone
  docs
❯ sheets
  slides
  forms
  webapp
  api

選択するとローカルに設定ファイルが生成されます。
Google ドライブにファイルが生成されます。

% clasp create --title file_name
? Create which script? sheets
Created new Google Sheet: https://drive.google.com/open?id=foo
Created new Google Sheets Add-on script: https://script.google.com/d/foo/edit
Cloned 1 file.
└─ appsscript.json

現在のローカルディレクトリは以下のようになっています。

.
├── .clasp.json
└── appsscript.json

0 directories, 2 files

appsscript.json を確認し、タイムゾーンを Asia/Tokyo に変更しました。

appsscript.json
{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER"
}

scriptTitle は無効?

当初、ドキュメントにある scriptTitle を指定したのですが、

This command creates a new script in the current directory with an optional script title. clasp create [scriptTitle]

Apps Script  |  Google Developers

% clasp create project_name

カレントディレクトリの一つ上、ファイルを収めている親ディレクトリ名のシートが Google ドライブに作成されていました。
エディタで編集できる *.js が変更されるのかとも考えたのですが反映されている箇所は見つかりませんでした。

影響はないのでペンディングとします。

% clasp create --help
Usage: create [options]

Create a script

Options:
  --type <type>        Creates a new Apps Script project attached to a new Document, Spreadsheet, Presentation, Form, or as a standalone script, web app, or API.
  --title <title>      The project title.
  --parentId <id>      A project parent Id.
  --rootDir <rootDir>  Local root directory in which clasp will store your project files.
  -h, --help           output usage information

開発の流れ

clasp pullCode.js をローカルに引っ張ります。

% clasp pull
Cloned 2 files.
└─ appsscript.json
└─ Code.js

内容はブラウザで編集していたあのファイルです。

Code.js
function myFunction() {
  Logger.log("Hello, World!");
}

編集が終わったら、ファイルをアップロードします。
clasp push でアップロードします。

% clasp push
└─ Code.js
└─ appsscript.json
Pushed 2 files.

以後は、clasp push を繰り返えす事で開発を進められそうです。

こうなると ES2015 で書きたい所ですが、TypeScript を利用できるパッケージが用意されていますので後日確認します。

既存のプロジェクトコードを clone する

既存プロジェクトのファイルを clone します。

This command clones an existing project in the current directory. The script must be created or shared with your Google account. You specify the script project to clone by providing it’s script ID. You can find the script ID of a project by opening the project in the Apps Script editor and selecting File > Project properties > Info.

Apps Script  |  Google Developers

「ツール > スクリプトエディタ」を選択します。
「ファイル > プロジェクトのプロパティ」を表示し、スクリプト ID を控えます。

新しいディレクトリを作成し、既存のプロジェクトを clasp clone します。

% clasp clone <scriptId>
Cloned 2 files.
└─ appsscript.json
└─ コード.js

push 先を変更する

.clasp.json ファイルが Manifest file になっており、これを書き換えることで push 先を変更することができました。

.clasp.json
{ "scriptId": "foobar" }
% clasp push
? Manifest file has been updated. Do you want to push and overwrite? Yes
└─ appsscript.json
└─ コード.js
Pushed 2 files.

その他のコマンド

公式ドキュメントには他にもいくつかコマンドが記載されています。

% 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

clasp deploy はウェブアプリをデプロイする際に利用するようです。
clasp versions は版の管理ができるそうです。「最新の版に名前を付ける」あたりに対応しているのでしょうか。

Cron 的にスクリプトを定期実行する

clasp からは外れますが、エディタ画面の時計アイコンをクリックすると、スクリプトの実行トリガーを指定することができます。
これにより定期実行などが可能になります。

所感

サーバシステムを建て維持管理することが難しい組織の場合、簡易な業務システム・ツールを Google Apps Script で作る事でサーバまわりをお任せできるというポイントは大きそう。
予算や人員の確保がなくなりますので。

そうなると SLA が気になりますが、G Suite SLA(99.9%) が適用されるのかなと思われます。

その他、メリット・デメリットや実例については下記が参考になりました。