実践編⑦:読むな、感じろ……いや、AIに読ませろ!Gemini APIで「長文アンケート」を3秒で要約&感情分析する

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列(お客様のコメント)
  • 処理:

    1. C列の文章をGeminiに送る
    2. 指示:「この文章を30文字以内で要約して。あと、感情を『ポジティブ/ネガティブ/中立』の3段階で判定して」
    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);
}


これで実践編はすべて終了……と言いたいところですが、

最後に「総まとめ」として、

「結局、プログラマーにならなくても、我々は『指示出しおじさん/おばさん』として生きていける」

という結論で締めくくりましょう。

part 10 of 11 【講座名】 AI-GAS[スプレッドシート自動化]

AI-GAS[スプレッドシート自動化]

【GAS初心者】作りたいものが思いつかない?「我慢」をやめれば自動化のネタは無限に湧いてくる

【AI×GAS】AIは「察してちゃん」が大嫌い!欲望を箇条書きにする「思考の翻訳」トレーニング

【GAS初心者】環境構築という「最初のボス」はもういない ——GASとスプレッドシートの蜜月関係

実践編①:「明日やろうは馬鹿野郎」を撲滅せよ —— 期限切れタスクを自分にチクリ報告する「Gmailリマインダー」

実践編②:Googleカレンダーも合体!寝起きの自分に「今日の絶望」を届ける最強モーニングレポート

実践編③:YouTubeを監視せよ!寝ている間に「推し」や「トレンド」を勝手にリストアップする諜報員Bot

実践編④:クリック地獄からの解放!スプレッドシートの「質問リスト」からGoogleフォームを全自動生成する

実践編⑤:24時間365日「即レス」する無敵の受付嬢!フォーム回答への自動返信&自分への通知システム

実践編⑥:画面が真っ赤になっても心停止しない!エラーメッセージはAIへの「ネタ振り」だと思え

実践編⑦:読むな、感じろ……いや、AIに読ませろ!Gemini APIで「長文アンケート」を3秒で要約&感情分析する

第8回(最終回):結論、プログラマーになる必要はない。「プロの指示出しおじさん/おばさん」になれ

コメント

この記事へのコメントはありません。

PAGE TOP