GEMINI LABEN
SPARK — GoogleのエージェントアシスタントGemini SparkがmacOSのGeminiアプリに登場し、タスクを自律的に代行しますBRIEF — Personal Intelligenceを活用したDaily BriefがGmailやカレンダーから優先事項をまとめ、次の一手を提案しますMODEL — Gemini 3.5 FlashがGA(正式版)となり、100万トークンのコンテキストで低コスト・高速な処理に対応しますGROWTH — Geminiアプリの月間アクティブユーザーが9億人を突破し、1年前の4億人から大きく成長しましたAPPS — SparkはGoogle TasksやGoogle Keepと連携し、話題をリアルタイムに追いかけられるようになりましたENTERPRISE — Gemini 3.5 FlashがGlobal・US・EUのGemini Enterpriseで一般提供されていますSPARK — GoogleのエージェントアシスタントGemini SparkがmacOSのGeminiアプリに登場し、タスクを自律的に代行しますBRIEF — Personal Intelligenceを活用したDaily BriefがGmailやカレンダーから優先事項をまとめ、次の一手を提案しますMODEL — Gemini 3.5 FlashがGA(正式版)となり、100万トークンのコンテキストで低コスト・高速な処理に対応しますGROWTH — Geminiアプリの月間アクティブユーザーが9億人を突破し、1年前の4億人から大きく成長しましたAPPS — SparkはGoogle TasksやGoogle Keepと連携し、話題をリアルタイムに追いかけられるようになりましたENTERPRISE — Gemini 3.5 FlashがGlobal・US・EUのGemini Enterpriseで一般提供されています
記事一覧/Workspace 連携
Workspace 連携/2026-07-08上級

Apps Script の Gemini 自動化が月末に必ず止まる — UrlFetch 日次上限を溶かさない予算ガバナー設計

Apps Script から Gemini を呼ぶ自動化は、6分上限やトリガー本数とは別に UrlFetch の日次呼び出し上限で静かに止まります。件数が増えた日だけ落ちる問題を、日次予算ガバナーとバックログ繰り越しで捌き切る設計と動くコードにまとめます。

Apps Script5Gemini API174UrlFetchAppGoogle Workspace14自動化25

プレミアム記事

月末になると、決まって同じ自動化が止まっていました。

私は個人開発でいくつかのアプリを運営していて、そのうちのいくつかはユーザーレビューへの返信文の下書きや、壁紙の新規追加分へのタグ付けを Apps Script から Gemini に投げて回しています。ふだんは何事もなく流れているのに、月のうち数日だけ、実行ログに見慣れないエラーが残る。しかも決まって、レビューがどっと増えた翌日でした。

最初はレート制限(429)を疑いました。けれど 429 なら指数バックオフで捌けるはずです。ログをたどると、止まっていたのは Gemini 側ではなく Apps Script 側でした。Service invoked too many times for one day: urlfetch ——UrlFetch の日次呼び出し上限に当たっていたのです。

この記事は、6分の実行上限でもトリガー本数の上限でもない、UrlFetchApp日次呼び出し上限という第3の天井に焦点を当てます。件数が平常運転のうちは見えず、増えた日だけ牙をむくこの制約を、日次予算ガバナーとバックログの繰り越しで静かに捌き切る設計を、動くコードと実測シミュレーションでまとめます。

3つ目の天井は「1日に何回 UrlFetch を呼べるか」

Apps Script で Gemini 自動化を組むと、規模が大きくなるにつれて別々の上限に順番にぶつかります。よく知られているのは実行時間とトリガーですが、UrlFetch の日次上限はその陰に隠れがちです。

ぶつかる制約何が上限かconsumer (gmail.com)Google Workspace
実行時間上限1回の実行の最長時間6 分 / 実行30 分 / 実行
トリガー合計実行時間1日のトリガー総実行時間90 分 / 日6 時間 / 日
UrlFetch 日次呼び出し1日に UrlFetch を呼べる回数20,000 回 / 日100,000 回 / 日

実行時間の壁は、処理を分割して次のトリガーへ引き継げば越えられます。トリガー本数の壁は、単一ディスパッチャに束ねれば越えられます。けれど UrlFetch の日次上限だけは性質が違います。分割しても束ねても、1日に発行できる呼び出しの総数は変わらないからです。Gemini を1件ごとに1回呼ぶ設計なら、その日に処理する件数がそのまま上限に効きます。

実行時間やトリガー本数の詰まりについては、以前に別の記事で扱いました。この記事は、それらをすべて解決してもなお残る「1日に呼べる回数」の問題を扱います。関連する設計としてApps Script の6分実行上限を越える分割と冪等性の設計時間主導型トリガーを一本のディスパッチャに束ねる設計も併せてご覧いただければ、3つの天井が別物であることがはっきりします。

素朴な実装は、増えた日に上限を溶かす

まず、私が最初に書いていた素朴な処理を示します。トリガーが起きるたびに、未処理の行をすべて拾って Gemini に投げる——ふだんはこれで足ります。

// Before: 未処理を毎回まとめて処理する(増えた日に落ちる)
function enrichPendingRows() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('reviews');
  const rows = sheet.getDataRange().getValues();
 
  for (let i = 1; i < rows.length; i++) {
    if (rows[i][STATUS_COL]) continue;      // 済みは飛ばす
    const draft = callGemini(rows[i][TEXT_COL]);   // ← 1件ごとに UrlFetch 1回
    sheet.getRange(i + 1, STATUS_COL + 1).setValue('done');
    sheet.getRange(i + 1, DRAFT_COL + 1).setValue(draft);
  }
}
 
function callGemini(text) {
  const res = UrlFetchApp.fetch(GEMINI_ENDPOINT, {
    method: 'post',
    contentType: 'application/json',
    headers: { 'x-goog-api-key': 'YOUR_API_KEY' },
    payload: JSON.stringify({ contents: [{ parts: [{ text: text }] }] }),
    muteHttpExceptions: true,
  });
  return JSON.parse(res.getContentText()).candidates[0].content.parts[0].text;
}

このコードには、増えた日に必ず露呈する弱点があります。未処理件数に上限がないのです。ふだん1日3,000件なら 3,000 回強の UrlFetch で済みますが、機能リリース直後にレビューが 40,000 件増えた翌日は、43,000 件を一度に処理しようとして 46,000 回を超える UrlFetch を発行します。20,000 回の壁の手前で urlfetch の日次上限に達し、実行は途中で例外を投げて止まります。

さらに厄介なのは、止まる位置が毎回違うことです。何件目で落ちるかは、その日に他のスクリプトが何回 UrlFetch を使ったかにも左右されます。手前で止まった分は翌日に持ち越されますが、素朴な実装は「どこまで進んだか」を予算の観点で持っていないので、翌日もまた全件を一気に投げて同じ壁に当たる——月末の数日、これを繰り返していたわけです。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
6分実行上限・トリガー本数とは別の第3の天井である UrlFetch 日次呼び出し上限(consumer 20,000 回/日)が、件数が増えた日だけ自動化を落とす仕組みを再現コードで理解できます
Script Properties に日次予算台帳を持たせ、タイムゾーン境界でリセットする token-bucket 型ガバナーの完全な Apps Script コードを、そのまま貼って使えます
急増した日のバックログを翌日以降へ繰り越して捌き切る設計を、決定論シミュレーションの実数値(スパイク後3日で解消)つきで検証できます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Workspace 連携2026-04-09
Google Workspace × Gemini API 業務自動化の運用ノート — Apps Script 実装パターン12選と本番設計
Gemini API と Google Apps Script で Gmail・Docs・Sheets・Calendar を横断する業務自動化を組む実装パターン12選。4サイト運用とアプリ問い合わせ対応で踏んだ落とし穴を、429の握りつぶし・JSONフェンス・6分制限・モデル振り分けの実測付きで整理しました。
Workspace 連携2026-07-01
複数のトリガーが同時に書き込むと Gemini の結果が静かに消える — Apps Script の Properties 競合を畳む保管設計
Apps Script で Gemini の結果を複数のトリガーから保管すると、read-modify-write の競合と PropertiesService の容量制限で書き込みが静かに失われます。LockService と耐久シンク、冪等キーで取りこぼさない保管層を設計します。
Workspace 連携2026-06-29
Apps Script × Gemini 自動化の権限を最小に保つ — 明示スコープ設計とスコープ肥大の検知
Apps Script で Gemini 自動化を組むと OAuth スコープが静かに肥大します。appsscript.json に明示スコープを宣言し、肥大を CI で検知し、再同意の事故を避ける設計をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →