【無料でできる】GASとGemini APIで作る自動テキスト要約ツール

IT・プログラミング

GoogleスプレッドシートとGemini APIを組み合わせて、コストゼロで使える便利な要約ツールを作成しました。この記事では、Google Apps Script (GAS) を使って、どのようにGemini APIと連携し、テキスト要約機能を実装したかを解説します。

このツールでできること

  • Googleスプレッドシートに入力したテキストを自動で要約
  • カスタマイズ可能なプロンプトテンプレート
  • 無料のGemini APIを活用したコストゼロの運用
  • 一括処理によるまとめて要約機能

前提条件

  • Googleアカウント(無料)

Gemini APIキーの取得

まず、Gemini APIにアクセスするためのAPIキーを取得します。

  1. Google AI Studio にGoogleアカウントでログインします。
  2. ページ上部または左メニューにある「Get API key」をクリックします。
  3. 「APIキーを作成」をクリックし、APIキーを生成します。
  4. 生成されたAPIキーが表示されます。このキーは後で設定するため、必ずコピーして安全な場所に保管してください。

実装手順

1. スプレッドシートの準備

まず、以下の2つのシートを含むGoogleスプレッドシートを作成します:

  1. 要約シート: 元のテキストと要約結果を管理するシート
    – A列: 元のテキスト
    – B列: 要約結果

  2. 設定シート: API設定や要約プロンプトなどを管理するシート
    – 以下のキーと値のペアを設定:

    • API_KEY: Gemini APIキー
    • PROMPT_TEMPLATE: 要約用のプロンプト
    • Model_Name: 使用するGeminiモデル(例: gemini-2.0-flash

2. Google Apps Scriptの実装

スプレッドシートのメニューから「拡張機能」>「Apps Script」を選択し、以下のコードを貼り付けます:

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Geminiツール')
    .addItem('要約を実行', 'runSummarization')
    .addToUi();
}

function runSummarization() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('要約');
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    const originalText = sheet.getRange(i, 1).getValue();
    const summaryCell = sheet.getRange(i, 2);

    // 空行・既に要約済みをスキップ
    if (!originalText || summaryCell.getValue()) continue;

    const summary = getGeminiData(originalText);
    summaryCell.setValue(summary);
    Utilities.sleep(1500); // API連続呼び出し制御
  }
}

function getGeminiData(originalText) {
  const apiKey = getSettingValue('API_KEY');
  const template = getSettingValue('PROMPT_TEMPLATE');
  const model = getSettingValue("Model_Name");

  const promptText = `${template}\n\n${originalText}`;
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;

  const payload = {
    contents: [{
      parts: [{ text: promptText }]
    }]
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const text = response.getContentText();
    const json = JSON.parse(text);

    Logger.log("Raw response JSON:\n" + text);  

    const summary = json.candidates?.[0]?.content?.parts?.[0]?.text;
    return summary || '(データが取得できませんでした)';
  } catch (err) {
    return '(エラー: ' + err.message + ')';
  }
}

function getSettingValue(key) {
  const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('設定');
  const data = settingsSheet.getDataRange().getValues();

  for (const row of data) {
    if (row[0] === key) return row[1];
  }

  throw new Error(`設定シートに${key}が見つかりません。`);
}

コードの解説

1. メニュー作成と初期化

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Geminiツール')
    .addItem('要約を実行', 'runSummarization')
    .addToUi();
}

この部分は、スプレッドシートが開かれたときに自動的に実行される関数です。

  • SpreadsheetApp.getUi()でスプレッドシートのユーザーインターフェース(UI)にアクセス
  • createMenu('Geminiツール')で「Geminiツール」という名前のカスタムメニューを作成
  • addItem('要約を実行', 'runSummarization')でメニュー項目を追加(クリックするとrunSummarization関数が実行される)
  • addToUi()でメニューをスプレッドシートのメニューバーに追加

2. 要約処理のメイン関数

function runSummarization() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('要約');
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    const originalText = sheet.getRange(i, 1).getValue();
    const summaryCell = sheet.getRange(i, 2);

    // 空行・既に要約済みをスキップ
    if (!originalText || summaryCell.getValue()) continue;

    const summary = getGeminiData(originalText);
    summaryCell.setValue(summary);
    Utilities.sleep(1500); // API連続呼び出し制御
  }
}

この関数は、メニューから「要約を実行」を選択したときに実行される主要な処理です。

  • getSheetByName('要約')で「要約」というシートを取得
  • getLastRow()でデータが存在する最後の行番号を取得
  • 2行目から最後の行まで繰り返し処理(1行目はヘッダーと想定)
  • 各行について:
  • 1列目から元のテキストを取得
  • 2列目のセル(要約結果を入れるセル)を取得
  • 元のテキストが空、または既に要約済み(2列目に値がある)の場合はスキップ
  • getGeminiData()関数でテキスト要約を実行
  • 要約結果を2列目に設定
  • 1.5秒の待機時間を入れてAPI呼び出しの頻度を制限

