仕事でGASに自動デプロイする方法を調べたので、備忘録として残して置く。
一応、経緯も書いておく。
GASにデプロイする時Claspかasideを使うと簡単にデプロイすることができるが、チームで開発している場合はGithub Actionsなどを使用して自動化する方が効率的。
なので、masterブランチにコミットされたら自動的にGASプロジェクトにデプロイしてくれる仕組みを作りたかった。
あと、Github Actionsとか使った自動デプロイとかいうのをやったことなかったので、挑戦してみたかった。
環境
- macOS Sequoia15.2
- Docker
- nodejs12
ソースだけちゃっちゃとみたい人向けにgithubのリポジトリ貼っておく。

プロジェクト構成はこんな感じ。
.
├── Docker
│ └── dockerfile
├── clasp-github-actions
│ └── app
│ └── src
│ ├── appsscript.json
│ └── index.js
└── docker-compose.yml
前提
GoogleAppScriptAPIを有効にしていること。
していない場合は下記リンクからオンに変更。

Dockerなどでコンテナの作成して、実行中のコンテナにアタッチしていること。
手順
1.clasp loginを実行し、Googleアカウント認証する。
clasp login
2.認証成功後、以下のファイルに記載されているtoken値を確認する。
cat ~/.clasprc.json
{
"tokens": {
"default": {
"access_token": "aaaaaaaa...",
"refresh_token": "bbbbbbbb...",
"type": "authorized_user",
"client_id": "ccccccccccc.googleusercontent.com",
"client_secret": "dddddddddd",
}
}
}
3.tokenをGithubリポジトリに設定する。
Name:CLASP_TOKEN
Secret:2で確認したtoken値
{
"token": {
"access_token": "aaaaaaaa...",
"refresh_token": "bbbbbbbb...",
"scope": "https://www.googleapis.com/auth/...",
"token_type": "Bearer",
"id_token": "ccccccccc...",
"expiry_date": 1700000000000
}
}
設定手順
対象リポジトリ⇨Settings⇨Secrets and variables内のActions⇨New repository secret
4.GASプロジェクトの作成をする。
mkdir src/
clasp create testApp --type standalone --rootDir ./src
mv src/.clasp.json .
5.設定ファイルの修正をする。
{
"timeZone": "Asia/Tokyo",
"dependencies": {},
"exceptionLogging": "STACKDRIVER"
}
6.スクリプト作成をする。
src/index.jsを作成し、コードを記述する。
function helloWorld() {
Logger.log("Hello, Google Apps Script!");
}
7.GASにPushする。
Manifest file has been updated. Do you want to push and overwrite?という質問がされる場合があるが、「y」を入力して続行でOK。
clasp push
正しくデプロイされているか確認。


8.Github Actionsのyml作成をする。
mkdir -p .github/workflows/
touch .github/workflows/deploy.yml
name: test # workflow の名前
on:
push:
branches:
- main # main ブランチにプッシュされたときに実行
workflow_dispatch: # 手動実行も可能にする
jobs:
clasp_push:
runs-on: ubuntu-latest # 実行環境として Ubuntu を使用
steps:
- name: Checkout repository
uses: actions/checkout@v4 # リポジトリの最新コードを取得
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20 # Node.js のバージョンを指定
- name: Install dependencies
# Clasp をグローバルインストール
run: |
npm install -g @google/clasp
- name: Authorize Clasp
env:
CLASP_TOKEN: ${{ secrets.CLASP_TOKEN }} # GitHub Secrets からトークンを取得
# 認証情報を保存
run: |
echo $CLASP_TOKEN > ~/.clasprc.json
# 各ディレクトリをチェックし、`clasp push -f` を実行
- name: Clasp push by directories
# 以下の処理を実行
# [sed 's:/$::] 二重で/が着くのを除去
run: |
for dir in $(ls -d */ | grep -v '^Docker/$' | sed 's:/$::'); do
cd $dir/app/
echo "Processing directory: $dir/app/"
if clasp status; then
clasp push -f
else
echo "Not a clasp project: $dir/app/"
fi
cd ../../
done
9.正常性確認
masterにコミット後、Actionsタブでworkflowが動いているかを確認。

正常終了が確認できたらGASの対象プロジェクトに正常にデプロイされているか確認。

※初回にサンプルソースをデプロイしてからソースを書き換えていなかったので、時間で判断。
正しく反映できているのを確認できたら完了!
一応、多少汎用性を持たせているので、別のプロジェクトを作成して、app/srcの構成にすればその子達も自動でデプロイされるようにはなってる。
これで多少なりともみんなの負担を減らせたなら御の字。
参考サイトたち

コメント