Amazon10/19まで!プライム感謝祭開催中!セール会場へ

Googleスプレッドシート│Gemini APIの無料枠を使う方法

スプレッドシートの標準AI機能だけでは対応しにくい処理があり、

大量のデータをまとめて処理するためにGemini APIの無料枠を活用する手順を検証しました。

目次

あなたはどっち?利用環境に合わせた最適プラン判定フロー

設定の順番です。内容は、この記事の説明にもとづく目安です。Geminiのモデル名、無料枠の条件、レート制限の数値は、変わることがあります。記事の数値は「約」の目安です。Googleの公式ページ(2026年10月時点で確認)には、無料枠の具体的な数値は記載されておらず、現在の制限はGoogle AI Studioで確認するよう案内されています。実際に使う前に、AI Studioで、現在の制限とモデル名を確認してください。

  1. Google AI Studioで、APIキーを作成する。記事では、無料枠の利用範囲内であれば、請求先アカウントの設定やクレジットカードの登録は不要と説明している。
  2. APIキーは、スプレッドシートの「拡張機能」→「Apps Script」を開き、スクリプトプロパティに登録する。コードには直接書かない。
  3. 使うモデルを決める。記事では、モデルごとに、無料枠のレート制限(1分あたりのリクエスト数など)が異なると説明している。最新の制限は、AI Studioで確認する。
  4. 動作確認のテスト関数を、順に実行する。最初の実行時は、アクセス権限の承認画面が表示される。
  5. HTTPステータスコード200が返れば、APIキーの設定と通信は正常。テキスト生成、利用可能なモデルの一覧取得の順に確認する。
  6. 大量のデータを処理する場合は、GASのループの中で、待機時間を設けて、リクエスト回数の上限を超えないようにする。

APIキーは、他の人に見せたり、記事やコードにそのまま貼ったりしないでください。

Googleスプレッドシートで無料枠のGemini APIを使う方法

設定不備があると応答が停止したように見える場合があるため、段階的に動作を確認しながら進めます。

Gemini 2.0系と2.5系ではAPI仕様やエンドポイント記述が異なる場合があるため、指定するモデルバージョンに応じたコード管理が必要です。

Gemini APIキーの取得

Google AI Studioへアクセスし、画面右上の「APIキーを作成」をクリックします。

https://aistudio.google.com/app/api-keys?hl=ja

作成画面でプロジェクト名とキーの名称を入力します。

入力例:Google Sheets

APIキーの作成画面でプロジェクト名とキーの名称を入力する様子。

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

作成後に生成されたAPIキーが表示され、コピーできる画面。

無料枠の利用範囲内であれば、請求先アカウントの設定やクレジットカードの登録は不要です。

スクリプトプロパティの設定

対象のGoogleスプレッドシートを新規作成または開きます。

上部メニューの「拡張機能」から「Apps Script」を選択します。

Googleスプレッドシートの上部メニューの拡張機能からApps Scriptを選択する画面。

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

スクリプトプロパティにプロパティ名と取得した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調整進行中佐藤
102Figmaデザイン最終確認レビュー中佐藤
103お問い合わせフォーム修正完了鈴木
104画像圧縮と最適化進行中鈴木
105SEO初期設定未着手田中
106ブログ一覧レイアウト改善進行中田中
107スマホ表示の崩れ修正レビュー中佐藤
108CTAボタンデザイン変更完了鈴木
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仕様やエンドポイント記述が異なる場合があるため、指定するモデルバージョンに応じたコード管理が必要と説明しています。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次