GAS×NotebookLM実践記|本業メール集約を自動化する術

GASで本業メールを自動集約しNotebookLMの思考整理に活かす実践ガイド プログラミング

2026.03.25 更新:NotebookLMプラン体系をPlus/Pro/Ultra体系に修正、Gemini 2.5 Flash・3系モデルのシャットダウン情報を追記

「このプロジェクト、過去のメールを全部読み返さないと判断できない」──SE歴20年、こういう場面に何度も遭遇してきました。NotebookLMにメールを投入すれば文脈を横断して質問できると知り、試しに40通ほど突っ込んだところ、思考整理が驚くほど捗りました。

しかし問題はその「突っ込む」作業です。Gmailからメールを1通ずつコピーしてGoogleドキュメントに貼り付け、NotebookLMのソースに手動追加する。隔週で繰り返すと、準備だけで30分以上かかります。

そこでGoogle Apps Script(GAS)を使い、プロジェクトに関連するメールを自動で集約するスクリプトを書きました。本記事では、最初に書いた「動くけど荒い」v1と、実運用で起きた問題を踏まえて改善したv2の両方を、コピペ用コード付きで公開します。

本業メールの山をNotebookLMで「思考の素材」に変えたかった

きっかけ──40通のメールを手作業でNotebookLMに投入した日

担当プロジェクトの方向性を整理する必要があり、過去2週間分のメールをNotebookLMに投入してみました。メールの本文をGoogleドキュメントにまとめ、NotebookLMのソースとして追加すると、「この案件で未回答の論点は何か」「A社とB社の要望の違いを整理して」といった質問に対し、メール横断で回答が返ってきます。

自分の記憶だけでは見落としていた論点が浮かび上がり、NotebookLMの有用性を実感しました。ただし、40通のメールをGmailから手動でコピーしてドキュメントに貼り付ける作業は、想像以上に面倒でした。これを隔週で繰り返すのは現実的ではなく、GASで自動化しようと考えました。

NotebookLMはGoogleが提供するAIノートブックツールです。Googleドキュメント・PDF・Webページなどをソースとしてアップロードすると、それらの内容に基づいてAIが質問に回答します。2026年3月時点では無料版のほか、Google AIのPlus(月額1,200円)・Pro(月額2,900円)・Ultra(月額36,400円)の有料プランがあり、上位プランほどソース数やチャット回数の上限が拡張されます。本記事のスクリプトは無料版で十分に運用できます。NotebookLMの7つの活用術と実務レビューはこちら

GASを開くだけで迷った話

GASを使おうとして、最初にハマったのが「どこから開くか」でした。Google検索で「GAS」と調べてscript.google.comにアクセスしたところ、Google Workspaceアカウントと個人アカウントの切り替え問題でログインできません。

結局たどり着いたのは、Googleドライブの「新規作成 → その他 → Google Apps Script」という経路です。Workspaceアカウントの場合、この方法が最も確実です。GASを初めて使う方は、script.google.comではなくGoogleドライブから開くことをおすすめします。

Googleドライブの新規作成メニューでGoogle Apps Scriptを選択する操作

最初に書いたスクリプト──「動くけど荒い」v1の全容

v1の仕様とコード

最初に書いたスクリプトの仕様はシンプルです。Gmailの検索演算子を使い、プロジェクト名のキーワードと基準日以降という条件でメールを検索します。スレッド形式のメールは最新の1通だけを取得し、本文をそのままGoogleドキュメントに結合して出力します。キーワードと基準日はスクリプト内にハードコードしていました。

function collectProjectEmails_v1() {
  var keyword = "プロジェクトABC";
  var sinceDate = "2026/01/15";
  var query = keyword + " after:" + sinceDate;
  var threads = GmailApp.search(query);

  var doc = DocumentApp.create(
    keyword + "_メール集約_" + new Date().toLocaleDateString("ja-JP")
  );
  var body = doc.getBody();

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    var lastMsg = messages[messages.length - 1];
    body.appendParagraph("【件名】" + lastMsg.getSubject());
    body.appendParagraph("【日時】" + lastMsg.getDate().toLocaleString("ja-JP"));
    body.appendParagraph("【差出人】" + lastMsg.getFrom());
    body.appendParagraph(lastMsg.getPlainBody());
    body.appendParagraph("─".repeat(40));
  }

  doc.saveAndClose();
  Logger.log("作成完了: " + doc.getUrl());
  Logger.log("取得スレッド数: " + threads.length);
}

このスクリプトで基本的な自動集約は実現できました。手動で40通コピーしていた作業が、ボタン一つで完了します。

GASスクリプトエディタでv1コードを開いた状態

v1で起きた問題──情報のミスリード

