Claude上でGAS開発はどこまでできるのか?Bun × TypeScript × claspで検証してみた
これは「【初心者優先枠】情シスSlack #2 Advent Calendar 2025」の23日目の記事です。
ごきげんよう🌸@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. ビルドまでの自動化は可能
デプロイはできませんが、以下のワークフローは可能でした。
- Claudeに「GASスクリプト作って」と依頼
- TypeScriptで実装してもらう
- ビルドしてCode.jsを生成
- 生成されたファイルをダウンロード
- ローカルで
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