MAGAZINE
ルーターマガジン
Google スプレッドシート AI 関数 vs GAS カスタム関数(Gemini API)― 比較・検証
はじめに
Google スプレッドシートで AI を使う手段は大きく 2 つあります。
① 組み込みの =AI() 関数:Workspace プランに含まれており、セルに書くだけで使えます。コード不要。
=AI(prompt, [value])
| 制約 | 内容 |
|---|---|
| ネスト | =IF(AI(...), ...) のような他関数へのネストは不可 |
| 再計算 | 参照元が変わっても自動更新されない(手動再入力が必要) |
| ライセンス | 対象となる Google Workspace または Google AI のプランへの登録が必要 |
② GAS + Gemini API:Apps Script から Gemini API を直接呼び出してカスタム関数を作る方法。API キーと実装が必要ですが、挙動を細かく制御できます。また、モデルの変更が可能なため、最新モデルを用いた高度な推論なども利用可能。
セットアップ(GAS 側)
Gemini API キーを Google AI Studio で発行し、スクリプトプロパティ GEMINI_API_KEY に登録してからコード.gsの内容を以下のjavascriptでまるごと置き換えて保存してください。
▲ 「プロジェクトの設定 → スクリプトプロパティ」に GEMINI_API_KEY を登録
function callGemini_(prompt) {
const apiKey =
PropertiesService.getScriptProperties().getProperty("GEMINI_API_KEY");
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent?key=${apiKey}`;
const response = UrlFetchApp.fetch(url, {
method: "post",
contentType: "application/json",
payload: JSON.stringify({
contents: [{ parts: [{ text: prompt }] }],
generationConfig: { temperature: 0.2, maxOutputTokens: 1024 },
}),
muteHttpExceptions: true,
});
const json = JSON.parse(response.getContentText());
if (json.error) throw new Error(`Gemini API Error: ${json.error.message}`);
return json.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? "";
}
/** @customfunction */
function GEMINI_SUMMARIZE(text, instruction) {
return callGemini_(
`以下のテキストを${instruction || "簡潔に要約してください"}。\n\n---\n${text}\n---`,
);
}
/** @customfunction */
function GEMINI_EXTRACT(text, infoToExtract) {
return callGemini_(`以下のテキストから「${infoToExtract}」を抽出してください。
該当がなければ「N/A」と返してください。値のみを返し、説明は不要です。
テキスト:
${text}`);
}
要約の出力例
同じテキストを両者に渡した結果です。
入力: 「配送が予定より 2 日遅れました。商品自体は満足しています。次回は梱包を改善してほしい。」
=AI("次のテキストを30字以内の1文で要約してください", A2)
→ 「配送は遅れましたが商品には満足しており、梱包改善を希望します。」(31字)
=GEMINI_SUMMARIZE(A2, "30字以内の1文で")
→ 「配送遅延、次回は梱包改善希望。」(15字)
=AI() 関数は30字以内という指示を守れていない要約結果を出力する場合がある。
検証:情報抽出
顧客メッセージから「注文番号」「金額」「希望対応」の 3 項目を抽出し、正解ラベルと照合しました。
入力例: 「注文番号 ORD-91456 のキャンセル分、8,640円の返金がまだありません」
# 組み込み(項目ごとに1セルずつ)
=AI("注文番号を抽出。ORD-XXXXX 形式で。該当なければ N/A", C2) → ORD-91456
=AI("金額を抽出。値のみ返してください。該当なければ N/A", C2) → 8,640円
=AI("顧客の希望対応を10字以内で。該当なければ N/A", C2) → 返金
# GAS
=GEMINI_EXTRACT(C2, "注文番号(ORD-XXXXX 形式)") → ORD-91456
=GEMINI_EXTRACT(C2, "金額") → 8,640円
=GEMINI_EXTRACT(C2, "希望対応(10字以内)") → 返金
▲ 正解ラベルと両者の出力を並べた結果(15件)
抽出精度(正解ラベルとの一致率・15件)
| 項目 | 組み込み =AI() |
GAS(Gemini 2.5 Flash Lite) |
|---|---|---|
| 注文番号 | 100% | 100% |
| 金額 | 100% | 93% |
| 希望対応 | 93% | 73% |
所見:GAS はプロンプトで「値のみ・該当なければ N/A」と厳密に指定できるため、後続の
COUNTIFS集計にそのまま使える出力が安定して返ってきた。=AI()は出力に余計な説明文が混入するケースがあり、その場合は正答と判定できない。今回のような短文かつ簡易な指示であれば高精度で抽出可能。最軽量モデルの2.5-flash-liteのため希望対応のように単純な文字列抽出でない場合に精度が落ちた。
速度とコスト
速度(15件平均)
=AI()(組み込み) |
GAS(Gemini 2.5 Flash Lite) | |
|---|---|---|
| 抽出(1件・3項目) | 約 1.0 秒 | 約 2.3 秒 |
GAS は UrlFetchApp のネットワーク往復が加算されるため若干遅くなります。ただし GAS ではトリガーで夜間バッチ実行できるため、件数が多い場合は実質的な待ち時間をゼロにできます。
コスト(Gemini 2.5 Flash Lite 参考料金)
=AI() は Workspace プランのコストに含まれます。GAS + API の従量料金は以下のとおりです(公式 で最新価格を確認してください)。
| 処理件数 | 推定コスト(入力 400 tokens・出力 100 tokens/件) |
|---|---|
| 1,000 件 | 約 $0.03(約 5 円) |
| 10,000 件 | 約 $0.30(約 48 円) |
| 100,000 件 | 約 $3.00(約 477 円) |
無料枠(RPM/RPD 制限あり)内に収まれば費用はかかりません。
機能比較
| 機能・特性 | =AI()(組み込み) |
GAS カスタム関数 |
|---|---|---|
| セットアップ | ◎(関数を書くだけ) | △(実装・APIキー設定が必要) |
| プロンプト制御 | △(prompt 引数のみ) | ◎(完全自由) |
| モデル選択 | ✗ | ◎(Flash / Pro 等) |
| 出力フォーマット安定性 | △(複雑な指示になると守らないことがある) | ◎(プロンプトで制御できる) |
| 他の関数へのネスト | ✗ | ◎ |
| 自動再計算 | ✗ | ✗(同じ制約) |
| バッチ・自動化 | △(セル単位のみ) | ◎(トリガーで全自動化) |
| 外部連携(Slack 等) | ✗ | ◎ |
まとめ
即時利用・非エンジニアが使う → 組み込み =AI()
出力を安定させたい・自動化したい・個人利用 → GAS カスタム関数
=AI() はコードなしで今すぐ試せる点が最大の強みです。ただしフォーマット制御の弱さが実務では引っかかりやすく、後続の集計関数と組み合わせる用途には向きません。
GAS カスタム関数 はプロンプト設計の自由度が高く、出力の安定性・バッチ処理・外部連携まで扱えます。まず =AI() で動作を確かめ、「毎日自動で回したい」「集計に使いたい」と感じたタイミングで移行するのが現実的です。
株式会社ルーター 長戸
CONTACT
お問い合わせ・ご依頼はこちらから