2回目の実行で問題が発生しました。キーワード検索でヒットしたメールの中に、対象プロジェクト以外の情報が含まれていたのです。具体的には、複数案件の売上報告メール、自分宛のメールメモ、案件横断の請求・支払業務メールです。

これらはメール本文にプロジェクト名が含まれているためキーワード検索にヒットしますが、中身は別案件の金額や状況も記載されています。このままNotebookLMに投入すると、別案件の数字やコンテキストが混入し、AIの回答が事実と異なる内容を含む危険があります。

実際に1回目の実行時、NotebookLMの回答に違和感を覚えて確認したところ、別案件の売上データが混ざっていたことが原因でした。AIに投入するデータの品質は、回答の信頼性に直結します。生成AI時代に求められるデータ品質管理やプロンプト設計のスキルについては「生成AI時代に必要・不要なスキルと若手教育の進め方」で詳しく解説しています。

以降、集約後にGoogleドキュメントを目視確認し、不要なメールを手動で削除する運用にしましたが、これでは自動化の意味が半減します。

改善版v2──スプレッドシート制御+除外フィルタ

v1の問題を踏まえ、3つの改善を加えたv2を作成しました。最大の変更点は、キーワード・基準日・除外条件をスプレッドシートから読み込む方式にしたことです。スクリプトを毎回書き換える必要がなくなりました。

項目v1v2
キーワード・基準日の管理スクリプト内にハードコードスプレッドシート「設定」シートから読み込み
除外フィルタなし「除外」シートのブラックリストで件名一致スキップ
実行ログLoggerのみ(実行時に消える)「ログ」シートに取得数・除外数・ドキュメントURLを記録

改善点① キーワードと基準日をスプレッドシートから読み込み

スプレッドシートに「設定」シートを作り、A1にプロジェクトキーワード、B1に基準日を入力します。スクリプトはこの値を読み取って検索に使います。隔週で実行する際は、スプレッドシートの日付を更新するだけで済みます。複数プロジェクトに対応したい場合は、行を増やして拡張できます。

スプレッドシートの設定シートにキーワードと基準日を入力した状態

改善点② 除外キーワードをブラックリスト管理

同じスプレッドシートの「除外」シートに、除外したい件名キーワードを縦に並べます。たとえば「売上報告」「請求」「支払」の3行です。スクリプトはメールの件名にこれらの文字列が含まれている場合、そのメールをスキップします。

運用しながら除外キーワードを追加できるため、スクリプト本体を触る必要がありません。当初3個だった除外キーワードが増えても、シートに1行追加するだけです。

除外シートにブラックリストキーワードを入力した状態

改善点③ 実行ログをスプレッドシートに出力

何通取得して何通除外したかを「ログ」シートに記録します。集約結果の信頼性を確認でき、除外キーワードの調整にも役立ちます。ドキュメントURLも記録するので、NotebookLMへの投入時にログシートからワンクリックでアクセスできます。

v2コピペ用コード全文と使い方

コード全文

function collectProjectEmails_v2() {
  // スプレッドシートから設定読み込み
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var settingsSheet = ss.getSheetByName("設定");
  var keyword = settingsSheet.getRange("A1").getValue();
  var sinceDate = Utilities.formatDate(
    new Date(settingsSheet.getRange("B1").getValue()),
    Session.getScriptTimeZone(),
    "yyyy/MM/dd"
  );

  // 除外キーワード読み込み
  var excludeSheet = ss.getSheetByName("除外");
  var excludeValues = excludeSheet
    .getRange("A1:A" + excludeSheet.getLastRow())
    .getValues();
  var excludeKeywords = excludeValues
    .map(function(row) { return row[0]; })
    .filter(String);

  // Gmail検索
  var query = keyword + " after:" + sinceDate;
  var threads = GmailApp.search(query);

  // ドキュメント作成
  var docTitle = keyword + "_メール集約_"
    + Utilities.formatDate(
      new Date(),
      Session.getScriptTimeZone(),
      "yyyy-MM-dd"
    );
  var doc = DocumentApp.create(docTitle);
  var body = doc.getBody();

  var countTotal = 0;
  var countExcluded = 0;
  var countIncluded = 0;

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    var lastMsg = messages[messages.length - 1];
    var subject = lastMsg.getSubject();
    countTotal++;

    // 除外判定
    var isExcluded = excludeKeywords.some(function(ex) {
      return subject.indexOf(ex) !== -1;
    });
    if (isExcluded) {
      countExcluded++;
      continue;
    }

    // ドキュメントに追記
    body.appendParagraph("【件名】" + subject);
    body.appendParagraph(
      "【日時】" + lastMsg.getDate().toLocaleString("ja-JP")
    );
    body.appendParagraph("【差出人】" + lastMsg.getFrom());
    body.appendParagraph(lastMsg.getPlainBody());
    body.appendParagraph("─".repeat(40));
    countIncluded++;
  }

  doc.saveAndClose();

  // 実行ログ記録
  var logSheet = ss.getSheetByName("ログ");
  if (!logSheet) {
    logSheet = ss.insertSheet("ログ");
    logSheet.appendRow([
      "実行日時", "キーワード", "基準日",
      "総スレッド数", "除外数", "取得数", "ドキュメントURL"
    ]);
  }
  logSheet.appendRow([
    new Date(), keyword, sinceDate,
    countTotal, countExcluded, countIncluded,
    doc.getUrl()
  ]);

  Logger.log(
    "完了: " + countIncluded + "通取得 / "
    + countExcluded + "通除外"
  );
  Logger.log("ドキュメント: " + doc.getUrl());
}

