スポンサーリンク

スプレッドシートで長文を一発要約!GAS×ChatGPTでコピペ卒業

スポンサーリンク
この記事は約17分で読めます。
スポンサーリンク

長文の議事録、口コミ、アンケート結果…読むだけでグッタリしませんか?しかも「要点だけ知りたい」だけなのに、毎回ChatGPTにコピペして、要約を貼り戻して…って、地味に時間も気力も持っていかれますよね。

この記事では、その“コピペ地獄”を卒業して、Googleスプレッドシート上で長文を自動要約できるようにします。

イメージは超シンプルで、A列に文章を入れたら、B列に3行要約がポンッと出る感じです。さらに慣れてきたら、選んだ範囲をまとめて一括要約する便利ワザまで作れます。
できるようになることは、ざっくりこの3つです。

  • セルの文章を 3行で要約(カスタム関数で「=要約(A2)」)
  • 一括要約(メニューからボタン感覚で実行)
  • 料金と安全を守りつつ、ムダ打ちを減らす工夫(キャッシュなど)

ただし大事な注意が1つあります。個人情報や社外秘など、外に出したら困る内容は送らないのが基本です(名前・住所・顧客IDなどは消す/マスキングする)。このルール込みで、初心者でも迷わない手順でいきますので、安心してついてきてください。

  1. まず完成形を見せる:セルに文章→3行要約が出る
    1. どんな人に刺さる?
    2. 使い道3つ
    3. できないこと・注意
  2. はじめる前の準備:必要なものと「安全」のルール
    1. 必要なもの(チェックリスト)
    2. APIキーとは?(鍵のイメージ)
    3. 料金の考え方(まず少量テスト)
    4. 送ってOK/NGの目安(消すのが基本)
  3. かんたん実装:カスタム関数で「=要約(A2)」を作る
    1. 迷わない手順(拡張機能→Apps Script→貼る→保存→実行)
    2. APIキーをシートに書かない保存方法(設定に入れる)
    3. 要約テンプレ(3行/箇条書き/結論→理由→例/小学生向け)
    4. よくある落とし穴(再計算で連打・時間切れ)
    5. コピペ用コード(Apps Script に貼る)
  4. 便利実装:メニュー追加で「選んだ範囲を一括要約」
    1. シート上にメニューを追加(ボタン感覚で実行)
    2. 範囲選択→まとめて要約(進捗・完了表示)
    3. 失敗しても止まらない工夫(1行ずつ・途中保存)
    4. 実行ログの見方(原因を自分で見つける)
  5. 要約がうまくなるコツ:プロンプトの「型」で安定させる
    1. 目的別テンプレ(会議/レビュー/アンケート)
    2. 出力の形を固定(見出し・箇条書き・文字数)
    3. 長文は分割→最後にまとめ直す(2段階要約)
  6. つまずき救急箱:エラー・文字数オーバー・動かない時
    1. まずここを見るチェックリスト(キー/権限/貼る場所)
    2. よくあるエラー例と原因(権限・回数制限・形式ミス)
    3. 文字数オーバー対策(分割・短く・列で管理)
    4. “動いたか確認”のテスト手順(短文→少量→本番)
  7. 安全対策:社内データを扱うときの守り方
    1. 送る前に消すルール(個人情報マスキング例)
    2. APIキー漏えい対策(共有設定/権限/回転)
    3. チーム運用のコツ(担当者・ルール・ログ)
  8. 料金を抑える:ムダ打ちを減らす3つの仕組み
    1. まず少量でテスト(10件だけ)
    2. 同じ文章は再要約しない(キャッシュ)
    3. 実行回数カウンタ列で見える化(上限を決める)
  9. 仕上げの便利機能:差がつく小ワザ集+次の一歩
    1. 要約の長さをドロップダウンで選ぶ(短い/ふつう/長い)
    2. 「キーワード」「次にやること」も同時に出す
  10. よくある質問
スポンサーリンク

まず完成形を見せる:セルに文章→3行要約が出る

やることはこれだけです。A2に長文(議事録や口コミなど)を入れたら、B2に3行要約が自動で出ます。コピペして往復…がゼロになります。

