スプレッドシートの標準AI機能だけでは対応しにくい処理があり、
大量のデータをまとめて処理するためにGemini APIの無料枠を活用する手順を検証しました。
あなたはどっち?利用環境に合わせた最適プラン判定フロー
設定の順番です。内容は、この記事の説明にもとづく目安です。Geminiのモデル名、無料枠の条件、レート制限の数値は、変わることがあります。記事の数値は「約」の目安です。Googleの公式ページ(2026年10月時点で確認)には、無料枠の具体的な数値は記載されておらず、現在の制限はGoogle AI Studioで確認するよう案内されています。実際に使う前に、AI Studioで、現在の制限とモデル名を確認してください。
- Google AI Studioで、APIキーを作成する。記事では、無料枠の利用範囲内であれば、請求先アカウントの設定やクレジットカードの登録は不要と説明している。
- APIキーは、スプレッドシートの「拡張機能」→「Apps Script」を開き、スクリプトプロパティに登録する。コードには直接書かない。
- 使うモデルを決める。記事では、モデルごとに、無料枠のレート制限(1分あたりのリクエスト数など)が異なると説明している。最新の制限は、AI Studioで確認する。
- 動作確認のテスト関数を、順に実行する。最初の実行時は、アクセス権限の承認画面が表示される。
- HTTPステータスコード200が返れば、APIキーの設定と通信は正常。テキスト生成、利用可能なモデルの一覧取得の順に確認する。
- 大量のデータを処理する場合は、GASのループの中で、待機時間を設けて、リクエスト回数の上限を超えないようにする。
APIキーは、他の人に見せたり、記事やコードにそのまま貼ったりしないでください。
Googleスプレッドシートで無料枠のGemini APIを使う方法
設定不備があると応答が停止したように見える場合があるため、段階的に動作を確認しながら進めます。
Gemini APIキーの取得
Google AI Studioへアクセスし、画面右上の「APIキーを作成」をクリックします。
https://aistudio.google.com/app/api-keys?hl=ja
作成画面でプロジェクト名とキーの名称を入力します。
入力例:Google Sheets

生成されたAPIキーをコピーし、安全な場所に控えておきます。

スクリプトプロパティの設定
対象のGoogleスプレッドシートを新規作成または開きます。
上部メニューの「拡張機能」から「Apps Script」を選択します。

GEMINI_API_KEYというプロパティ名で、先ほど取得したAPIキーをスクリプトプロパティに登録します。

無料枠のレート制限と各モデルの目安
無料枠(Free Tier)で利用する際の主なレート制限は以下のとおりです。
| モデル名 | 主な無料枠レート制限 | 補足/注意点 |
|---|---|---|
| Gemini 2.5 Flash | ・RPM(1分あたりのリクエスト数):約 10回/分 ・TPM(1分あたりのトークン数):約 250,000トークン/分 ・RPD(1日あたりのリクエスト数):約 250回/日 | 比較的高性能なモデルを無料枠で利用したい場合の候補です。上限が10回/分のため、GASのループ処理で連続実行する場合は待機時間を設ける設計が必要です。 |
| Gemini 2.5 Flash-Lite | ・RPM:約 15回/分 ・TPM:約 250,000トークン/分(同等水準) ・RPD:約 1,000回/日 | 処理速度とリクエスト回数を重視する場合に適しています。要約や大量データの一括処理に向いた軽量モデルです。 |
| Gemini 2.5 Pro | 無料枠(Free Tier)での公開ドキュメント記載値: ・RPM:2回/分 ・TPM:125,000トークン/分 ・RPD:50回/日 | 高精度な出力が求められる重いタスク向けの最上位モデルです。無料枠では回数制限が厳格なため、検証用途や特定タスクに絞った利用が適しています。 |
動作確認テストの実行手順
作成したテスト関数を順に実行して動作を確認します。
GAS初回実行時にはアクセス権限の承認画面が表示されるため、アクセスを許可して進めます。