初回セットアップ手順

コードをコピーしたら、以下の手順で環境を整えてください。

  1. Googleドライブで新しいスプレッドシートを作成する
  2. シート名を「設定」に変更し、A1にキーワード、B1に基準日(例:2026/02/01)を入力
  3. 新しいシートを追加し、シート名を「除外」に変更。A列に除外キーワードを1行ずつ入力
  4. メニュー「拡張機能 → Apps Script」でスクリプトエディタを開く
  5. 上記コードを貼り付けて保存(Ctrl+S)
  6. 関数「collectProjectEmails_v2」を選択して▶実行ボタンを押す
  7. 初回は権限承認ダイアログが出るので「許可」を選択

「ログ」シートは初回実行時に自動作成されます。実行後にログシートを確認し、取得数と除外数が想定どおりか確かめてください。

▶ GAS以外にもSendToカスタマイズやSeleniumなど、Windows環境で使える自動化テクニックをまとめています。
SE歴20年の業務自動化術|SendTo・Selenium・AIエージェントまで

集約ドキュメントをNotebookLMに投入するコツ

手動投入の効率化Tips

GASが生成したGoogleドキュメントのURLは、ログシートに自動記録されています。NotebookLMのソース追加画面で「Googleドライブ」を選択し、ドキュメント名で検索して追加します。ログシートのURL列をクリックすればドキュメントに直接アクセスでき、内容を目視確認してからNotebookLMに投入する運用が可能です。

投入前にドキュメントを開いて不要な部分がないか確認するひと手間を加えると、NotebookLMの回答精度がさらに安定します。v2の除外フィルタで大半は処理されていますが、件名に除外キーワードが含まれない想定外のメールが混入する可能性はゼロではありません。

自動投入はEnterprise限定──2026年3月時点の制約

NotebookLMにはEnterprise版のみAPI(notebooks.sources.batchCreate)が提供されています。GASからAPIを叩いてソースを自動追加する構成は技術的に可能ですが、Enterprise契約が必要です。NotebookLMの無料版・有料版の違いやEnterprise版の詳細は「NotebookLM活用術7選|SE歴20年が実務で使い倒した全記録」で比較しています。

2026年2月19日にNotebookLMのバックエンドモデルがGemini 3.1 Proに更新されました。回答精度が向上している一方、一部のユーザーからは大量ソース投入時の検索品質低下が報告されています。GASで集約したドキュメントをNotebookLMに投入する際は、投入後の回答精度を確認し、必要に応じてソースを分割することをおすすめします。

個人向けプラン(Free / Plus / Pro / Ultra)ではソースの自動追加APIは利用できません。2026年3月時点では手動投入が唯一の方法です。

次のステップ──Gemini APIで返信下書きを自動生成する構想

構想:集約メールの文脈をGeminiに渡して下書き生成

現在のスクリプトはメールを「集める」ところまでですが、次のステップとして「返信の下書きを自動生成する」機能を計画しています。集約したメール本文をGemini APIに渡し、プロジェクトの文脈を踏まえた返信下書きをGmailの下書きフォルダに保存する仕組みです。

GASのUrlFetchAppを使えばGemini APIを直接呼び出せます。集約済みドキュメントのテキストをプロンプトに含め、「このプロジェクトの経緯を踏まえて、以下のメールに対する返信案を3パターン生成してください」のような指示を送ることで、文脈に沿った下書きが期待できます。

Gemini API無料枠で副業・本業どちらにも十分

Gemini 2.5 Flashの無料枠は1日あたり250リクエスト(RPD 250)、Flash-Liteなら1,000リクエスト(RPD 1,000)です(2026年3月時点)。隔週で40通程度のメールに対して返信下書きを生成する用途であれば、無料枠の範囲内で十分に収まります。APIキーはGoogle AI Studioから取得できます。