どんな人に刺さる?

事務で議事録を読む人/マーケで口コミを集計する人/勉強でノートを短くしたい人/ブログの下書きを整えたい人に向いています。

使い道3つ

  • 議事録:決まったこと・宿題だけ抜き出す
  • 口コミ:良い点/悪い点をまとめる
  • アンケート:多い意見をサクッと把握する

できないこと・注意

  • 社外秘・個人情報(氏名、住所、メール、顧客IDなど)は送らないでください(消す/置き換えるが基本)。
  • 要約は便利ですが100%正解ではありません。最後は目で確認しましょう。

要約のやり方は3つ

  • GASで自作(基本0円+API利用分)
  • 拡張アドオン(月数百〜数千円目安)
  • 外部自動化ツール(無料枠〜月数千円目安)。

この記事は❶で作ります。

はじめる前の準備:必要なものと「安全」のルール

ここでつまずく人が多いので、先に“準備&安全”を固めます。下の□が全部埋まればスタートOKです。

必要なもの(チェックリスト)

  • Googleアカウント(普段のGmailでOKです)
  • Googleスプレッドシート(要約したい表)
  • GAS(Apps Script。スプレッドシートの自動化スイッチです)
  • OpenAIのAPIキー(あとで取得します)

APIキーとは?(鍵のイメージ)

APIキーは家の鍵みたいなものです。鍵が漏れると、他人に勝手に使われる可能性があります。なので、シートにベタ書きしない人に見せないが基本ルールです。

料金の考え方(まず少量テスト)

料金はざっくり「文章の量 × 回数」で増えます。いきなり大量投入せず、短い文章1つ→10件だけ→本番の順で試すと安心です。あと、要約を短めにするほど安くなりやすいです。

送ってOK/NGの目安(消すのが基本)

  • NG:氏名、住所、電話、メール、顧客ID、社外秘ワード、契約内容など
  • OK:個人が特定できない一般的な文章(公開レビュー等でも油断はしない)

迷ったら「送らない」がいちばん安全です。どうしてもなら伏せ字(例:田中→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 を使います)

よくある落とし穴(再計算で連打・時間切れ)

  • シートの再計算で同じセルが何回も呼ばれることがあります
    → まずは短文1件でテスト→10件→本番がおすすめです(まとめ処理は次章の「メニュー実行」で安定します)
  • 長文+長い出力は時間切れになりやすいです
    → 出力を短め(3行)& max_output_tokens を控えめにしておくと安全です

コピペ用コード(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行ずつ・途中保存)

ポイントはここです。

  • 1行ずつ処理して、結果もその場で書き込む(=途中まで進んでいればやり直しが楽)
  • 失敗しても try/catchその行だけエラー表示して続行
  • たくさんやると時間切れになるので、まずは10〜30行くらいからがおすすめです

実行ログの見方(原因を自分で見つける)

「なんか失敗した…」ときは、Apps Script画面の左側にある 「実行(Executions)」 を見ると、いつ・どの関数が・成功/失敗したかが残ります。さらに詳しく見たいときは、コード内に Logger.log() を足しておくと原因追いがラクになります(ログ=レシート、何が起きたかの記録です)。

要約がうまくなるコツ:プロンプトの「型」で安定させる

要約って、実は「お願いの仕方」で精度がガラッと変わります。ふわっと「要約して」だと、出力もふわっと迷子になりがちです。なので毎回同じ“型(テンプレ)”で頼むのがいちばん安定します(しかも短く指定するとムダな出力が減って節約にもなります)。

目的別テンプレ(会議/レビュー/アンケート)

コピペして使ってください(本文はA2などに入ってる前提です)。

  • 会議(議事録)用
    • 「決まったこと/保留/担当と期限」を3行で。固有名詞はそのまま、余計な前置きは不要。
  • レビュー(口コミ)用
    • 「良い点/悪い点/改善アイデア」を箇条書きで3〜5個。感情語は残してOK。
  • アンケート用
    • 「多い意見Top3/少数でも重要な意見/次にやること」を短く。