1. 最小構成での疎通確認(Hello)
test1_minimalHello()
関数を選択して実行します。
11:15:41 お知らせ 実行開始
11:15:42 情報 HTTP ステータス: 200
11:15:42 情報 レスポンス本文: {
"candidates": [
{
"content": {
"parts": [
{
"text": "こんにちは!GASからGeminiへの通信テストですね。\n\nどのようなテストをしたいか、具体的に教えていただけますか?\n\n例えば、以下のような情報があると、より的確なアドバイスができます。\n\n* **Gemini API のどの機能を試したいか?** (テキスト生成、画像生成、埋め込みなど)\n* **GAS でどのような処理をしたいか?** (スプレッドシートのデータを Gemini に渡す、Gemini の結果をスプレッドシートに書き込むなど)\n* **現在どのようなコードを書いていて、どのような問題に直面しているか?**\n\n"
}
],
"role": "model"
},
"finishReason": "MAX_TOKENS",
"avgLogprobs": -0.18370489346778998
}
],
"usageMetadata": {
"promptTokenCount": 11,
"candidatesTokenCount": 118,
"totalTokenCount": 129,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 11
}
],
"candidatesTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 118
}
]
},
"modelVersion": "gemini-2.0-flash",
"responseId": "zb8jad_nGM_jz7IPtYn28Qc"
}
11:15:43 お知らせ 実行完了HTTPステータスコード200が返却されれば、APIキーの設定と無料枠の通信は正常です。
2. テキスト生成プロンプトのテスト(短文要約)
test2_promptEcho()関数を実行します。
11:18:44 お知らせ 実行開始
11:18:44 情報 sample (gemini-2.0-flash): SWELL特化、SEOに強いWordPress制作会社
11:18:44 情報 Gemini 出力: SWELL特化、SEOに強いWordPress制作会社
11:18:45 お知らせ 実行完了実行ログに対象テキストの要約が出力されます。
プロンプトの指示どおり簡潔な要約結果が得られていることを確認します。
3. 利用可能モデルの一覧取得テスト
test3_listModels()関数を実行します。
利用可能なモデル名一覧が診断_モデル一覧シートへ自動的に出力されます。

出力された一覧から、無料枠で指定可能な正確なモデル名を確認できます。
4. スプレッドシートデータの集約・要約テスト
作業シートに以下のサンプルデータを貼り付けます。
| ID | タイトル | ステータス | 担当者 |
|---|---|---|---|
| 101 | トップページUI調整 | 進行中 | 佐藤 |
| 102 | Figmaデザイン最終確認 | レビュー中 | 佐藤 |
| 103 | お問い合わせフォーム修正 | 完了 | 鈴木 |
| 104 | 画像圧縮と最適化 | 進行中 | 鈴木 |
| 105 | SEO初期設定 | 未着手 | 田中 |
| 106 | ブログ一覧レイアウト改善 | 進行中 | 田中 |
| 107 | スマホ表示の崩れ修正 | レビュー中 | 佐藤 |
| 108 | CTAボタンデザイン変更 | 完了 | 鈴木 |
| 109 | 構造化データの追加 | 進行中 | 田中 |
| 110 | フッター情報更新 | 未着手 | 佐藤 |

test4_summarizeSheet()関数を実行します。
担当者別まとめ(要約)シートが新規作成され、集約結果が出力されます。

スプレッドシート上の複数レコードを読み込み、無料枠の範囲で自動整理が完了します。
GASの時間主導型トリガーを設定すれば、日次などの定期実行も可能です。
検証に使用したGASコードは以下のとおりです。
GASコード全文
/************************************************************
* GAS × Gemini API 段階テスト一式(AI Studio 無料キー用)
* - エンドポイント: v1beta
* - APIキーはヘッダー x-goog-api-key で渡す
*
************************************************************/
const GEMINI_MODEL_PRIMARY = 'gemini-2.5-flash';
const GEMINI_MODEL_ALTERNATE = 'gemini-flash-latest';
const GEMINI_ENDPOINT_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';
/** 1) 最小通信テスト(Hello) */
function test1_minimalHello() {
const key = getKey_();
const url = `${GEMINI_ENDPOINT_BASE}/${GEMINI_MODEL_PRIMARY}:generateContent`;
const payload = {
contents: [
{
role: 'user',
parts: [{ text: 'こんにちは!GAS から Gemini への通信テストです。' }]
}
],
generationConfig: {
temperature: 0.2,
maxOutputTokens: 128,
responseMimeType: 'text/plain'
}
};
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { 'x-goog-api-key': key },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
Logger.log('HTTP ステータス: ' + res.getResponseCode());
Logger.log('レスポンス本文: ' + res.getContentText());
}
/** 2) 汎用プロンプトテスト(短い要約) */
function test2_promptEcho() {
const text = 'この文章を15文字以内で要約してください:MOTOKI合同会社は、WordPressに特化したWeb制作会社で、SEOに強いサイト構築を強みとしています。WordPressテーマ「SWELL」をベースに、ヒアリングを重視した機能・デザイン・使いやすさを追求したウェブサイト制作を行っています。 事業内容: Webサイトの制作。得意分野: WordPress、特に「SWELL」を用いた制作。強み:長年のサイト運営経験を活かしたSEOに強いサイト構築。顧客へのヒアリングを重視し、機能、デザイン、使いやすさを追求したサイト制作。内部施策の強化によるSEO対策。所在地: 埼玉県所沢市。';
const out = callGemini_(GEMINI_MODEL_PRIMARY, text);
Logger.log('Gemini 出力: ' + out);
}
/** 3) モデル一覧取得テスト(generateContent対応を確認) */
function test3_listModels() {
const key = getKey_();
const url = `${GEMINI_ENDPOINT_BASE}?key=${encodeURIComponent(key)}`;
const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
Logger.log('HTTP ステータス: ' + res.getResponseCode());
Logger.log('レスポンス本文: ' + res.getContentText());
// 必要ならスプレッドシートに展開
const json = JSON.parse(res.getContentText());
const arr = json.models || [];
const rows = [['name', 'supportedGenerationMethods']];
arr.forEach(m => {
rows.push([
m.name || '',
(m.supportedGenerationMethods || []).join(', ')
]);
});
const ss = SpreadsheetApp.getActive();
const sh =
ss.getSheetByName('診断_モデル一覧') ||
ss.insertSheet('診断_モデル一覧');
sh.clear();
sh.getRange(1, 1, rows.length, 2).setValues(rows);
sh.autoResizeColumns(1, 2);
}
/**
* 4) シート要約テスト
* - 対象シート: 「シート1」
* - 列構成: A=ID, B=タイトル, C=ステータス, D=担当者
* - 出力: 「担当者別まとめ(要約)」シートに担当者ごとの要約を書き出し
*/
function test4_summarizeSheet() {
const ss = SpreadsheetApp.getActive();
const src = ss.getSheetByName('シート1');
if (!src) throw new Error('「シート1」が見つかりません。');
const lastRow = src.getLastRow();
if (lastRow < 2) throw new Error('2行目以降にデータがありません。');
const values = src.getRange(2, 1, lastRow - 1, 4).getValues(); // A:D
const byAssignee = new Map();
for (const [id, title, status, assignee] of values) {
if (!assignee) continue;
const line = `${id}|${title}|${status}`;
if (!byAssignee.has(assignee)) byAssignee.set(assignee, []);
byAssignee.get(assignee).push(line);
}
const out = [['担当者', '件数', '要約']];
const names = Array.from(byAssignee.keys())
.sort((a, b) => String(a).localeCompare(String(b), 'ja'));
for (const name of names) {
const tasks = byAssignee.get(name);
const prompt = buildSummaryPrompt_(tasks);
// まずは安定モデル
let summary = callGemini_(GEMINI_MODEL_PRIMARY, prompt);
// 結果が空 or エラー表示の場合は代替モデルも試す
if (!summary || /^(エラー:|(結果なし)/.test(summary)) {
Utilities.sleep(200);
summary = callGemini_(GEMINI_MODEL_ALTERNATE, prompt);
}
out.push([name, tasks.length, summary || '(結果なし)']);
Utilities.sleep(250); // 連続呼び出しの軽い間隔
}
let dst = ss.getSheetByName('担当者別まとめ(要約)');
if (!dst) dst = ss.insertSheet('担当者別まとめ(要約)');
else dst.clear();
dst.getRange(1, 1, out.length, 3).setValues(out);
dst.autoResizeColumns(1, 2);
dst.setColumnWidth(3, 720);
dst.getRange('A1:C1').setFontWeight('bold');
}
/* ====== 共通ユーティリティ ====== */
/** タスク配列から要約用のプロンプトを組み立て */
function buildSummaryPrompt_(items) {
return `
以下のタスクを日本語で要約してください。
【必ず守るルール】
・必ず文章を出力する
・空欄は禁止
・最大120文字以内
・1〜2文 + 箇条書き(最大3項目)
【出力形式】
進捗まとめ:
・〇〇
・〇〇
【タスク】
${items.map(s => '・' + s).join('\n')}
`;
}
/** Gemini 呼び出し共通処理(プレーンテキスト前提) */
function callGemini_(model, userText) {
const key = getKey_();
const url = `${GEMINI_ENDPOINT_BASE}/${model}:generateContent`;
const payload = {
contents: [
{
role: 'user',
parts: [{ text: userText }]
}
],
generationConfig: {
temperature: 0.2,
maxOutputTokens: 300
}
};
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { 'x-goog-api-key': key },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const code = res.getResponseCode();
const body = res.getContentText();
if (code !== 200) {
Logger.log(`Gemini Error ${code}: ${body}`);
return `(エラー: ${code})`;
}
try {
const json = JSON.parse(body);
// 2.5世代向けの最も安全な取得方法
const parts = json?.candidates?.[0]?.content?.parts || [];
if (!parts.length) {
Logger.log('Empty response body:' + body);
return '(結果なし)';
}
const text = parts.map(p => p.text || '').join('').trim();
if (!text) {
Logger.log('Empty text:' + body);
return '(結果なし)';
}
return text;
} catch (e) {
Logger.log('JSON parse error: ' + e);
return '(結果なし)';
}
}
/** スクリプトプロパティから API キー取得 */
function getKey_() {
const key = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
if (!key) {
throw new Error('GEMINI_API_KEY が未設定です(スクリプトプロパティに API キーを設定してください)。');
}
return key;
}
以上の手順で、スプレッドシートからGemini APIの無料枠を利用した処理が構築できます。
Googleスプレッドシートを活用した他の自動化手法については、まとめ記事をご確認ください。

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。
外部のサービスと連携する記事は、ほかにもあります。




まとめ
スプレッドシート標準の関数機能と比較して、GASからGemini APIを直接呼び出す手法はプロンプト設計の自由度が高く、複数セルのバッチ処理にも適しています。
用途に応じたモデルとレート制限を確認したうえで、業務自動化に活用してみてください。
よくある質問:スプレッドシートでGemini APIの無料枠を使うときのチェックリスト
Gemini APIの無料枠を、スプレッドシートで使うには?
Google AI StudioでAPIキーを作成し、GASのスクリプトプロパティに登録して、GASからAPIを呼び出します。記事では、段階的に動作を確認しながら進める手順を紹介しています。
無料枠でも、クレジットカードの登録は必要ですか?
無料枠の利用範囲内であれば、請求先アカウントの設定やクレジットカードの登録は不要と説明しています。最新の条件は、Google AI Studioで確認してください。
APIキーは、どこに保存しますか?
GEMINI_API_KEYというプロパティ名で、スクリプトプロパティに登録すると説明しています。コードには、直接書かないでください。
無料枠のレート制限は、いくつですか?
記事には、モデルごとのレート制限の目安が、「約」の数値で掲載されています。ただし、制限は変わることがあります。Googleの公式ページでは、現在の制限はGoogle AI Studioで確認するよう案内されています。実際に使う前に、AI Studioで確認してください。
GASのループで、連続して呼ぶと、止まるのは、なぜですか?
1分あたりのリクエスト数の上限があるため、GASのループ処理で連続実行する場合は、待機時間を設ける設計が必要と説明しています。
モデル名は、どう確認しますか?
記事のテスト関数で、利用可能なモデルの一覧を取得し、「診断_モデル一覧」シートへ出力できます。出力された一覧から、無料枠で指定可能な正確なモデル名を確認できます。
Gemini 2.0系と2.5系で、コードは同じですか?
2.0系と2.5系ではAPI仕様やエンドポイント記述が異なる場合があるため、指定するモデルバージョンに応じたコード管理が必要と説明しています。
