GEMINI LABEN
FLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりましたFLASH35 — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestが指す実体になりました。日常的な生成を速く安価にこなせますAGENTS — Gemini APIのManaged Agentsがpublic previewに。Google管理の隔離Linuxサンドボックスで自律的なエージェントを構築できますMEDIA — Nano Banana 2 Lite(画像)とGemini Omni Flash(動画・会話的編集)がAI Studio・API・Enterprise Agent Platformで利用可能にTTS — gemini-3.1-flash-tts-previewの音声生成がstreamGenerateContent経由でストリーミング対応になりましたTRANSLATE — 新しい音声モデルが70以上の言語を自動判別し、話者の自然な抑揚を保ったままライブ音声翻訳を行いますSPENDCAP — AI Studioにプロジェクト単位の費用上限が導入され、支出を安全側に抑えられるようになりました
記事一覧/Workspace 連携
Workspace 連携/2026-06-29上級

Apps Script × Gemini 自動化の権限を最小に保つ — 明示スコープ設計とスコープ肥大の検知

Apps Script で Gemini 自動化を組むと OAuth スコープが静かに肥大します。appsscript.json に明示スコープを宣言し、肥大を CI で検知し、再同意の事故を避ける設計をまとめました。

Apps Script6Gemini API182OAuthセキュリティ7Google Workspace15

プレミアム記事

ある朝、半年ほど静かに動いていた Sheets 連携の自動化を少し直してデプロイしたところ、再認可の画面が出ました。そこに並んでいたのは「Gmail のすべてのメールの読み取り、作成、送信、完全な削除」。直したのは Sheets に一行書き足す処理だけで、Gmail には一切触れていません。

それでも、その権限を求められました。

理由は単純で、私が以前テストで GmailApp を一度呼び、その行をコメントアウトしただけで消し忘れていたからです。Apps Script はコードを静的に走査して「使われていそうな API」からスコープを自動推定します。コメントの中の一行が残っていれば、それを根拠に最大級のスコープを要求してくることがあります。

個人開発で、私はいくつもの自動化を Workspace 上に抱えています。そうなると、この「自動推定されたスコープ」が時間とともに静かに膨らみます。本稼働しているスクリプトが、本来必要のない読み書き権限をいつの間にか握っている。これは事故が起きたときの被害範囲(blast radius)を無自覚に広げる、地味ですが重い負債です。

その負債を断つために、Gmail・Sheets・Gemini API をまたぐ典型的な自動化を題材として、appsscript.json で必要最小限のスコープを宣言し、肥大を CI で検知し、スコープ変更時の再同意事故を避けるところまでを扱います。

なぜ自動推定スコープが危険なのか

Apps Script のスコープには、二つの決め方があります。

一つは、何も宣言しないとコードから自動推定される方法。もう一つは、appsscript.jsonoauthScopes フィールドに自分で明示する方法です。後者を書いた瞬間、自動推定は止まり、宣言したスコープ「だけ」が要求されます。

自動推定が危険なのは、次の三点が重なるからです。

問題具体的に何が起きるか
過大なスコープを引き当てるGmailApp.search() を1回呼ぶだけで「メールの完全な読み書き・削除」スコープが付く。読み取りだけのつもりでも削除権限まで握る
死んだコードが権限を生むコメントアウトや到達不能な分岐に残ったAPI呼び出しからもスコープが推定される。実際には使っていない権限を要求する
変化が見えない誰がいつどの権限を増やしたかが履歴に残らない。レビュー対象にならず、肥大に気づけない

最小権限(least privilege)の原則は「そのコードが今この瞬間に必要とする権限だけを持つ」ことです。自動推定はこの原則と本質的に相性が悪いのです。

題材にする自動化

具体例で考えます。次のような、私自身が実際に運用しているのに近い構成を想定します。

  • Gmail の特定ラベルの未読メールを読む(送信も削除もしない)
  • 本文を Gemini API に渡して要約・分類する
  • 結果を1枚のスプレッドシートに追記する

この自動化に「本当に必要な権限」は、突き詰めると次の三つだけです。

  1. Gmail を読むだけgmail.readonly
  2. 自分が作った特定のスプレッドシートへの読み書き(spreadsheets.currentonly)
  3. 外部 HTTP リクエスト(Gemini API を叩くため。script.external_request

メールの送信権限も、Drive 全体の権限も要りません。自動推定に任せると、ここに送信・削除権限まで紛れ込みます。

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

この記事の続きを読む

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

この記事で得られること
gmail.readonly と spreadsheets.currentonly を appsscript.json の oauthScopes に明示し、Apps Script の自動付与スコープを締め出す具体手順
宣言済みスコープを許可リストと突き合わせ、肥大を検知する CI スクリプト(コピーして使える完全版)
スコープ変更で全ユーザーに再同意を強いる事故を避ける、段階的な権限移行の進め方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Workspace 連携2026-07-13
夜間バッチの完了を待つポーリングを畳む — Apps Script の doPost を Gemini の合図受けにする設計
Gemini の Batch や長時間オペレーションの完了を Apps Script の時間主導トリガーで5分おきに問い合わせると、UrlFetch の呼び出しと待ち時間が静かに積み上がります。Webhook を doPost で受け、合図として扱ってから権威確認と冪等適用に落とす設計を組み立てます。
Workspace 連携2026-07-08
Apps Script の Gemini 自動化が月末に必ず止まる — UrlFetch 日次上限を溶かさない予算ガバナー設計
Apps Script から Gemini を呼ぶ自動化は、6分上限やトリガー本数とは別に UrlFetch の日次呼び出し上限で静かに止まります。件数が増えた日だけ落ちる問題を、日次予算ガバナーとバックログ繰り越しで捌き切る設計と動くコードにまとめます。
Workspace 連携2026-07-01
複数のトリガーが同時に書き込むと Gemini の結果が静かに消える — Apps Script の Properties 競合を畳む保管設計
Apps Script で Gemini の結果を複数のトリガーから保管すると、read-modify-write の競合と PropertiesService の容量制限で書き込みが静かに失われます。LockService と耐久シンク、冪等キーで取りこぼさない保管層を設計します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →