GEMINI LABEN
PRO35 — Gemini 3.5 Proのリリース目標が7月17日と報じられています。ただし日付・コンテキスト長・価格のいずれもGoogleの公式発表ではありませんREBUILD — 2.5 Proのアーキテクチャを白紙化した全面再設計とされ、再帰的なツール呼び出しとSVG生成での構造的な失敗が理由と報じられていますFLASH35 — 広く提供中の最新リリースはGemini 3.5 Flash。コーディング・エージェント・マルチモーダル・長文書処理を高速かつ低コストで担いますSAATHI — Gemini 3.5 Flashを核にしたATL Saathiが、インドの100校でパイロット開始。教員向けに24時間対応の授業計画・研修アシスタントを提供しますSEA — 東南アジアレポートでは、プロンプトの約70%が現地語(ベトナム89%・タイ87%・インドネシア84%)。リクエストの約4分の3がモバイル発ですSHEETS — 7月15日から、AI Expanded Accessライセンス保有者はFill with GeminiとSheetsのAI関数の利用上限が引き上げられましたPRO35 — Gemini 3.5 Proのリリース目標が7月17日と報じられています。ただし日付・コンテキスト長・価格のいずれもGoogleの公式発表ではありませんREBUILD — 2.5 Proのアーキテクチャを白紙化した全面再設計とされ、再帰的なツール呼び出しとSVG生成での構造的な失敗が理由と報じられていますFLASH35 — 広く提供中の最新リリースはGemini 3.5 Flash。コーディング・エージェント・マルチモーダル・長文書処理を高速かつ低コストで担いますSAATHI — Gemini 3.5 Flashを核にしたATL Saathiが、インドの100校でパイロット開始。教員向けに24時間対応の授業計画・研修アシスタントを提供しますSEA — 東南アジアレポートでは、プロンプトの約70%が現地語(ベトナム89%・タイ87%・インドネシア84%)。リクエストの約4分の3がモバイル発ですSHEETS — 7月15日から、AI Expanded Accessライセンス保有者はFill with GeminiとSheetsのAI関数の利用上限が引き上げられました
記事一覧/Workspace 連携
Workspace 連携/2026-07-16上級

=GEMINI() を420行に貼って気づいたこと — カスタム関数をやめ、値で書き戻すまでの実測

Sheets のカスタム関数から Gemini を呼ぶ構成は、動いた瞬間がいちばん美しく、そこから伸びません。30秒の壁・制御できない再計算・書き戻せない結果という3つの性質を実測で確かめ、値で書き戻す設計へ移すまでの手順とコードを残します。

gemini-workspace6apps-script11google-sheets2コスト管理15個人開発88

プレミアム記事

#ERROR! が並んだ列を最初に見たとき、私はプロンプトを疑いました。セルのノートには Exceeded maximum execution time (line 0). とだけ書かれています。420行のうち37行。プロンプトは同じ、モデルも同じ、入力の長さもたいして変わりません。壊れているのは特定の行ではなく、行が並んでいるという状況そのものでした。

個人開発でアプリのレビュー要約をスプレッドシートに集めていて、C列に本文、D列に =GEMINI_SUMMARY(C2) を貼る、という素朴な構成を試したときのことです。10行で試したときは気持ちよく動きました。数式をコピーして420行に伸ばしたところで、この構成が持っている性質が一度に表に出てきました。

厄介だったのは #ERROR! そのものではありません。その週の終わりに使用量を見て、私が数式を貼ったのは420セルなのに、呼び出しは1,180回に達していたことのほうです。誰も新しい行を足していない朝にも、数字は静かに増えていました。

セルの数だけ、独立に呼ばれています

公式ドキュメントは最適化の節で、この構成の核心をはっきり書いています。「スプレッドシートでカスタム関数が使われるたびに、Sheets は Apps Script サーバーへの個別の呼び出しを行う」。数十・数百・数千のカスタム関数呼び出しがシートにあると、この過程は遅くなる、と。

つまり =GEMINI_SUMMARY(C2) を420セルに貼るというのは、420個の独立したリクエストを1枚のシートに埋め込むことと同じです。1つのジョブが420行を順に処理するのではありません。420個の別々の実行が、それぞれ自分の30秒を持って走ります。

この違いが効いてくるのは、失敗したときと、増幅したときです。420行のバッチなら「どこまで進んだか」を1箇所で持てます。420個の独立実行では、進捗という概念そのものがどこにも存在しません。あるのは、たまたま値が入っているセルと、たまたま #ERROR! になっているセルだけです。

Google 自身がカスタム関数のサンプルとして「ADK エージェントと Gemini モデルで記述をファクトチェックする」例を公開しています。よくできた入口だと思います。ただ、入口の形のまま奥へ伸ばそうとすると、以下の性質にぶつかります。

誰も触っていない朝に、呼び出しだけが増えていた

再計算は、私が意図した瞬間には起きません。ドキュメントの記述はこうです。再計算を起こすには、参照するセルまたはレンジを引数として直接渡す必要がある。そうでなければ、数式を編集するか、参照先セルの値を変えるまで再計算されない、と。

裏を返すと、参照セルを引数として直接渡している限り、その参照先が変わるたびに再計算が走ります。私のシートでは、C列(レビュー本文)を触るたびにD列が丸ごと呼び直されていました。誤字を1つ直す、言語判定の列を差し込む、並べ替えのために列を移動する。どれも「編集」です。

さらに、引数は決定的(deterministic)でなければならない、という制約があります。NOW()RAND() のような揮発性の組み込み関数はカスタム関数の引数に使えません。使うと Loading... が永遠に消えなくなります。ここで多くの人が「なら現在時刻はセルに固定値で置こう」と考えますが、その固定値を更新した瞬間、それも編集として再計算の引き金になります。

私の1週間の内訳は、数えてみるとこうなりました。数字は私の手元のもので、シートの触り方でいくらでも動きます。ご自身の環境で数え直すための型として読んでいただければ幸いです。

きっかけ回数再計算された行呼び出し
最初に数式を420行へ展開1420420
C列の誤字修正(1セルずつ)232323
言語コード列の挿入・削除2420840 ではなく 654
スクリプト側のプロンプト調整で保存483
合計1,180

全行が毎回そろって走り直すわけではなく、キャッシュされた値がそのまま残る行もあります。だからこそ厄介で、「何回呼ばれたか」はシートを見ても分かりません。

貼った数式は420。実際の呼び出しは1,180。倍率にして2.8倍です。ここで大事なのは倍率の大きさではなく、この倍率が自分の操作と結びついていないことだと思っています。列を1本挿すという、コストと無関係に見える操作が、静かに数百回の課金を生んでいました。

自分のシートで数えるなら、まず呼び出し側に1行足すのがいちばん早いです。

/**
 * レビュー本文を要約します(計測付き・この形は本番向けではありません)。
 *
 * @param {string} text 要約するレビュー本文。
 * @return {string} 要約テキスト。
 * @customfunction
 */
function GEMINI_SUMMARY(text) {
  // 呼ばれた事実だけを先に記録する。実行ログ(表示 > 実行数)で件数を数えられます。
  console.log('GEMINI_SUMMARY invoked len=%s', String(text).length);
 
  const key = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const url = 'https://generativelanguage.googleapis.com/v1beta/models/'
    + 'gemini-flash-latest:generateContent?key=' + key;
 
  const res = UrlFetchApp.fetch(url, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({
      contents: [{ parts: [{ text: '次のレビューを1文で要約してください。\n\n' + text }] }],
    }),
    muteHttpExceptions: true,
  });
 
  if (res.getResponseCode() !== 200) {
    // カスタム関数から返せるのは値だけです。原因はここで潰れます。
    return '#GEMINI_ERROR';
  }
  const json = JSON.parse(res.getContentText());
  return json.candidates[0].content.parts[0].text.trim();
}

これを貼って1週間ふつうに使い、Apps Script ダッシュボードの実行数を眺めてみてください。私の場合、その数字が構成を変える決め手になりました。議論より先に、自分のシートの実測を1つ持つほうが早いです。

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

この記事の続きを読む

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

この記事で得られること
誰も触っていない週にも呼び出しが増える「再計算による課金増幅」を、自分のシートで数えるための計測コードと、420行で2.8倍だった実測の内訳を持ち帰れます
カスタム関数の30秒上限がバッチの6分上限とは別物であること、そして30秒が「1呼び出しで何行まで処理できるか」の天井をどう決めるかを、行あたりの実測から逆算できます
式をセルに置く構成から、ステータス列と値の書き戻しへ移すためのメニュー起動バッチの完全コードと、どこまでならカスタム関数のままでよいかの判断表が手に入ります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Workspace 連携2026-06-16
Apps Script から Gemini でスプレッドシート数千行を処理する — 6分の実行上限を越える分割と冪等性の設計
Apps Script の6分実行上限でスプレッドシートのバッチ処理が途中で止まる問題を、トリガー継続・ステータス列による冪等処理・指数バックオフで最後まで流し切る設計と実装をまとめます。
Workspace 連携2026-07-12
ローカルのファイルを任せる前に決めたこと — Gemini Spark を迎えるためのフォルダ境界とガードレール設計
ローカルのフォルダ整理を自律エージェントに任せる前に、内容ハッシュのマニフェスト・許可リスト・実行後の差分検証で不可逆な操作を防ぐガードレールを設計した実務メモです。
Workspace 連携2026-07-10
Apps Script の6分制限を跨いで Gemini Files API に大容量ファイルを再開アップロードする
Drive に置いた数百MBの動画や音声を Apps Script から Gemini Files API へ送る際、6分の実行時間上限とペイロード上限をどう跨ぐか。resumable upload の start / upload / query / finalize を分解し、中断しても壊れない転送を組み立てます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →