GASからChatGPTを呼ぶなら、
まず「安全な共通関数」を1つ。
ネットのサンプルをそのまま業務に使うと、APIキーの直書き・混雑時の429エラーで停止・トリガーの二重登録で課金が膨らむ・6分制限で途中終了、のどれかに必ず当たります。呼び出しを askAI("プロンプト") という1つの関数に集約して、対策をまとめて効かせるのが一番ラクです。
1. 5つの落とし穴と対策
| 落とし穴 | 無いとどうなるか | 対策 |
|---|---|---|
| APIキーをコードに直書き | コードを共有・スクショした瞬間に漏れる | スクリプト プロパティ |
| 429 / 5xx エラー | 混雑した時間帯に数十行に1回止まる | Retry-After→指数バックオフ |
| 残高不足の 429 | 待っても直らないのに待ち続ける | insufficient_quota は即エラー |
| 課金の暴走 | トリガー二重登録・ループで請求が増える | 1日の呼び出し上限 |
| 同じ文章の再送 | お金も時間も余分にかかる | CacheService で6時間再利用 |
| GASの6分制限 | 途中終了し、どこまで処理したか分からない | 5分で自主停止→続きから |
2. APIキーは「スクリプト プロパティ」へ
- Apps Script エディタ左の「⚙ プロジェクトの設定」を開く
- 一番下の「スクリプト プロパティ」→「スクリプト プロパティを追加」
- プロパティ名
OPENAI_API_KEY、値にsk-...を入れて保存
コードにはキーが残らないので、スクリプトをコピーして人に渡しても漏れません(プロジェクトの編集権限を渡すと見える点だけ注意)。
3. 心臓部:再試行してよいエラーだけ再試行する
const code = res.getResponseCode();
const text = res.getContentText();
// 残高不足の 429 は待っても直らないので即エラー
const quota = text.indexOf('insufficient_quota') >= 0;
const retryable = (code === 429 && !quota) || code >= 500;
if (!retryable || i === MAX_RETRIES) {
throw new Error('OpenAI API エラー HTTP ' + code + ': ' + text.slice(0, 300));
}
// Retry-After があれば従い、無ければ 1秒→2秒→4秒 +ゆらぎ
const h = res.getHeaders();
const ra = Number(h['Retry-After'] || h['retry-after']);
const waitMs = ra > 0 ? ra * 1000 : Math.pow(2, i) * 1000 + Math.floor(Math.random() * 500);
Utilities.sleep(Math.min(waitMs, 20000));
muteHttpExceptions: true を付けて UrlFetchApp を呼ぶと、エラー時も例外にならずに本文(エラーの種類)を読めます。
4. 1日の上限は LockService で数える
時間主導トリガーが同時に動くと、単純に getProperty → +1 → setProperty では数え漏れが出ます。LockService.getScriptLock() で囲んでから数え、日付キー(例:ai_calls_20260924)で管理すれば、翌日には自動でリセットされます。最初の上限は 50〜100回くらいから始めるのが安全です。
5. 大量の行は「5分で止まって、続きから」
ERROR: … と書いておき、消せば次回やり直し。上限に達したらその場で止めます。6. 注意点
- JSONモード(
response_format: json_object)を使うときは、プロンプトのどこかに「JSON」という単語が必要です(OpenAIの仕様)。 - 無料の Google アカウントでは UrlFetchApp の1日の呼び出し回数にも上限があります。大量処理は数日に分けてください。
- 送る文章は OpenAI の API に送信されます。個人情報を流さない・社内ルールで利用が許可されているかを先に確認してください。
- お客様に送る文章をAIに書かせる場合は、送信せず下書きに留めて人が確認する運用をおすすめします。
7. コード全文(無料)
キャッシュ・1日の上限・JSONモード・動作確認用関数まで入った askAI() の全文(約110行)と一括処理のサンプルは、Zenn の解説記事として順次公開します。GAS×ChatGPT自動化の基本は無料の Zenn 本にまとめています。
この土台の上に、業務用スクリプトを載せたい方へ
Gmail 問い合わせの返信下書き・請求書PDF+送付メール・議事録の要点とTODO整形など、そのまま動く GAS 5本と日本語の導入手順書のセットです(どれも送信はせず下書きまで)。
そのまま動くGAS5本+導入ガイド【PRO版・$39】を見る → スプレッドシート =AI() 関数・一括処理つき拡張版($3)→ Gmail問い合わせ AI 下書き返信・拡張版($3)→手で貼って使うプロンプトだけ欲しい方へ:事務AIプロンプト集12種(無料・投げ銭歓迎)
Gumroad での販売です。このページの askAI() 関数自体は無料公開予定で、有料版に同梱されているものとは別物です。必要なのは Google アカウントと OpenAI の API キー(従量課金)。AI の答えは誤りを含む可能性があります。デジタル納品のため、ダウンロード後の返金はお受けできません(不具合時は誠実に対応します)。
自分で設定するのが不安な方へ(ココナラ・日本円):シート1列のAI一括処理と、当日分の自動サマリーメールのGAS2本+日本語手順書を、ココナラで販売しています(3,000円・税抜〜)。初期設定サポート(+4,000円)や、あなたの実データで自動化フローを1つ一緒に作る導入伴走(+12,000円)は任意のオプションです(いずれも税抜)。対応できるかは購入前の見積り相談で確認できます。
ココナラで導入相談・購入する →スプレッドシートに =AI() 関数を自作 · フォーム問い合わせをAIで振り分け · Gmail問い合わせをAIで下書き返信 · 請求書PDF+AI添え状メール · 無料本:GAS×ChatGPT事務自動化の基本