出力の形を固定(見出し・箇条書き・文字数)

NG例:「この文章を要約して」
→ 何を出せばいいか曖昧で、長くなりやすいです。

改善例:「3行で要約。1行目=結論、2行目=重要ポイント、3行目=次のアクション。各行40字以内。」
→ これだけでブレが減ります。

長文は分割→最後にまとめ直す(2段階要約)

長すぎる文章は、いきなり全部を要約しないのがコツです。

  • だいたい2,000文字くらいで区切る
  • 各ブロックを短く要約(同じ型で)
  • 最後に「さっきの要約たちを、もう一回3行でまとめて」と頼む

この“2段階”にすると、長文でも読みやすくまとまりやすいです。

つまずき救急箱:エラー・文字数オーバー・動かない時

「動かない…」ってなっても大丈夫です。だいたい原因は限られてます。まずはこの順で確認してください。

まずここを見るチェックリスト(キー/権限/貼る場所)

  • APIキーが スクリプトの設定(プロパティ) に入っている
  • 初回実行時の 権限許可 を済ませている
  • コードを貼った場所が合っている(別ファイル/別プロジェクトに貼ってない)
  • いきなり大量じゃなく 短文1セル で試している

よくあるエラー例と原因(権限・回数制限・形式ミス)

症状ありがちな原因直し方
何も出ない/空のまま入力セルが空、IFで弾いてるまず短文を直入れして確認
権限エラーっぽい許可が未完了テスト関数を手動実行→許可
回数制限・連打っぽい再計算で何度も呼ばれる一括要約(メニュー実行)に切り替え
APIエラー表示キー未設定/コピペミスキーを入れ直して再実行

文字数オーバー対策(分割・短く・列で管理)

文字数オーバーは「箱が小さいのに荷物を詰めすぎ」状態です。
対策は3つだけ覚えればOKです。

  • 文章を分割(長文はブロックに切る)
  • 出力を短く(3行、箇条書き3〜5個など)
  • 分割要約を別列に置いて、最後に“まとめ直し”する(2段階)

“動いたか確認”のテスト手順(短文→少量→本番)

  • まず短文1つで =要約(A2)
  • 次に10件だけ(A2:A11)
  • 問題なければ本番(多い時は一括要約で)

ここまで段階を踏むと、ほぼ挫折しません。

安全対策:社内データを扱うときの守り方

まず大前提です。送らないのが一番安全です。とはいえ業務で必要なときもあるので、「送る前に消す」ルールを決めておくと安心です。

送る前に消すルール(個人情報マスキング例)

チェック項目置き換え例
氏名田中太郎Aさん/担当者
住所東京都○○区…(住所削除)
連絡先090-1234-5678 / メール090-XXXX-XXXX / xxx@xxx
顧客ID・社員番号C-10293ID:XXXX
社外秘ワード取引条件、未発表商品該当部分を削除

迷ったら「削除」でOKです。要約に不要な情報は全部落とす、これがコツです。

APIキー漏えい対策(共有設定/権限/回転)

  • APIキーはシートに書かない(スクリプトの設定に保存)
  • スプレッドシートの共有は編集者を最小限、外部共有は原則オフ
  • 「漏れたかも」と思ったら、すぐキーを作り直して差し替え(古い鍵は無効化)

チーム運用のコツ(担当者・ルール・ログ)

  • “この仕組みの管理者”を1人決める(キー管理と権限担当)
  • 「送っていい文章の基準」を短い社内ルールにする(表のまま貼ると早いです)
  • 一括要約の実行結果や失敗行は、あとで追えるようにログや結果列を残す(やり直しが爆速になります)

料金を抑える:ムダ打ちを減らす3つの仕組み

料金の不安って、だいたい「いつの間にか回数が増える」ことが原因なんですよね。覚えるのはこれだけです。

コストは「文章の量 × 実行回数」で増えます。

細かい単価は変わるので、最終的には公式で確認しつつ、運用でムダを削ります。

まず少量でテスト(10件だけ)

いきなり全件はやめて、短文1件→10件だけ→本番の順で進めます。これだけで“事故”が激減します。

同じ文章は再要約しない(キャッシュ)

同じ文章を何回も投げるのが一番もったいないです。
「前に要約した文章なら、その結果を使い回す」仕組み(キャッシュ)を入れると、ムダ打ちがほぼ消えます。

実行回数カウンタ列で見える化(上限を決める)

シートに「実行回数」列を作って、1行ごとに何回要約したかを見える化します。さらに「今日は最大○件まで」みたいに上限を決めておくと安心です。

仕上げの便利機能:差がつく小ワザ集+次の一歩

ここまでで「自動要約」は完成です。最後に、あると地味に助かる小ワザをまとめます。

要約の長さをドロップダウンで選ぶ(短い/ふつう/長い)

シートに「要約の長さ」セルを1つ作って、短い/ふつう/長いを選べるようにすると便利です。

現場だと「今日は短くで十分」がめちゃ多いので、ムダ打ちも減ります。

「キーワード」「次にやること」も同時に出す

要約だけだと動けないことがあるので、セットで出すと強いです。

  • キーワード:重要語を3つ
  • 次にやること:タスクを1〜3個

これだけで、読む→動くが一気につながります。

よくある質問

Q
GAS初心者でも本当にできますか?
A

できます。手順どおりに「拡張機能 → Apps Script → コピペ → 保存 → テスト実行」だけで、まずは1セル要約まで到達できます。最初は短文1つで動作確認するのがコツです。

Q
APIキーってどこに置くのが安全ですか?
A

シートに書かないのが正解です。Apps Scriptの「設定(プロジェクトのプロパティ)」みたいな場所に入れて、コードから読み出す形にします。共有するシートほど、このルールは必須です。

Q
個人情報が混ざってても要約に投げていいですか?
A

おすすめしません。名前・住所・電話・メール・顧客ID・社外秘は基本送らないでください。どうしても必要なら、Aさん/XXXみたいに伏せてから要約が安心です。

Q
要約が変な文章になるのはなぜですか?
A

だいたい原因は2つです。

  • お願いがふわっとしてる(=プロンプトの型が弱い)
  • 元の文章が長すぎる・話が散らかってる

対策は「3行・形式固定」+「長文は分割して2段階要約」が鉄板です。

Q
同じセルが何回も要約されて、回数が増えちゃいます…
A

それ、よくあります。カスタム関数は再計算で呼ばれやすいので、実務はメニュー実行の“一括要約”が安定です。さらに同じ文章は再要約しない(キャッシュ)を入れるとムダ打ちが減ります。

Q
動かない時、まず何を見ればいいですか?
A

この3つだけ先に見てください。

  • APIキーが設定に入ってるか
  • 初回の権限許可が終わってるか
  • コードを貼った場所が合ってるか(別プロジェクトに貼ってないか)

このあとに、短文1セルでテストすると切り分けが速いです。

Q
エラーが出たけど、原因が分かりません…
A

まずはエラー文の「数字(コード)」と「どの関数で落ちたか」を見ます。Apps Scriptの実行履歴(実行ログ)を見ると、失敗した場所が追いやすいです。よくあるのは「キー未設定」「権限」「回数/時間切れ」です。

Q
文字数オーバー(長すぎ)と言われました。どうしたらいい?
A

「箱が小さい」のに詰めすぎ状態です。

  • 文章を分割(段落ごとなど)
  • 出力を短く(3行、箇条書き3〜5個)
  • 最後にまとめ直す(2段階要約)

これでだいたい解決します。

Q
料金が怖いです。どれくらいかかりますか?
A

料金は変わるので「正確な金額」は公式確認が安全です。考え方だけ言うと、文章の量×回数で増えます。なので、短め出力・少量テスト・キャッシュ・回数上限でコントロールするのが一番効きます。

Q
チームで使うときの注意点は?
A

おすすめはこの3点です。

  • 管理者を決める(キー管理・権限担当)
  • 送信NGルールを表で共有(個人情報・社外秘は送らない)
  • 結果列・実行ログを残す(失敗してもやり直しが楽)
タイトルとURLをコピーしました