TypeScript+clasp+Google Apps Script(GAS)で簡易Web APIサーバーを作成しデプロイする
環境構築
任意の場所に新しいフォルダを作成しその中に移動。
claspをnpmで入れる。-g
はグローバルインストールのオプション。
npm install -g @google/clasp
使用するアカウントのGoogle Apps Script APIをオンにする。
以下のコマンドでGoogleアカウントへのログインを行う。ログインが完了すると~/.clasprc.json
にTokenが作成される。
clasp login --no-localhost
npm init
でpackage.json
を初期化してGASの型定義をインストールする。TypeScriptについてはclaspが依存しているので追加の作業は不要。
npm init -y
npm install @types/google-apps-script
以下のコマンドでGASアプリケーションを作成する。--rootDir ./src/
でソースコードを入れるフォルダを指定。
clasp create --rootDir ./src/
するとこのような選択肢が表示されるので今回はwebapp
を選ぶ。
? Create which script?
> standalone
docs
sheets
slides
forms
webapp
api
このような表示が出たら環境構築は完了。
Created new webapp script: https://script.google.com/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ ./src/appsscript.json
.gitignore
に.clasp.json
を追加しておく。
Web APIとして公開
初回
script.google.comでpushしたファイルの編集画面を開く。
右上のデプロイから新しいデプロイを選択。
種類の選択の歯車アイコンからウェブアプリを選択。
次のユーザーとして実行を自分に、アクセスできるユーザーを全員にしてデプロイする。
ウェブアプリのURLが表示される。
2回目以降
appscript.json
に以下の記述を追加。
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
- "runtimeVersion": "V8"
+ "runtimeVersion": "V8",
+ "webapp": {
+ "access": "ANYONE_ANONYMOUS",
+ "executeAs": "USER_DEPLOYING"
+ }
}
以下のコマンドでデプロイの一覧が表示されるので、最新のデプロイIDをコピーする。
clasp deployments
確認したデプロイIDを使って以下のコマンドを実行するとデプロイが更新される。
clasp push
clasp deploy -i <Deploy ID>
URLは更新してもhttps://script.google.com/macros/s/<Deploy ID>/exec
のまま固定。
プロジェクトごとにアカウントを切り替える
プロジェクトのルートに.clasprc.json
を用意し、clasp
コマンドを実行する際は常に--auth
オプションでトークンを読み込ませる。
clasp login --auth .clasprc.json
プライベートリポジトリでない場合、.clasprc.json
は.gitignore
に追加する。
以下のようにscriptsを追加しておく。
{
"scripts": {
"login": "clasp login --auth .clasprc.json",
"push": "clasp push --auth .clasprc.json",
"deployments": "clasp deployments --auth .clasprc.json",
"deploy": "clasp deploy -i ${npm_config_id} --auth .clasprc.json"
}
}
PrettierとESLint
Prettier
npm install -D prettier
.prettierrc
を作成して好みに合わせて設定をする。
ESLint
npm install -D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-import
.eslintrc.js
を作成して好みに合わせて設定をする。
module.exports = {
extends: ["eslint:recommended"],
env: {
browser: true,
node: true,
es6: true,
},
parserOptions: {
ecmaVersion: 2019,
},
overrides: [
{
files: ["src/**/*.ts"],
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
parser: "@typescript-eslint/parser",
parserOptions: {
sourceType: "module",
project: "./tsconfig.json",
},
plugins: ["@typescript-eslint", "import"],
rules: {
"import/order": "error",
},
},
],
}
TSConfig
{
"compilerOptions": {
"target": "ES2019",
"strict": true
},
"include": ["src/**/*.ts"]
}
GitHub ActionsによるCD
name: Deploy to Google Apps Script
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 18
- name: Install Clasp
run: npm install
- name: Create .clasprc.json
run: |
echo '{"token":{"access_token":"${{ secrets.ACCESS_TOKEN }}","scope":"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/script.projects https://www.googleapis.com/auth/script.webapp.deploy https://www.googleapis.com/auth/logging.read openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/script.deployments https://www.googleapis.com/auth/service.management https://www.googleapis.com/auth/cloud-platform","token_type":"Bearer","id_token":"${{ secrets.ID_TOKEN }}","expiry_date":1620870307822,"refresh_token":"${{ secrets.REFRESH_TOKEN }}"},"oauth2ClientSettings":{"clientId":"${{ secrets.CLIENT_ID }}","clientSecret":"${{ secrets.CLIENT_SECRET }}","redirectUri":"http://localhost"},"isLocalCreds":false}' > .clasprc.json
- name: Create .clasp.json
run: |
echo '{"scriptId":"${{ secrets.SCRIPT_ID }}","rootDir":"./src"}' > .clasp.json
- name: Push to Google Apps Script
run: npm run push
- name: Deploy to Google Apps Script
run: npm run deploy -id="${{ secrets.DEPLOY_ID }}"
以下のSecretsを設定しておく。
Name | Description |
---|---|
ACCESS_TOKEN |
.clasprc.json のaccess_token の値 |
CLIENT_ID |
.clasprc.json のclientId の値 |
CLIENT_SECRET |
.clasprc.json のclientSecret の値 |
DEPLOY_ID |
本番環境のデプロイID |
ID_TOKEN |
.clasprc.json のid_token の値 |
REFRESH_TOKEN |
.clasprc.json のrefresh_token の値 |
SCRIPT_ID |
.clasp.json のscriptId の値 |