GoogleスプレッドシートとGemini APIを組み合わせて、コストゼロで使える便利な要約ツールを作成しました。この記事では、Google Apps Script (GAS) を使って、どのようにGemini APIと連携し、テキスト要約機能を実装したかを解説します。
このツールでできること
- Googleスプレッドシートに入力したテキストを自動で要約
- カスタマイズ可能なプロンプトテンプレート
- 無料のGemini APIを活用したコストゼロの運用
- 一括処理によるまとめて要約機能
前提条件
- Googleアカウント(無料)
Gemini APIキーの取得
まず、Gemini APIにアクセスするためのAPIキーを取得します。
- Google AI Studio にGoogleアカウントでログインします。
- ページ上部または左メニューにある「Get API key」をクリックします。
- 「APIキーを作成」をクリックし、APIキーを生成します。
- 生成されたAPIキーが表示されます。このキーは後で設定するため、必ずコピーして安全な場所に保管してください。
実装手順
1. スプレッドシートの準備
まず、以下の2つのシートを含むGoogleスプレッドシートを作成します:
-
要約シート: 元のテキストと要約結果を管理するシート
– A列: 元のテキスト
– B列: 要約結果 -
設定シート: 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]
)の値を返す - 見つからなかった場合はエラーをスロー
全体の流れ
- スプレッドシートを開くと、「Geminiツール」メニューが自動的に作成される
- ユーザーが「要約を実行」をクリックすると、「要約」シートの内容が処理される
- 1列目のテキストを読み取り、2列目が空の行に対して要約処理を実行
- 要約処理は「設定」シートに保存された情報(APIキー、モデル名、プロンプトテンプレート)を使用
- Gemini APIに要約リクエストを送信し、結果を2列目に表示
- APIの呼び出し制限に対応するため、各処理の間に1.5秒の待機時間を設ける
設定例
以下は「設定」シートに設定する値の例です:
キー | 値 |
---|---|
API_KEY | AIzaSyA… (あなたのGemini APIキー) |
PROMPT_TEMPLATE | 以下のテキストを300字程度の日本語で要約してください。箇条書きではなく自然な文章で出力してください。 |
Model_Name | gemini-2.0-flash |
使い方
- 「要約」シートのA列に要約したいテキストを入力します
- 「Geminiツール」メニューから「要約を実行」をクリック
- B列に自動で要約結果が表示されます
ポイント
- 無料で運用可能: Google AppsとGemini APIの無料枠内で動作
- スマートなスキップ処理: 空行や既に要約済みのテキストは自動でスキップ
- カスタマイズ可能: プロンプトやモデルを設定シートで簡単に変更可能
- 安全な速度制限: APIの連続呼び出しを避けるための待機時間を実装
まとめ
Google Apps ScriptとGemini APIを組み合わせることで、無料かつ簡単に実用的なテキスト要約ツールが実現できました。この基本形を応用すれば、他の分析や処理も実装可能です。スプレッドシートベースなので、チーム内での共有や連携も容易です。
Gemini APIは、無料枠でも十分実用的な性能を発揮しています。
ぜひ自分なりにカスタマイズして、より使いやすいツールに育ててみてください!
GASのスプレッドシート
今回使用したスプレッドシートはこちらからコピーして使用できます!