GAS:GoogleAppsScript

【GAS×Gemini API】AI要約が突然失敗する原因とは?「503エラー」の罠と確実な解決策

この記事は約5分で読めます。

GASのエラー対策Google Apps Script(GAS)とGemini APIを連携させて、毎日のチャットツール(Chatworkなど)の投稿を自動でAI要約するシステムを運用していると、ある日突然「要約が生成されない」というトラブルに見舞われました。
今回は、実際に直面した不具合から、原因を突き止めるまでの仮説検証プロセス、そして最終的な解決策を備忘録としてまとめました。同じ現象で困っている方の参考になれば幸いです。

GASのエラー原因と対策について

GASのエラー対策

起きていた不具合:サイレント・エラーの恐怖

今回のシステムでは、GASのトリガーを使って毎日決まった時間にAI要約を生成していました。しかし、スプレッドシートやダッシュボードには「AI要約の生成に失敗しました」というメッセージだけが残るようになってしまいました。

一番厄介だったのは、GASの実行ログ上は「完了(成功)」ステータスになっていたことです。

コード内で UrlFetchApp.fetch を使う際、muteHttpExceptions: true を設定していたため、API側でエラーが起きてもGASのスクリプト自体は停止せず、エラーが「握りつぶされている」状態になっていました。

原因追求と仮説検証のプロセス

なぜ要約が生成されないのか? 以下の手順で仮説を立てて検証を進めました。

仮説①:指定しているGeminiのモデルが古く(または無効に)なっている?

AIモデルのアップデートは非常に早いです。以前使えていた gemini-1.5-flash などのモデルが廃止されていたり、エンドポイントが存在しなかったりする可能性を疑いました。

モデルが現在も使えるかどうかを生成AIを使って調べてみました。

gemini-3.1-flash も404が出ている点が気になります。変更後の優先順位は以下でよいですか?

  1. gemini-3.1-flash-lite-preview(最優先・preview版)
  2. gemini-2.5-flash(安定版フォールバック)
  3. gemini-3.1-flash(3番目に降格)

gemini-3.1-flash は404が出ていますが、将来的にエンドポイントが有効化される可能性もあるので3番目として残す形です。もし完全に外したければそれも可能です。

【対策】
APIを呼び出す際のフォールバック(代替)モデルのリストを最新の状態に更新しました。

最優先: gemini-3.1-flash-lite-preview (処理が速く軽量なプレビュー版)
安定版: gemini-2.5-flash (確実に応答を返すための要)

gemini-3.1-flashは利用モデル一覧から外しました。

AIが体感2倍速&1/4価格に!Gemini 3.1 Flash-Liteが中小企業「自作DX」の起爆剤となる
どもどもAIです。AIエージェントとして、今日も未来のビジネスヒントをお届けします。Googleが新しいAIモデル「Gemini 3.1 Flash-Lite」を発表しました。このモデルは、従来のAIに比べて「高速・低価格」を大きく前進させ...

なお、gemini-3.1-flashは実装されたからどんどん人気が高くなってきているようです。

仮説②:API側で何らかのHTTPエラーが起きている?

先述の通り、エラーが握りつぶされていたため、レスポンスコードが 200 (OK) 以外だった場合に、しっかりとエラー内容をログに出力するようにコードを修正しました。

JavaScript
// 修正したエラーハンドリングの一部
const responseCode = response.getResponseCode();
const responseText = response.getContentText();

if (responseCode === 200) {
// 成功時の処理
} else {
// 失敗時は詳細をログに記録!
console.warn(`${model.name} のAPIリクエストエラー (${responseCode}): ${responseText}`);
}

この修正を加えた上で再度スクリプトを実行してみると、ついに真犯人が姿を現しました。

実行ログではエラーが記録されていました

APIリクエストエラー (503): { “code”: 503, “message”: “This model is currently experiencing high demand. Spikes in demand are usually temporary. Please try again later.”, “status”: “UNAVAILABLE” }

根本原因の特定:無料枠の限界

ログに出力された 「503エラー (Service Unavailable)」。これがすべての原因でした。

エラーメッセージを読み解くと、「現在、このモデルには非常に多くのリクエストが集中しています(高負荷状態)。」と書かれています。

コードにバグがあったわけでも、プロンプトが悪かったわけでもありません。世界中からGemini APIへのアクセスが殺到し、Googleのサーバーがキャパシティオーバーを起こしてリクエストを拒否していたのです。

Google AI StudioのAPIには「無料枠」がありますが、無料枠はリクエストの優先度が低く設定されています。そのため、サーバー全体が混雑した際、無料枠のユーザーは優先的にこのような503エラーで弾かれやすくなってしまいます。

解決策:APIを有料枠(従量課金)へ変更する

この問題の最も確実な解決策は、Gemini APIを「無料枠」から「有料枠(Pay-as-you-go)」に切り替えることです。

有料枠に設定することで、リクエストの優先順位が上がり、サーバーのリソース枠も拡大されます。実際に今回のケースでも、課金設定に切り替えた途端、これまで頻発していた503エラーがピタリと止まり、安定してAI要約が生成されるようになりました。

API無料枠には制限があります

💡 コストに関するワンポイント

「有料枠」と聞くと高額な請求が怖いかもしれませんが、テキストの要約程度であれば、月に数十円〜数百円程度に収まることがほとんどです。念のため、Google Cloudのコンソールで「月に500円を超えたら通知する」といった予算アラートを設定しておけば、安心して運用できます。

まとめ:GASのAPI利用安定稼働のためにやっておくべきこと

エラーを握りつぶさない: UrlFetchApp.fetch を使う時は、必ずレスポンスコードを確認し、200以外ならログに残す設計にする。

最新のモデルを追う: 常に利用可能な最新モデルを確認し、フォールバック(リトライ)の仕組みを用意する。

業務利用なら有料枠を検討する: 毎日確実に動かす必要があるツールであれば、微小なコストを払ってでも「有料枠」で安定性と優先権を買うのがベストプラクティスです。

以下の関連記事もご覧になってください。

GAS:GoogleAppsScript

GASはGoogleが提供しているスクリプトです。JAVA形式で記述する「Google Apps Script」のことを指すことが多いですが、ノーコードで記入できる「Google App Sheet」もGASといわれています。
簡易な開発案件ならGASで可能になりました。エクセルのような仕様なら、IT事業者に外注しなくても社内で開発し運用することも可能です。

プログラミング知識ゼロでもできます!Geminiと一緒に作るChatwork日報の自動集計&ダッシュボード
「日報をChatwork(チャットツール)で報告しているけれど、過去の記録がどんどん流れていってしまい、誰がどれくらい投稿しているのか振り返りにくい…」 そんなお悩みはありませんか?今回は、Googleの「GAS(Google Apps S...

▼無事に再稼働したGASアプリの画面です

GASアプリの画面