Gemini 2.0 Flashは2026年6月1日、Gemini 2.5 Flashは2026年6月17日にそれぞれシャットダウンが予定されています。後継のGemini 3 Flash Preview(2025年12月公開)やGemini 3.1系モデルがAPI無料枠で利用可能になっています。本記事の姉妹記事で使用しているgemini-2.5-flashのモデル名は、シャットダウン前にgemini-3-flash-previewなどへ変更が必要です。最新の非推奨スケジュールはGoogle公式の非推奨モデル一覧で確認してください。

この構想は別記事で実装済みです。GASからGemini APIを呼び出し、プロジェクトの文脈を踏まえた返信下書きをGmailに自動保存するコード全文と実行結果を公開しています。本記事のv2スクリプトと同じ仕組みがベースなので、ここまでの内容を理解していればスムーズに読み進められます。

▶ 実装コードと手順の詳細はこちら
GAS×Gemini APIでメール返信下書きを自動生成する方法

GAS運用で知っておきたい注意点

GASにはいくつかの実行制限があります。1回の実行時間は最大6分で、これを超えるとスクリプトが強制終了します。40通程度のメール集約であれば問題ありませんが、数百通を対象にする場合は分割実行の仕組みが必要です。

トリガー(定期実行)は1プロジェクトあたり最大20個まで設定可能です。Google Workspaceアカウントと個人Googleアカウントでは実行上限が異なり、Workspaceアカウントのほうがメール送信数やURL Fetch回数の上限が高く設定されています。詳細はGoogle公式のApps Script割り当て量ページで確認できます。

前述のとおり、GASを開く際はscript.google.comに直接アクセスするとWorkspaceアカウントの切り替え問題で失敗することがあります。Googleドライブの「新規作成 → その他 → Google Apps Script」、または既存ファイルをドライブ内で検索して開くのが確実です。

よくある質問

Q
GASは無料で使えますか?
A

はい、Googleアカウントがあれば無料で使えます。Google Workspaceアカウントでも個人アカウントでも利用可能です。有料のWorkspaceプランのほうが実行回数の上限は高くなりますが、本記事のスクリプト程度であれば無料アカウントでも問題ありません。

Q
プログラミング経験がなくても大丈夫ですか?
A

本記事のコードはコピペで動作するように設計しています。スプレッドシートの「設定」「除外」シートに値を入力し、スクリプトを貼り付けて実行ボタンを押すだけです。エラーが出た場合のデバッグにはJavaScriptの基礎知識があると助かりますが、エラーメッセージをそのままChatGPTやGeminiに貼り付けて解決策を聞く方法もあります。ExcelVBAを使った業務効率化に興味がある方は「SE歴20年の時短術|Excel業務効率化15選」も参考になります。

Q
複数プロジェクトに対応できますか?
A

設定シートの行を増やし、スクリプトをループ処理に変更すれば対応可能です。ただし、プロジェクトごとに除外キーワードが異なる場合は、除外シートの構成も合わせて変更する必要があります。まずは1プロジェクトで運用を安定させてから拡張することをおすすめします。

Q
NotebookLMの個人向け有料プランでAPIは使えますか?
A

2026年3月時点では使えません。NotebookLM APIが提供されているのはEnterprise版のみです。個人向けプラン(Free / Plus / Pro / Ultra)ではソースの自動追加APIは利用できません。プランの確認方法や各プランの上限値は「NotebookLM活用術7選」のプラン比較表を参照してください。

Q
除外フィルタで取りこぼしが出たらどうすればいいですか?
A

ログシートで除外数を確認し、想定より少ない場合は除外シートにキーワードを追加してください。Gmailの検索演算子を活用して「from:特定アドレス」や「label:ラベル名」で対象を絞る方法も有効です。自動化ツールを組み合わせた業務効率化の考え方は「SE歴20年の業務自動化術」でも詳しく解説しています。

まとめ

本業のプロジェクトメールをGASで自動集約し、NotebookLMの思考整理に活用する方法を解説しました。最初の「動くけど荒い」v1から、スプレッドシート制御と除外フィルタを加えたv2への改善過程を通じて、GASの実践的な使い方を紹介しています。

NotebookLMへの自動投入は現時点でEnterprise限定ですが、手動投入でもGASによるメール集約だけで大幅な時短になります。次のステップとしてGemini APIによる返信下書き自動生成も別記事で実装・公開済みです。本記事のv2スクリプトをベースにGemini APIと連携して返信下書きを自動保存する手順を解説しています。

▶ 本記事のメール集約をベースに、Gemini APIで返信下書きを自動生成する方法はこちらで解説しています。

▶ 集約したメールからスライド資料を作りたい場合、AIスライド生成ツールの選び方が参考になります。

2026.03.25 ─ NotebookLMプラン体系・Gemini API非推奨情報・FAQ回答を更新
2026.03.20 ─ Gemini API無料枠RPD情報を最新データに修正
2026.03.01 ─ 初版公開

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