長文の議事録、口コミ、アンケート結果…読むだけでグッタリしませんか?しかも「要点だけ知りたい」だけなのに、毎回ChatGPTにコピペして、要約を貼り戻して…って、地味に時間も気力も持っていかれますよね。
この記事では、その“コピペ地獄”を卒業して、Googleスプレッドシート上で長文を自動要約できるようにします。
イメージは超シンプルで、A列に文章を入れたら、B列に3行要約がポンッと出る感じです。さらに慣れてきたら、選んだ範囲をまとめて一括要約する便利ワザまで作れます。
できるようになることは、ざっくりこの3つです。
- セルの文章を 3行で要約(カスタム関数で「=要約(A2)」)
- 一括要約(メニューからボタン感覚で実行)
- 料金と安全を守りつつ、ムダ打ちを減らす工夫(キャッシュなど)
ただし大事な注意が1つあります。個人情報や社外秘など、外に出したら困る内容は送らないのが基本です(名前・住所・顧客IDなどは消す/マスキングする)。このルール込みで、初心者でも迷わない手順でいきますので、安心してついてきてください。
まず完成形を見せる:セルに文章→3行要約が出る
やることはこれだけです。A2に長文(議事録や口コミなど)を入れたら、B2に3行要約が自動で出ます。コピペして往復…がゼロになります。
どんな人に刺さる?
事務で議事録を読む人/マーケで口コミを集計する人/勉強でノートを短くしたい人/ブログの下書きを整えたい人に向いています。
使い道3つ
- 議事録:決まったこと・宿題だけ抜き出す
- 口コミ:良い点/悪い点をまとめる
- アンケート:多い意見をサクッと把握する
できないこと・注意
要約のやり方は3つ:
- GASで自作(基本0円+API利用分)
- 拡張アドオン(月数百〜数千円目安)
- 外部自動化ツール(無料枠〜月数千円目安)。
この記事は❶で作ります。
はじめる前の準備:必要なものと「安全」のルール
ここでつまずく人が多いので、先に“準備&安全”を固めます。下の□が全部埋まればスタートOKです。
必要なもの(チェックリスト)
APIキーとは?(鍵のイメージ)
APIキーは家の鍵みたいなものです。鍵が漏れると、他人に勝手に使われる可能性があります。なので、シートにベタ書きしない&人に見せないが基本ルールです。
料金の考え方(まず少量テスト)
料金はざっくり「文章の量 × 回数」で増えます。いきなり大量投入せず、短い文章1つ→10件だけ→本番の順で試すと安心です。あと、要約を短めにするほど安くなりやすいです。
送ってOK/NGの目安(消すのが基本)
迷ったら「送らない」がいちばん安全です。どうしてもなら伏せ字(例:田中→Aさん)にします。
かんたん実装:カスタム関数で「=要約(A2)」を作る
迷わない手順(拡張機能→Apps Script→貼る→保存→実行)
- スプレッドシートを開く
- 上のメニュー 「拡張機能」→「Apps Script」 を開く
- まっさらにして、下のコードを そのまま貼る
- 上の💾(保存)
- いったん テスト実行(権限の確認が出たら許可)
- シートに戻って、セルで
=要約(A2)を使う(A2が空なら空にするのがコツ:=IF(A2="","",要約(A2)))
※外部API呼び出しは UrlFetchApp を使います(権限が必要です)。
※カスタム関数は「呼んだセルに値が出る」タイプです。
APIキーをシートに書かない保存方法(設定に入れる)
APIキーは絶対にシートに書かないでください。Apps Script の 「プロジェクトの設定」→「スクリプト プロパティ」 に OPENAI_API_KEY として入れます。PropertiesServiceで安全に保持できます。
キーは秘密扱いが基本ルールです(公開・共有NG)。
要約テンプレ(3行/箇条書き/結論→理由→例/小学生向け)
この実装は =要約(A2,"小学生") みたいに型を選べるようにしてあります。モデルはコスパ重視なら gpt-5-mini あたりが扱いやすいです。(APIは Responses を使います)
よくある落とし穴(再計算で連打・時間切れ)
コピペ用コード(Apps Script に貼る)
const OPENAI_ENDPOINT = "https://api.openai.com/v1/responses";
const MODEL = "gpt-5-mini"; // 例: "gpt-4.1-mini" にしてもOK
/**
* =要約(A2) または =要約(A2,"箇条書き") のように使います
*/
function 要約(text, style) {
if (!text) return "";
const key = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
if (!key) return "❌ OPENAI_API_KEY が未設定です(スクリプト プロパティへ)";
const prompt = getPromptTemplate(style);
const input = `${prompt}\n\n【本文】\n${text}`;
const payload = {
model: MODEL,
input,
store: false,
temperature: 0.2,
max_output_tokens: 250
};
const res = UrlFetchApp.fetch(OPENAI_ENDPOINT, {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + key },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const code = res.getResponseCode();
if (code >= 300) {
return "❌ APIエラー: " + code + " / " + res.getContentText().slice(0, 160);
}
const json = JSON.parse(res.getContentText());
return extractOutputText(json).trim();
}
function extractOutputText(resp) {
const out = resp.output || [];
const texts = [];
out.forEach(item => {
if (item && item.type === "message" && Array.isArray(item.content)) {
item.content.forEach(part => {
if (part.type === "output_text" && part.text) texts.push(part.text);
});
}
});
return texts.join("\n");
}
function getPromptTemplate(style) {
const s = (style || "3行").toString();
switch (s) {
case "箇条書き":
return "次の文章を日本語で要約してください。重要ポイントを箇条書きで3〜5個。各行は短く。";
case "結論理由例":
return "次の文章を日本語で要約してください。形式は「結論→理由→例」で3行。";
case "小学生":
return "次の文章を日本語で要約してください。小学生でもわかる言葉で、3行。むずかしい言葉は言いかえて。";
case "3行":
default:
return "次の文章を日本語で要約してください。3行で。1行目:全体の結論、2行目:重要ポイント、3行目:次にやること。";
}
}
// 権限確認用(エディタで1回実行してください)
function テスト要約() {
Logger.log(要約("今日は会議でA案に決まりました。担当は田中さん。期限は金曜です。", "3行"));
}
便利実装:メニュー追加で「選んだ範囲を一括要約」
カスタム関数(=要約(A2))は手軽なんですが、再計算で何回も呼ばれて連打になりがちです。そこで実務向けに、シート上に「ボタン」みたいな専用メニューを作って、選んだ範囲だけまとめて要約できるようにします。
シート上にメニューを追加(ボタン感覚で実行)
Apps Scriptに、次のコードを追加してください。シートを開き直すと、上のメニューに 「要約ツール」 が出ます。
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("要約ツール")
.addItem("選択範囲を一括要約(右の列に出力)", "一括要約_選択範囲")
.addToUi();
}
範囲選択→まとめて要約(進捗・完了表示)
使い方はかんたんです。要約したいセル範囲(例:A2:A11)を選択 → メニューから実行。結果は「選んだ範囲の右隣の列」に書き込みます(A列ならB列)。
function 一括要約_選択範囲() {
const ss = SpreadsheetApp.getActive();
const sheet = ss.getActiveSheet();
const range = sheet.getActiveRange();
const values = range.getValues(); // 2次元配列
const startRow = range.getRow();
const startCol = range.getColumn();
const outCol = startCol + range.getNumColumns(); // 右隣に出力
const total = range.getNumRows();
for (let i = 0; i < total; i++) {
const text = (values[i][0] ?? "").toString().trim(); // まずは「選択範囲の左上列だけ」を対象に
const outCell = sheet.getRange(startRow + i, outCol);
try {
if (!text) {
outCell.setValue("");
} else {
// H2-3で作った「要約(text, style)」をそのまま再利用します
const summary = 要約(text, "3行");
outCell.setValue(summary);
}
} catch (e) {
outCell.setValue("❌ 失敗:" + (e.message || e));
}
ss.toast(`進捗:${i + 1}/${total}`, "一括要約", 2);
Utilities.sleep(250); // 連打防止(必要なら調整)
}
ss.toast("完了!", "一括要約", 3);
}
失敗しても止まらない工夫(1行ずつ・途中保存)
ポイントはここです。
実行ログの見方(原因を自分で見つける)
「なんか失敗した…」ときは、Apps Script画面の左側にある 「実行(Executions)」 を見ると、いつ・どの関数が・成功/失敗したかが残ります。さらに詳しく見たいときは、コード内に Logger.log() を足しておくと原因追いがラクになります(ログ=レシート、何が起きたかの記録です)。
要約がうまくなるコツ:プロンプトの「型」で安定させる
要約って、実は「お願いの仕方」で精度がガラッと変わります。ふわっと「要約して」だと、出力もふわっと迷子になりがちです。なので毎回同じ“型(テンプレ)”で頼むのがいちばん安定します(しかも短く指定するとムダな出力が減って節約にもなります)。
目的別テンプレ(会議/レビュー/アンケート)
コピペして使ってください(本文はA2などに入ってる前提です)。
出力の形を固定(見出し・箇条書き・文字数)
NG例:「この文章を要約して」
→ 何を出せばいいか曖昧で、長くなりやすいです。
改善例:「3行で要約。1行目=結論、2行目=重要ポイント、3行目=次のアクション。各行40字以内。」
→ これだけでブレが減ります。
長文は分割→最後にまとめ直す(2段階要約)
長すぎる文章は、いきなり全部を要約しないのがコツです。
- だいたい2,000文字くらいで区切る
- 各ブロックを短く要約(同じ型で)
- 最後に「さっきの要約たちを、もう一回3行でまとめて」と頼む
この“2段階”にすると、長文でも読みやすくまとまりやすいです。
つまずき救急箱:エラー・文字数オーバー・動かない時
「動かない…」ってなっても大丈夫です。だいたい原因は限られてます。まずはこの順で確認してください。
まずここを見るチェックリスト(キー/権限/貼る場所)
よくあるエラー例と原因(権限・回数制限・形式ミス)
| 症状 | ありがちな原因 | 直し方 |
|---|---|---|
| 何も出ない/空のまま | 入力セルが空、IFで弾いてる | まず短文を直入れして確認 |
| 権限エラーっぽい | 許可が未完了 | テスト関数を手動実行→許可 |
| 回数制限・連打っぽい | 再計算で何度も呼ばれる | 一括要約(メニュー実行)に切り替え |
| APIエラー表示 | キー未設定/コピペミス | キーを入れ直して再実行 |
文字数オーバー対策(分割・短く・列で管理)
文字数オーバーは「箱が小さいのに荷物を詰めすぎ」状態です。
対策は3つだけ覚えればOKです。
- 文章を分割(長文はブロックに切る)
- 出力を短く(3行、箇条書き3〜5個など)
- 分割要約を別列に置いて、最後に“まとめ直し”する(2段階)
“動いたか確認”のテスト手順(短文→少量→本番)
- まず短文1つで
=要約(A2) - 次に10件だけ(A2:A11)
- 問題なければ本番(多い時は一括要約で)
ここまで段階を踏むと、ほぼ挫折しません。
安全対策:社内データを扱うときの守り方
まず大前提です。送らないのが一番安全です。とはいえ業務で必要なときもあるので、「送る前に消す」ルールを決めておくと安心です。
送る前に消すルール(個人情報マスキング例)
| チェック項目 | 例 | 置き換え例 |
|---|---|---|
| 氏名 | 田中太郎 | Aさん/担当者 |
| 住所 | 東京都○○区… | (住所削除) |
| 連絡先 | 090-1234-5678 / メール | 090-XXXX-XXXX / xxx@xxx |
| 顧客ID・社員番号 | C-10293 | ID:XXXX |
| 社外秘ワード | 取引条件、未発表商品 | 該当部分を削除 |
迷ったら「削除」でOKです。要約に不要な情報は全部落とす、これがコツです。
APIキー漏えい対策(共有設定/権限/回転)
チーム運用のコツ(担当者・ルール・ログ)
料金を抑える:ムダ打ちを減らす3つの仕組み
料金の不安って、だいたい「いつの間にか回数が増える」ことが原因なんですよね。覚えるのはこれだけです。
コストは「文章の量 × 実行回数」で増えます。
細かい単価は変わるので、最終的には公式で確認しつつ、運用でムダを削ります。
まず少量でテスト(10件だけ)
いきなり全件はやめて、短文1件→10件だけ→本番の順で進めます。これだけで“事故”が激減します。
同じ文章は再要約しない(キャッシュ)
同じ文章を何回も投げるのが一番もったいないです。
「前に要約した文章なら、その結果を使い回す」仕組み(キャッシュ)を入れると、ムダ打ちがほぼ消えます。
実行回数カウンタ列で見える化(上限を決める)
シートに「実行回数」列を作って、1行ごとに何回要約したかを見える化します。さらに「今日は最大○件まで」みたいに上限を決めておくと安心です。
仕上げの便利機能:差がつく小ワザ集+次の一歩
ここまでで「自動要約」は完成です。最後に、あると地味に助かる小ワザをまとめます。
要約の長さをドロップダウンで選ぶ(短い/ふつう/長い)
シートに「要約の長さ」セルを1つ作って、短い/ふつう/長いを選べるようにすると便利です。
現場だと「今日は短くで十分」がめちゃ多いので、ムダ打ちも減ります。
「キーワード」「次にやること」も同時に出す
要約だけだと動けないことがあるので、セットで出すと強いです。
これだけで、読む→動くが一気につながります。
よくある質問
- QGAS初心者でも本当にできますか?
- A
できます。手順どおりに「拡張機能 → Apps Script → コピペ → 保存 → テスト実行」だけで、まずは1セル要約まで到達できます。最初は短文1つで動作確認するのがコツです。
- QAPIキーってどこに置くのが安全ですか?
- A
シートに書かないのが正解です。Apps Scriptの「設定(プロジェクトのプロパティ)」みたいな場所に入れて、コードから読み出す形にします。共有するシートほど、このルールは必須です。
- Q個人情報が混ざってても要約に投げていいですか?
- A
おすすめしません。名前・住所・電話・メール・顧客ID・社外秘は基本送らないでください。どうしても必要なら、Aさん/XXXみたいに伏せてから要約が安心です。
- Q要約が変な文章になるのはなぜですか?
- A
だいたい原因は2つです。
対策は「3行・形式固定」+「長文は分割して2段階要約」が鉄板です。
- Q同じセルが何回も要約されて、回数が増えちゃいます…
- A
それ、よくあります。カスタム関数は再計算で呼ばれやすいので、実務はメニュー実行の“一括要約”が安定です。さらに同じ文章は再要約しない(キャッシュ)を入れるとムダ打ちが減ります。
- Q動かない時、まず何を見ればいいですか?
- A
この3つだけ先に見てください。
このあとに、短文1セルでテストすると切り分けが速いです。
- Qエラーが出たけど、原因が分かりません…
- A
まずはエラー文の「数字(コード)」と「どの関数で落ちたか」を見ます。Apps Scriptの実行履歴(実行ログ)を見ると、失敗した場所が追いやすいです。よくあるのは「キー未設定」「権限」「回数/時間切れ」です。
- Q文字数オーバー(長すぎ)と言われました。どうしたらいい?
- A
「箱が小さい」のに詰めすぎ状態です。
これでだいたい解決します。
- Q料金が怖いです。どれくらいかかりますか?
- A
料金は変わるので「正確な金額」は公式確認が安全です。考え方だけ言うと、文章の量×回数で増えます。なので、短め出力・少量テスト・キャッシュ・回数上限でコントロールするのが一番効きます。
- Qチームで使うときの注意点は?
- A
おすすめはこの3点です。
