OpenAI APIはクレジットカード登録という「課金の壁」がありますが、Gemini API(Google AI Studio) ならGoogleアカウントさえあれば無料で、しかも爆速で始められます。「GAS × Gemini」こそが、現時点で最強かつ最安の組み合わせです。
APIキーの取得手順は割愛し、「キーは持っている」前提で、スプレッドシート上の大量のテキストをGeminiに読ませて分析させるツールを作りましょう。
ついにここまできた。あなたはGASを操り、自動でデータを集め、自動でメールを返すシステムを作り上げた。
だが、最後に残された「泥臭い作業」がある。
「集まった文章を読む」 という作業だ。
例えば、顧客アンケートの自由記述欄。
「御社のサービスは素晴らしいですが、UIが少し使いにくいです。特にスマホでの操作性が……(中略 800文字)……というわけで改善を望みます。」
こんな長文が100件あったらどうする? 全部読むのか?
やめろ。目が疲れるだけで全く成長しない。
人間が文章を読む速度は遅い。だがAIは一瞬だ。
今回は、Googleが誇る生成AI「Gemini(ジェミニ)」をGASに召喚し、あなたの代わりに文章を読み、要約し、ついでに「この客、怒ってる?」という感情分析までさせる。
あなたはもう、生の文章を読む必要はない。「AIが噛み砕いた結論」だけを見ればいいのだ。
1. 【発端】「お客様の声」を読むのが怖いし面倒
フォームでアンケートを集めたのはいいが、自由記述欄に並ぶ大量のテキスト。
中にはクレームもあるかもしれないし、単なる世間話かもしれない。
「あー、これ全部読んで『ポジティブ』か『ネガティブ』か仕分けして、要約してレポートにするの?
部長は『お客様の声を聞け』って言うけど、俺は『要点だけ聞きたい』んだよ!」
その願い、Geminiが叶えよう。
彼にスプレッドシートの文章を投げつければ、一瞬で「要約」と「感情スコア」を付けて返してくれる。
2. 【翻訳】AIへの指示を「関数」にする
今回のターゲットは「Gemini API」だ。
これまではGASの中だけで完結していたが、今回は外部の頭脳(Gemini)にデータを送って、答えをもらう。
【AIへの指示メモ(仕様書)】
- 対象: スプレッドシートのC列(お客様のコメント)
- 処理:
- C列の文章をGeminiに送る
- 指示:「この文章を30文字以内で要約して。あと、感情を『ポジティブ/ネガティブ/中立』の3段階で判定して」
- 答えを受け取る
- 出力:
- D列に「要約」
- E列に「感情判定」
- これを全行一気にやるのではなく、ボタンを押した行だけやる(API制限などを考慮して)
「APIキー」 というパスポートが必要だが、あなたは既に持っているはずだ。(まだなら「Google AI Studio」で検索して3分で取ってこい。無料だ。)
3. 【発注】AIへのプロンプト送信
今回はコードが少し複雑になる(外部通信が発生する)ので、AIには「Gemini APIの叩き方」を含めて指示出しをする。
<実際に送信するプロンプト>
Plaintext
GASで「Gemini API」を使って、スプレッドシートのテキストを分析するツールを作りたいです。
APIキーは持っています。モデルは「gemini-1.5-flash」あたりを使いたいです。
# シート構成
・C列:分析したい元の文章(アンケート回答など)
・D列:要約(AIが出力)
・E列:感情判定(AIが出力)
# やりたいこと
1. スプレッドシートのメニューに「AI分析」というボタンを作る
2. 選択中のセル(または行)のC列の文章を取得する
3. Gemini APIに以下のプロンプトでリクエストを送る
「以下の文章を要約し、感情を判定してください。
出力フォーマット:
要約:{30文字以内の要約}
感情:{ポジティブ/ネガティブ/中立}」
4. 返ってきた結果を解析して、D列とE列に書き込む
# 技術的な要望
・UrlFetchAppを使ってGemini APIのエンドポイントを叩いてください。
・APIキーはスクリプトプロパティ、またはコード上部の変数で管理します。
・JSONのパース処理を含めてください。
4. 【実装】スプレッドシートに「脳」が宿る
AIが書いたコードを貼り付け、コードの上部にある 'YOUR_API_KEY' の部分に、あなたが取得したGeminiの鍵をコピペする。
保存したら、スプレッドシートを再読み込みしてみよう。
メニューバーの右端に、独自のメニュー「AI分析」が出現しているはずだ。
C列に適当な文章を入力してみる。
- 「商品が届きません! どうなってるんですか! 二度と買いません!」
- 「使いやすくて最高です。デザインも可愛いし、友達にも勧めました。」
そのセルを選択して、メニューから「実行」!
数秒後、隣の列にパッと文字が現れる。
| 元の文章 | 要約 | 感情 |
| 商品が届きません… | 配送遅延への強い不満と再購入拒否。 | ネガティブ |
| 使いやすくて最高… | 機能性とデザインへの高評価、推奨意向あり。 | ポジティブ |
これだ。これが見たかったんだ。
あなたはもう、長文を読む必要はない。「ネガティブ」と判定された行だけを目視チェックし、あとは「ポジティブですね、よかった」と報告書に貼り付ければいい。
5. 【仕上げ】大量データも怖くない
Gemini 1.5 Flashは非常に安価(無料枠も巨大)で高速だ。
1000件のアンケートだろうが、1万件のレビューだろうが、GASでループを回せば寝ている間に全て分析が終わっている。
「お客様の声」をAIに読ませて、自分は「美味しいところ(結論)」だけを食べる。
これぞ、AI時代の賢いデータ活用術だ。
(実践編⑦ 終了)
【実践編⑦ 付属資料】
1. AIが生成する標準コード(基本編)
Gemini APIを呼び出し、選択したセルのテキストを分析するコードです。
※ YOURAPIKEY の部分には実際のキーを入れてください。
JavaScript
// ★ここにAPIキーを入れる
var GEMINI_API_KEY = 'YOUR_API_KEY';
// ★使用するモデル名を指定(gemini-1.5-flash, gemini-1.5-pro, gemini-2.0-flash など)
var MODEL_NAME = 'gemini-1.5-flash';
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('AI分析')
.addItem('選択行を分析する', 'analyzeSelectedRow')
.addToUi();
}
function analyzeSelectedRow() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var row = sheet.getActiveCell().getRow();
// C列(3列目)の文章を取得
var text = sheet.getRange(row, 3).getValue();
if (!text) {
Browser.msgBox("C列に文章がありません");
return;
}
// Geminiへのリクエスト作成
var result = callGeminiAPI(text);
if (result) {
var summary = extractValue(result, "要約:");
var sentiment = extractValue(result, "感情:");
sheet.getRange(row, 4).setValue(summary);
sheet.getRange(row, 5).setValue(sentiment);
}
}
function callGeminiAPI(text) {
// ★モデル名を変数から読み込んでURLを作成
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + MODEL_NAME + ":generateContent?key=" + GEMINI_API_KEY;
var prompt = "以下の文章を分析してください。\n" +
"出力形式は必ず以下のようにしてください。\n" +
"要約:{30文字以内で要約}\n" +
"感情:{ポジティブ/ネガティブ/中立}\n\n" +
"文章:\n" + text;
var payload = {
"contents": [{
"parts": [{"text": prompt}]
}]
};
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
try {
var response = UrlFetchApp.fetch(url, options);
var json = JSON.parse(response.getContentText());
if (json.candidates && json.candidates[0].content) {
return json.candidates[0].content.parts[0].text;
} else {
console.log("Error: " + response.getContentText());
return "エラー: AIからの応答が不正です";
}
} catch (e) {
console.log(e);
return "通信エラー";
}
}
// ヘルパー関数(変更なし)
function extractValue(text, label) {
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
if (lines[i].indexOf(label) !== -1) {
return lines[i].replace(label, '').trim();
}
}
return text;
}
2. 拡張アイデアコード(応用編)
追加機能:JSONモードを使って「確実」にデータを整形する
基本編ではAIの回答(テキスト)を無理やり加工していましたが、Gemini 1.5 Flashは「JSONモード」に対応しています。これを使うと、AIがプログラムで扱いやすい完璧なデータ形式で返してくれます。
「要約」「感情」に加えて「具体的な改善点」も抽出させてみましょう。
JavaScript
// ★使用するモデル名
var MODEL_NAME = 'gemini-1.5-flash';
function callGeminiAPIAdvanced(text) {
// ★URL構築時にモデル変数を組み込む
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + MODEL_NAME + ":generateContent?key=" + GEMINI_API_KEY;
var prompt = `
あなたは優秀なデータアナリストです。以下の顧客の声を分析し、JSON形式で出力してください。
【分析対象】
"${text}"
【出力スキーマ】
{
"summary": "30文字以内の要約",
"sentiment": "ポジティブ" or "ネガティブ" or "中立",
"action_item": "企業が改善すべき具体的な行動(あれば)"
}
`;
var payload = {
"contents": [{
"parts": [{"text": prompt}]
}],
// JSONレスポンスを強制
"generationConfig": {
"response_mime_type": "application/json"
}
};
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url, options);
var json = JSON.parse(response.getContentText());
var aiResponseText = json.candidates[0].content.parts[0].text;
var resultObj = JSON.parse(aiResponseText);
return resultObj;
}
function analyzeWithJson() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var row = sheet.getActiveCell().getRow();
var text = sheet.getRange(row, 3).getValue();
var result = callGeminiAPIAdvanced(text);
sheet.getRange(row, 4).setValue(result.summary);
sheet.getRange(row, 5).setValue(result.sentiment);
sheet.getRange(row, 6).setValue(result.action_item);
}
これで実践編はすべて終了……と言いたいところですが、
最後に「総まとめ」として、
「結局、プログラマーにならなくても、我々は『指示出しおじさん/おばさん』として生きていける」
という結論で締めくくりましょう。
コメント