GASにサービスアカウントは利用できない

Google Apps Script (GAS)には、コードをリポジトリで管理しCI/CDで自動的に同期したい需要が強くある。 さらにチーム開発であれば、個人アカウントに依存しないWorkload Identityやサービスアカウントを利用したい需要も発生する。

しかし、GASでサービスアカウントを利用して特定の個人に依存しない運用をすることは出来ない。

#Claspではサービスアカウントを利用できない

GASなどをコードで管理できるClaspのissueを見ると、サービスアカウントが利用できないというissueが多く見られる。

実際に、サービスアカウントを利用してclasp pushなどを実行すると次のエラーが表示される。

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.

#Claspの問題ではなくAPIの仕様

しかし、これはClaspの問題ではなくApps Script APIの仕様によるものであり、Apps Script APIの仕様を見るとサービスアカウントは利用できないと次のように明記されている。

Warning: The Apps Script API does not work with service accounts.

参照: Apps Script API - Concepts

実際に、サービスアカウントの権限を利用してApps Script APIを呼ぶと、Claspと同様の403エラーが出力される。

#Issue Trackerでの対応予定もない

2025年にサービスアカウントをclaspで利用できない問題についてIssue Trackerで起票された。

https://issuetracker.google.com/issues/442055772

しかし、このIssueに対して、Won’t Fix (Intended Behavior)という回答がなされており、今後の対応予定がないことが明示されている。

#一部ツールも特定の個人に依存している

Google Apps Script GAS Actionなど、一部のルールではサービスアカウントやWorkload Identity Federationを利用してGASを管理する実装が存在する。

確かにこれらはサービスアカウントなどを利用しているが、実際には特定の個人に紐づいている。

例えば、Google Apps Script GAS Actionの場合、これはサービスアカウントがDomain-wide delegationを通じて特定の個人を偽装することでサービスアカウントでの運用を可能にしているが、その個人のOAuthトークンを結果として利用しており、特定の個人アカウントに依存している。

#代替手段:マシンユーザーを利用する

マシンユーザー(自動化などに利用するがサービスアカウントと異なり実際に存在するアカウント)を用いることで、サービスアカウントを利用できない制約を回避しつつ、特定の個人に依存しないGASの運用が可能になる。