3. Gemini APIを呼び出す関数

function getGeminiData(originalText) {
  const apiKey = getSettingValue('API_KEY');
  const template = getSettingValue('PROMPT_TEMPLATE');
  const model = getSettingValue("Model_Name");

  const promptText = `${template}\n\n${originalText}`;
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;

  const payload = {
    contents: [{
      parts: [{ text: promptText }]
    }]
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const text = response.getContentText();
    const json = JSON.parse(text);

    Logger.log("Raw response JSON:\n" + text);  

    const summary = json.candidates?.[0]?.content?.parts?.[0]?.text;
    return summary || '(データが取得できませんでした)';
  } catch (err) {
    return '(エラー: ' + err.message + ')';
  }
}

この関数は、Google Gemini APIを使用してテキスト要約を行います。

  • 設定値の取得:
  • getSettingValue()関数を使って「設定」シートから必要な情報を取得
  • API_KEY:Google Gemini APIのAPIキー
  • PROMPT_TEMPLATE:要約のためのプロンプトテンプレート
  • Model_Name:使用するGeminiのモデル名

  • API呼び出しの準備:

  • プロンプトテキストを作成(テンプレート + 元のテキスト)
  • APIエンドポイントURLを構築
  • リクエストのペイロード(本文)を作成
  • リクエストオプションを設定(POST方式、JSONコンテンツタイプなど)

  • API呼び出しと結果処理:

  • UrlFetchApp.fetch()でHTTPリクエストを送信
  • レスポンステキストをJSONとしてパース
  • デバッグ用にレスポンス全体をログに記録
  • JSONから要約テキストを抽出(オプショナルチェーン?.を使用して安全にアクセス)
  • 要約が取得できた場合はその内容を、できなかった場合はエラーメッセージを返す

4. 設定値取得関数

function getSettingValue(key) {
  const settingsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('設定');
  const data = settingsSheet.getDataRange().getValues();

  for (const row of data) {
    if (row[0] === key) return row[1];
  }

  throw new Error(`設定シートに${key}が見つかりません。`);
}

この関数は「設定」シートから指定されたキーに対応する値を取得します。

  • getSheetByName('設定')で「設定」シートを取得
  • getDataRange().getValues()でシート内のすべてのデータを2次元配列として取得
  • 各行を順番に確認し、1列目(row[0])が指定されたキーと一致する行を探す
  • 見つかった場合は2列目(row[1])の値を返す
  • 見つからなかった場合はエラーをスロー

全体の流れ

  1. スプレッドシートを開くと、「Geminiツール」メニューが自動的に作成される
  2. ユーザーが「要約を実行」をクリックすると、「要約」シートの内容が処理される
  3. 1列目のテキストを読み取り、2列目が空の行に対して要約処理を実行
  4. 要約処理は「設定」シートに保存された情報(APIキー、モデル名、プロンプトテンプレート)を使用
  5. Gemini APIに要約リクエストを送信し、結果を2列目に表示
  6. APIの呼び出し制限に対応するため、各処理の間に1.5秒の待機時間を設ける

設定例

以下は「設定」シートに設定する値の例です:

キー
API_KEY AIzaSyA… (あなたのGemini APIキー)
PROMPT_TEMPLATE 以下のテキストを300字程度の日本語で要約してください。箇条書きではなく自然な文章で出力してください。
Model_Name gemini-2.0-flash

使い方

  1. 「要約」シートのA列に要約したいテキストを入力します
  2. 「Geminiツール」メニューから「要約を実行」をクリック
  3. B列に自動で要約結果が表示されます

ポイント

  1. 無料で運用可能: Google AppsとGemini APIの無料枠内で動作
  2. スマートなスキップ処理: 空行や既に要約済みのテキストは自動でスキップ
  3. カスタマイズ可能: プロンプトやモデルを設定シートで簡単に変更可能
  4. 安全な速度制限: APIの連続呼び出しを避けるための待機時間を実装

まとめ

Google Apps ScriptとGemini APIを組み合わせることで、無料かつ簡単に実用的なテキスト要約ツールが実現できました。この基本形を応用すれば、他の分析や処理も実装可能です。スプレッドシートベースなので、チーム内での共有や連携も容易です。

Gemini APIは、無料枠でも十分実用的な性能を発揮しています。

ぜひ自分なりにカスタマイズして、より使いやすいツールに育ててみてください!

GASのスプレッドシート

今回使用したスプレッドシートはこちらからコピーして使用できます!

タイトルとURLをコピーしました