Claude CodeでGAS(Google Apps Script)を書く手順
Claude CodeはブラウザのApps Scriptエディタを直接操作できないため、claspでローカルにプロジェクトを作り、コードを書かせてpushする手順です。
Google Apps Script(GAS)は本来、ブラウザのscript.google.comエディタにコードを直接入力する仕組みです。Claude Codeの基本的な動作は、ローカルのファイルを読み書きしターミナルコマンドを実行することで、このブラウザ内蔵エディタは対象に含まれません。オープンソースCLIのclaspでApps Scriptプロジェクトをローカルファイルとして扱えば、Claude Codeはいつもの手順でコードを書き、clasp pushでGoogleのサーバーへ反映できます。
ローカル開発が前提になる理由と準備するもの
Apps Scriptは、Gmail・Googleカレンダー・ドライブなどWorkspaceアプリ用の組み込みライブラリをあらかじめ備えたプラットフォームです。コードは最新のJavaScriptで書き、インストール作業なしでブラウザ内のエディタから実行できます。スクリプトはユーザーのドライブに保存され、実行自体はGoogleのサーバー側で行われます。
この設計のままでは、ファイルとコマンドを前提にしたClaude Codeの出番がありません。ブラウザ内蔵エディタのテキストボックスは、ファイルでもコマンドでもないからです。そこでGoogleが公開しているオープンソースCLIclaspを使い、Apps Scriptプロジェクトをローカルのディレクトリとして管理します。clasp pushでドライブへアップロードする仕組みのため、Claude Codeは通常のコーディングと同じ「ファイルを編集してコマンドを実行する」流れでGASを書けます。
Apps Scriptとは、スプレッドシート・ドキュメント・フォームにカスタムメニューやダイアログを追加したり、スプレッドシート専用のカスタム関数やマクロを作ったりできる開発プラットフォームです。ウェブアプリとして公開する、Gmail・カレンダー・AdSenseなど他のGoogleサービスと連携する、Workspace Marketplace向けの軽量なアドオンを作るといった用途にも使えます。Sheets/Docs自動化スクリプトと一口に言っても、トリガーで動く裏方の処理からユーザーが操作するアドオンまで幅があります。
始める前に、次を用意します。
- Node.jsバージョン20.0.0以降(
claspはNode.jsで書かれ、npmで配布) - npm
- Googleアカウント(Apps Scriptプロジェクトの保存先になる)
- Apps Script APIの有効化(初回のみ
script.google.com/home/usersettingsから)
ステップ1 claspでプロジェクトを作成する
claspはnpmパッケージとして配布されているので、グローバルインストールしてからログインします。
npm install -g @google/clasp
clasp loginclasp loginはブラウザを開いてGoogleアカウントの認可を求めます。ログインが済めば、以降のコマンドはこのアカウント名義でApps Scriptプロジェクトを操作します。
プロジェクトの作成はclasp createです。--typeでどのGoogleサービスに紐づけるかを指定します。
mkdir sheets-automation && cd sheets-automation
clasp create --type sheets --title "在庫レポート自動化"--typeに指定できる値はstandalone docs sheets slides forms webapp apiの7種類です。docs sheets slides formsを選ぶと、対応するファイル形式に添付された「コンテナバインド」スクリプトが新規作成されます。既存のスプレッドシートやドキュメントに追加したい場合は、そのファイルのIDを--parentIdに渡します。指定を忘れると、意図せず新しいファイルが作られる点に注意します。
コマンドを実行すると、カレントディレクトリに2つのファイルが生成されます。スクリプトIDを保存する.clasp.jsonと、プロジェクトメタデータを持つappsscript.json(マニフェスト)です。Claude Codeが編集するのは主にこのマニフェストと、これから追加する.jsファイルになります。
すでにブラウザのエディタで書いたスプレッドシート付属のスクリプトをローカルへ持ち出したい場合は、新規作成でなくclasp clone <スクリプトID>を使います。スクリプトIDは、対象のApps Scriptプロジェクトを開き、プロジェクトの設定画面からコピーできます。
ステップ2 Claude Codeにコードを書かせる
ファイルが揃えば、あとは通常のコーディングと同じ流れです。要件を自然文で伝えます。
スプレッドシートのB列に入力された在庫数をもとに、
10個未満の行のA列を黄色でハイライトするonEditトリガーを
Code.jsに書いてApps Scriptのランタイムは、SpreadsheetAppやDocumentAppのような組み込みサービスをあらかじめ提供しているため、npmでのパッケージ追加は不要です。Claude Codeが書くコードも通常のGASと同じで、トップレベルに定義した関数がそのままトリガーやカスタム関数として認識されます。
function onEdit(e) {
const range = e.range;
if (range.getColumn() !== 2) return;
const sheet = range.getSheet();
const qty = range.getValue();
sheet.getRange(range.getRow(), 1)
.setBackground(qty < 10 ? "#fff59d" : null);
}承認スコープを明示的に絞りたいときは、appsscript.jsonのoauthScopesにURL文字列で追加します。何も書かなければ、Apps Scriptがコードから使用中のサービスを検出してスコープを自動的に決めます。
モダンなconst letやアロー関数を使うには、マニフェストのruntimeVersionに"V8"を指定します。この項目を省略した場合のデフォルトランタイムはSTABLEで、Google公式マニフェストの説明では現状Rhinoエンジンを指すとされています。新規プロジェクトでも明記しておくと安全です。
ステップ3 pushしてデプロイ・実行を確認する
コードを保存したら、ローカルからドライブへアップロードします。
clasp push確認なしで上書きしたい場合はclasp push --forceを使います。反映結果はブラウザのApps Scriptエディタでそのまま確認でき、clasp open-scriptで開けます。
スクリプトを初めて実行するとき(トリガーの初回発火やメニューからの手動実行時)、Googleは承認フローを開始します。コードが要求する権限をOAuthスコープとして人間が読める形で一覧表示し、ユーザーが個別に許可する仕組みです。たとえばスプレッドシートへの読み取り専用アクセスなら「Googleスプレッドシートの閲覧」という文言で提示されます。Apps Script IDEなど一部の画面では、権限を一括ではなく個別に選べるきめ細かな同意画面が出るため、Claude Codeに書かせるコードもユーザーが一部だけ許可する前提で動くよう設計しておくと安全です。
ウェブアプリやアドオンとして公開する場合は、まずイミュータブルなバージョンを作成してからデプロイします。
clasp version "初回リリース"
clasp deployデプロイの一覧確認はclasp deployments、既存デプロイを新しいバージョンへ差し替えるにはclasp redeploy <deploymentId> <version> <description>、取り下げにはclasp undeploy <deploymentId>を使います。
よくあるつまずき
コンテナバインドとスタンドアロンを混同する: clasp create --type sheetsは新しいスプレッドシートを作ってそこにスクリプトを紐づけます。既存のシートに追加したい場合は、対象ファイルのIDを--parentIdで渡さないと、無関係な新規ファイルが増えていきます。
pushは成功したのにコードが変わらない: .clasp.json内のscriptIdが、実際にpushしたいプロジェクトと一致しているか確認します。複数プロジェクトをclasp cloneで切り替えていると起きやすいつまずきです。
401 Unauthorizedで止まる: ログインセッションが切れるとこのエラーになります。clasp loginを再実行して認可をやり直します。
CI/CDではブラウザ認証が使えない: GitHub Actionsのようなターミナルの無い環境では、clasp loginのブラウザOAuthフローが実行できません。認証トークンはホームディレクトリの.clasprc.json(プロジェクトごとの.clasp.jsonとは別ファイル)に保存されるので、ローカルでログインして生成されたこの.clasprc.jsonの中身をGitHub Secretsへ保存し、ワークフロー内でファイルへ書き出してからclasp push --forceを呼ぶ構成にします。.clasp.jsonはスクリプトIDを持つだけなのでSecretsに置く必要はなく、リポジトリに含めます。開発・ステージング・本番を分けたい場合は、環境ごとに個別のApps Scriptプロジェクトを作り、CLASPRC_JSON_DEV CLASPRC_JSON_STAGING CLASPRC_JSON_PRODのように認証トークンを別々のシークレットとして保存し、デプロイするブランチに応じて書き込む.clasprc.jsonを切り替えます。
CIでの認証エラーは症状ごとに原因が絞り込めます。「Script APIが有効になっていません」はscript.google.com/home/usersettingsで有効化すれば解消し、「ENOENT .clasp.json」は認証情報をファイルへ書き出すステップがclasp pushより前に実行されているかを確認します。
スコープの自動検出に頼りすぎる: 個人用スクリプトなら自動検出で困りませんが、公開するアドオンでは必要最小限のスコープに絞ることが推奨されています。読み取りだけならspreadsheetsでなくspreadsheets.readonlyのように、狭いスコープをoauthScopesへ明示します。
Claude CodeでGoogleサービスを自動化する他の手段との使い分け
Google Workspaceの自動化にClaude Codeを使う手段は、claspによるローカル開発だけではありません。目的に応じて向き不向きがあります。
| 手段 | おすすめ度 | 理由 |
|---|---|---|
| clasp + Claude Code(本記事) | おすすめ度◎ | 理由トリガーやカスタム関数をコードとして継続的に管理・デプロイしたい場合に向く |
| Apps Scriptエディタで直接編集 | おすすめ度△ | 理由数行の修正で済む単発作業には手早いが、Claude Codeの支援やGitでのレビューは受けられない |
| Claude CodeのChrome連携でDocsに書き込む | おすすめ度○ | 理由ログイン済みのDocsにその場で文章を打ち込みたい、API設定なしの単発ドラフト作成に向く |
| Google CloudのMCPサーバー | おすすめ度△ | 理由Workspaceでなく、BigQueryやCompute EngineなどGCPリソースの操作が目的なら適している |
claspはコードをバージョン管理し、GitHub Actionsで継続的にデプロイできる点がChrome連携との一番の違いです。Chrome連携は認証設定が要らないぶん、思いついた瞬間にDocsへ書き込めます。「Claude Codeが外部CLIを呼び出してコードとして管理する」という型そのものはant CLIでAPIリソースをスクリプトで自動化するでも扱っており、認証情報の扱い方は共通しています。
まとめ
Google Apps ScriptをClaude Codeに書かせるには、ブラウザエディタでなくclaspでローカルにプロジェクトを持ち出すのが起点です。clasp createで雛形を作り、Claude Codeにコードを書かせ、clasp pushで反映する流れは通常のコーディングと変わりません。初回実行時のOAuth承認と、CI/CDに組み込む場合の認証情報の扱いだけは事前に押さえておくとスムーズです。