🙆‍♀️

Claude上でGAS開発はどこまでできるのか?Bun × TypeScript × claspで検証してみた

に公開

これは「【初心者優先枠】情シスSlack #2 Advent Calendar 2025」の23日目の記事です。
https://adventar.org/calendars/11541

ごきげんよう🌸@bboobbaaです!

今年はClaudeの会社AnthropicがBunを買収しました。
Bunの勉強がてら、Claude上で完結するGAS開発環境を作れないか検証してみました。

結論から言うと、ビルドまではできたけど、デプロイはできなかったです。
でも、その過程で得た知見を共有します!

やりたかったこと

ドメインメールがあるのですがあまり利用していないこと・確認めんどいのでGmailに転送してます。
大事なメールが届くのですが見逃しがちなので、これをClaude上で対話しながらSlack通知するスクリプトを構築します。

Claudeに「メール通知スクリプト作って」と言うだけで、環境構築からデプロイまで全自動でうごくことを目指します。

なぜClaudeでBunとTypeScriptをつかうのか

Claude連携のよいこと

  • 自然言語で「○○したい」と伝えるだけで実装してくれる
  • 環境構築からデプロイまで自動化(したかった)
  • エラーが出たら原因を分析して修正案を提案

Bunのよいこと

  • npm/yarnより高速
  • TypeScriptをそのまま実行できる
  • AnthropicがBunを買収したし、Claude環境で使えるのでは?と期待

実際にClaude上で試した結果

✅ できたこと

1. Bunのインストール

最初、curl -fsSL https://bun.sh/install | bash は403エラーでブロックされました。
Claude 環境上でbun.shのホストが利用できないようです。

しかし、npmからのインストールは成功!

npm install -g bun
bun --version  # 1.3.5

Claude環境でBunが動くことを確認できました。

2. プロジェクトの初期化と依存関係のインストール

mkdir gas-project && cd gas-project
bun init -y
bun add -d @google/clasp @types/google-apps-script typescript esbuild

問題なく動作しました。

3. TypeScriptのビルド

Claudeに設定ファイルを作ってもらい、ビルドが成功しました。

bun run build
# ✅ Build complete: dist/Code.js

4. clasp認証

ローカルで取得した .clasprc.json をClaude環境にペーストして配置したところ、認証が通りました。

bun x clasp status
# Tracked files:
# └─ dist/appsscript.json
# └─ dist/Code.js

❌ できなかったこと

clasp push / clasp create

bun x clasp create --title "TestFromClaude" --type standalone --rootDir ./dist

結果:

request to https://script.googleapis.com/v1/projects failed, 
reason: getaddrinfo EAI_AGAIN script.googleapis.com

Google Apps Script API(script.googleapis.com)へのアクセスがブロックされていました。

curl -I https://script.googleapis.com
# HTTP/1.1 403 Forbidden
# x-deny-reason: host_not_allowed

Claude環境では、許可されたドメインのみにアクセスできる仕様のようです。

結果まとめ

項目 状態
Bun インストール(npm経由) ✅ 動作
bun install ✅ 動作
bun run build ✅ 動作
TypeScript -> JS 変換 ✅ 動作
clasp 認証(.clasprc.json) ✅ 認証OK
clasp push/create ❌ script.googleapis.com がブロック

対話ログ(実際のやりとり)

実際にClaudeとどんな対話をしたか、一部を紹介します。

環境構築の依頼

私:

GASをTypeScriptで書く環境をBunで作りたいです。claspを使います。

Claude:
Bunがインストールされていなかったので、まずインストールを試みました。
bun.sh へのアクセスがブロックされたため、npm経由でインストール。
その後、プロジェクトの雛形を作成してくれました。

設定ファイルの作成

私:

tsconfig.jsonとpackage.jsonのscriptsを設定してください。

Claude:
Bun + GAS用に最適化した設定を生成:

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "types": ["google-apps-script", "bun-types"]
  }
}
// package.json scripts
{
  "build": "bun run scripts/build.ts",
  "push": "bun run build && bun x clasp push",
  "login": "bun x clasp login",
  "open": "bun x clasp open"
}

対話なしでの実行を模索

私:

Claude上でこのコマンドを自動実行できますか?

Claude:
clasp login はブラウザ認証が必要なので対話なしでは無理です。
ただし、.clasprc.json を直接配置すれば認証をスキップできます。

私:

.clasprc.json(ソースを貼り付け)

Claude:
認証ファイルを配置して clasp status -> 成功!
しかし clasp create -> script.googleapis.com がブロックされて失敗。

得られた知見

1. Claude環境でBunは動く

npm経由でインストールすれば、Bunは問題なく動作します。
ビルドスクリプトの実行も高速でした。

2. clasp認証は.clasprc.jsonで突破できる

ローカルで一度 clasp login して取得した認証情報をコピーすれば、
対話なしでclaspの認証を通せます。

# ローカルで実行
clasp login
cat ~/.clasprc.json  # これをコピー

3. Google APIへのアクセスはブロックされている

Claude環境では、セキュリティ上の理由で外部APIへのアクセスが制限されています。
script.googleapis.com はその対象でした。

4. ビルドまでの自動化は可能

デプロイはできませんが、以下のワークフローは可能でした。

  1. Claudeに「GASスクリプト作って」と依頼
  2. TypeScriptで実装してもらう
  3. ビルドしてCode.jsを生成
  4. 生成されたファイルをダウンロード
  5. ローカルで clasp push を実行

今後への期待

要望

Claude環境で script.googleapis.com へのアクセスを許可してもらえれば、
GAS開発が完全に自動化できます。

現時点での現実的なワークフロー

[Claude上]
1. 「○○するGASを作って」と依頼
2. TypeScriptで実装
3. bun run build でビルド
4. ZIPでダウンロード

[ローカル]
5. bun run push でデプロイ

最後の一手だけローカルが必要ですが、それでも十分楽になりました。

サンプルコード

Claudeが生成してくれた、メール転送通知のスクリプトです。

// src/main.ts
function processForwardedEmails(): void {
  const WEBHOOK = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL';
  const TARGET = 'info@example.com';
  
  const threads = GmailApp.search(`to:${TARGET} is:unread`, 0, 5);
  
  if (threads.length === 0) {
    Logger.log('新しいメールなし');
    return;
  }
  
  threads.forEach(thread => {
    const msg = thread.getMessages()[0];
    const subject = msg.getSubject();
    const from = msg.getFrom();
    
    UrlFetchApp.fetch(WEBHOOK, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify({
        text: `📧 ${subject}\nFrom: ${from}`
      })
    });
    
    thread.markRead();
    Logger.log(`処理完了: ${subject}`);
  });
}

型定義のおかげで、GmailApp.search などの補完が効きます。

まとめ

できたこと

  • ✅ Claude上でBunが動く(npm install -g bun)
  • ✅ TypeScript + esbuild でGAS用にビルド
  • ✅ clasp認証を.clasprc.jsonで突破
  • ✅ 対話しながらコード生成・改善

できなかったこと

  • ❌ clasp push / create(Google APIがブロック)
  • ❌ 完全自動デプロイ

結論

Claude × Bun × TypeScriptでGAS開発の敷居は下がりました!
ただし、デプロイだけはローカルで実行が必要です。

それでも、コード生成からビルドまでをClaudeに任せられるのは楽ちんだと思いました。
ClaudeからGoogle APIへアクセスすることができるともっと楽になりそうですね。

Discussion