営業担当のメールのやり取りから、取引先ごとの商談の経緯と返事待ち・宿題を毎週要約し、フォローが止まっている取引先を一覧にする
営業担当のメールのやり取りを毎週読み、取引先ごとに商談の経緯と、どちらの返事待ちか、自社と先方の宿題を要約します。返事を待たせている取引先や、やり取りが止まっている取引先を一覧にし、週次の営業会議の前に担当者へ渡します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- IT・SaaS/人材/商社/広告
- 対象部門
- 営業
- 対象業務
- 要約/記録・議事録作成
- 主な課題
- 入力作業が多い/営業フォローが追いつかない/期限・対応漏れが起きる
- AIで行う処理
- 要約
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 営業担当が、日曜の夜か月曜の朝に、担当する取引先の一覧を開く
- 取引先ごとにGmailで社名やドメインを検索し、先週のスレッドを読み返す
- 先週あったこと、次にすること、返事を待っているものを、会議用のスプレッドシートに書く
- 自社が約束したこと(見積りの送付、資料の用意)があれば、期日と一緒に書く
- 営業マネージャーが会議の前に一覧を読み、止まっていそうな取引先に印を付ける
- 会議で印の付いた取引先について担当者に聞く
- 人営業担当が、担当する取引先とそのメールのドメインを取引先の一覧に登録しておく
- 自動毎週月曜の朝、営業担当それぞれのアカウントでスクリプトが動く
- 自動取引先ごとに、直近のスレッドを探してメッセージを取り出す
- 自動署名・引用・定型の文を取り除き、取引先ごとに時系列に並べる
- 自動最後のメールの送り手のドメインから、どちらの返事待ちかを規則で決める
- 自動AIが、経緯・返事を求めているか・自社と先方の宿題を要約する
- 自動規則で「止まっている」取引先に印を付け、共有の一覧に書き出す
- 人営業担当が自分の行を読み、誤りを直し、一言を足す
- 人営業マネージャーが「止まっている」の印の付いた取引先から読む
各工程の詳しい説明を読む
- 営業担当が、日曜の夜か月曜の朝に、担当する取引先の一覧を開く
- 取引先ごとにGmailで社名やドメインを検索し、先週のスレッドを読み返す
- 先週あったこと、次にすること、返事を待っているものを、会議用のスプレッドシートに書く
- 自社が約束したこと(見積りの送付、資料の用意)があれば、期日と一緒に書く
- 営業マネージャーが会議の前に一覧を読み、止まっていそうな取引先に印を付ける
- 会議で印の付いた取引先について担当者に聞く
(a)20社分のメールを読み返すのに時間がかかる。 1社4分でも、20社で80分です。15名が毎週これを行うと、月に80.0時間になります。 商談の準備に使いたい月曜の朝が、先週の振り返りで終わります。
(b)返事を待たせていることに気づかない。 取引先から質問が届き、後で返そうと思ったまま週末を越えると、次にスレッドを開くのは翌週の書き出しのときです。 そのときには、取引先の担当者は1週間待っています。
(c)止まっている取引先ほど書かれない。 メールが来ていない取引先は、2番目の検索で何も出てこないので、「特に動きなし」と1行で済まされます。 会議で知りたいのはまさにその取引先です。
(d)宿題の期日が流れる。 「来週中にお見積りを」と書いたことを、4番目で書き漏らすと、その約束は誰の一覧にも残りません。 期日を過ぎてから取引先に催促されて気づきます。
- 【人】 営業担当が、担当する取引先とそのメールのドメインを取引先の一覧に登録しておく
- 【自動】 毎週月曜の朝、営業担当それぞれのアカウントでスクリプトが動く
- 【自動】 取引先ごとに、直近のスレッドを探してメッセージを取り出す
- 【自動】 署名・引用・定型の文を取り除き、取引先ごとに時系列に並べる
- 【自動】 最後のメールの送り手のドメインから、どちらの返事待ちかを規則で決める
- 【自動】 AIが、経緯・返事を求めているか・自社と先方の宿題を要約する
- 【自動】 規則で「止まっている」取引先に印を付け、共有の一覧に書き出す
- 【人】 営業担当が自分の行を読み、誤りを直し、一言を足す
- 【人】 営業マネージャーが「止まっている」の印の付いた取引先から読む
8番目が、この設計の分かれ目です。 営業担当は書き出しをしなくなりますが、一覧から手を離すわけではありません。 電話や対面で決まったことはメールに残っていないので、AIの要約と自分の記憶が違うところを直すのは担当者の仕事です。
5番目と7番目を規則にしているのは、会議で使う印が週ごとにぶれると誰も信じなくなるためです。 「取引先からのメールに3営業日返していない」は、日付と送り手で決まります。AIに「止まっていそうか」を判断させると、同じ状況でも週によって印が付いたり付かなかったりします。
02今回想定するシステム構成
取引先の一覧(スプレッドシート) │ 取引先・ドメイン・担当者・商談の段階 ▼【トリガー】毎週月曜 6時台(営業担当それぞれのアカウント) Google Apps Script ├──▶ GmailApp で取引先ごとにスレッドを探す ├──▶ 署名・引用の除去、時系列に並べる ├──▶ 最後のメールの送り手で「どちらの返事待ちか」を決める ▼ Gemini API ── 取引先ごとの要約(構造化出力) │ ① 先週までの経緯 ② 最後のメールが返事を求めているか │ ③ 自社の宿題 ④ 先方の宿題 ⑤ 次の一手の候補 ▼ Google Apps Script ── 「止まっている」の規則判定 ▼ 週次の一覧(共有のスプレッドシート) ├──▶ 営業担当が自分の行を直す └──▶ 営業マネージャーが会議の前に読む
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python、Power Automate、Make |
| 生成AI | Gemini API | OpenAI API、Claude API |
| メール | Gmail(営業担当それぞれのアカウント) | Outlook |
| 台帳 | Google スプレッドシート(取引先の一覧・週次の一覧) | Microsoft Lists |
新しく足すのは、スクリプトと Gemini API の利用だけです。 メールは今のGmailを読み、書き出し先は今の会議用のスプレッドシートを置き換えます。最初の準備作業は、取引先の一覧にメールのドメインの列を足すことです。
スクリプトは、営業担当それぞれのアカウントで動かします。 インストール型のトリガーは、作った人のアカウントで動きます。 GmailApp が読めるのは、スクリプトを動かしている人のメールです。営業マネージャーのアカウントで1本動かしても、営業担当のメールは読めません。 15名それぞれが同じスクリプトのトリガーを自分で作り、結果を共有の一覧に書く形にします。
メールの読み出しは GmailApp で行います。 search(query) で検索語に当たるスレッドを探せますが、スレッドの大きさの合計が大きすぎると失敗するとされ、開始位置と件数を指定する search(query, start, max) が用意されています。スレッドからは getLastMessageDate で最後のメールの日時、getMessageCount で通数、getMessages でメッセージを取り出せます。メッセージからは getFrom(送信者)、getTo、getCc、getDate、getPlainBody(HTMLを除いた本文)を読みます。
03どうやって実装するのか
処理の起点を決める
毎週月曜の朝に、時間主導型のトリガーで動かします。 時間主導型のトリガーは、毎分から月1回まで設定でき、時刻はおおよその幅で決まります。 6時に設定すると6時から7時のあいだに動き、その時刻は週ごとに保たれます。会議が10時なら、営業担当が9時までに直せるように6時台にします。
取引先からの質問を週に1回しか拾わないのでは、(b)の待たせる問題が残ります。 そこで、返事待ちの判定だけは毎朝動かすもう1つのトリガーを置きます。毎朝の処理はAIを呼ばず、最後のメールの送り手と日付だけを見て、自社の返事待ちが3営業日を超えた取引先を、その担当者だけにメールで知らせます。
トリガーが失敗したときは、作った人に失敗をまとめたメールが届きます。 営業担当の誰かのトリガーが止まると、その人の行だけが一覧から抜けます。 週次の一覧に「最終更新」の列を持たせ、更新されていない担当者を営業マネージャーが見て分かるようにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 取引先の一覧 | 取引先名、メールのドメイン、個別のアドレス、担当者、商談の段階、顧客管理のID | 取引先の一覧(シート) |
| スレッド | 取引先のドメインと送受信したスレッド。最後のメールの日時、通数 | 営業担当のGmail(GmailApp) |
| メッセージ | 送信者、宛先、CC、日時、HTMLを除いた本文 | GmailMessage |
| 自社のドメイン | 自社と子会社のメールのドメイン | スクリプトのプロパティ |
| 前週の一覧 | 先週の要約と、担当者が直した内容 | 週次の一覧(シート) |
質を決めるのは、取引先の一覧のドメインの列です。 ドメインが無い取引先は、メールを探す手がかりがありません。取引先の担当者が個人のメールのドメインから書いてくる場合は、そのアドレスを個別の列に入れます。 個人のメールのドメインそのものを取引先のドメインとして登録すると、関係のない人のメールまで拾います。
前週の一覧を渡すのは、経緯をつなぐためです。 先週の要約と、担当者が直した一言を一緒に渡すと、電話で決まったことが今週の要約に引き継がれます。 メールだけを渡すと、電話で済んだ話がまだ未解決として出続けます。
データの取得方法を決める
取引先ごとに、そのドメインとの送受信のスレッドを、直近の分だけ取ります。 一度に全取引先を検索すると、スレッドの合計が大きくなって失敗するおそれがあるので、取引先ごとに検索し、件数を区切って読みます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| スレッドの一覧 | search(query, start, max) | 取引先ごとの直近のやり取り |
| 最後のメールの日時 | getLastMessageDate | 「止まっている」の判定 |
| メッセージ | getMessagesForThreads | まとめて取り出す |
| 送信者と日時 | getFrom、getDate | どちらの返事待ちかの判定 |
| 本文 | getPlainBody | AIへ渡す本文 |
送信者のアドレスから、ドメインを取り出して自社か取引先かを決めます。 getFrom は表示名とアドレスが一緒に返ることがあるので、アドレスの部分だけを取り出してから比べます。 自社のドメインの一覧はスクリプトのプロパティに置きます。スクリプトのプロパティは、そのスクリプトのすべての利用者に共有される、アプリ全体の設定値の置き場所です。値は文字列で保存されるので、ドメインはカンマで区切った文字列にします。
下書きとゴミ箱のメッセージは除きます。 isDraft と isInTrash で確かめ、まだ送っていない下書きを「自社が返信した」と数えないようにします。
AIへ渡す前に整形する
- 引用の除去 … 返信の本文には、前のメールの全文が引用として付いてきます。引用を残すと、同じ内容を何度も要約します
- 署名の除去 … 自社と取引先の署名を取り除きます。電話番号や住所をAIへ渡さないためでもあります
- 定型の文の除去 … 「いつもお世話になっております」などの書き出しと結びを除きます
- 時系列に並べる … 取引先ごとに、複数のスレッドのメッセージを日時の順に並べ、送り手が自社か取引先かの印を付けます
- 長さの調整 … 1社の本文が長すぎるときは、古いものから削り、直近の分を必ず残します
- 一斉配信の除外 … 取引先からのメールマガジンや自動送信の通知を除きます。送り手のアドレスの一覧で除き、返事待ちの判定に入れません
1番目を軽く見ないでください。 引用を残したまま渡すと、3週間前の「お見積りをお送りします」が、今週の宿題としてもう一度出てきます。 宿題の一覧が膨らむと、担当者は一覧を読まなくなります。
AIに処理させる
させるのは、取引先ごとに5つの項目を決まった形で書き出すことです。
| 見るもの | 書き方 | 判断できないときの扱い |
|---|---|---|
| 経緯 | 先週までに何が起き、今どこにいるかを3文以内で | 前週の一覧と食い違えば、両方の根拠を書く |
| 最後のメールが返事を求めているか | reply_needed/no_reply_needed | 迷ったら reply_needed |
| 自社の宿題 | 何を、いつまでに。根拠のメールの日付 | 期日が無ければ「記載なし」 |
| 先方の宿題 | 何を、いつまでに。根拠のメールの日付 | 期日が無ければ「記載なし」 |
| 次の一手の候補 | 1文 | メールから言えなければ書かない |
2行目の「迷ったら reply_needed」が、この構成でいちばん大事な決めごとです。 返事を求めていないメールを reply_needed にしても、担当者が一度見て消すだけです。返事を求めているメールを no_reply_needed にすると、その取引先は返事を待たせたまま一覧から消えます。 誤りの重さが違うので、迷ったときの寄せ先を決めます。
宿題は、メールの中で約束した言葉を根拠にします。 「来週中にお送りします」は、メールの日付から見た来週です。AIには期日を日付に直させず、本文の言葉と、そのメールの日付を並べて書かせます。 日付への換算はスクリプトで行います。
| させないこと | 理由 |
|---|---|
| どちらの返事待ちかを決める | 最後のメールの送り手で決まる。規則で決める |
| 「止まっている」かを決める | 日付と送り手で規則判定する。週ごとにぶれさせない |
| 期日を作る | メールに無い期日が一覧に載ると、本当の期限と区別がつかない |
| 受注の見込みを点数にする | メールだけでは分からない。担当者の判断に残す |
| 取引先への返信を書く | この構成は状況の書き出しまで |
3行目がいちばん起きやすい失敗です。 「お見積りをお送りします」に期日が無いとき、何も言わなければ「今週中」と書き足してきます。 書き足された期日は、担当者の記憶にも取引先の期待にも無い期日です。
指示内容を固定する
あなたは営業部で、担当者の週次の営業会議の準備を手伝う係です。
下のメールのやり取りは、1つの取引先とのものです。
書かれていることだけを使い、推測で補わないでください。
【取引先】{account_name}(商談の段階:{stage})
【先週の一覧の内容と、担当者が直した一言】{last_week}
【メールのやり取り(古い順。各メールに日付と、送り手が自社か取引先かの印)】
{messages}
【書き出す項目】
1. history … 先週までに何が起き、今どこにいるかを3文以内で
2. last_message_reply … 最後のメールが返事を求めているか
- reply_needed ...... 質問、依頼、日程の打診など、返事が要る
- no_reply_needed ... お礼や了承だけで、返事が要らない
迷ったときは reply_needed を選んでください。
3. our_tasks … 自社が約束したこと
4. their_tasks … 取引先が約束したこと
5. next_step … 次の一手の候補を1文。メールから言えなければ空にする
【厳守事項】
- 宿題の期日は、メールに書かれた言葉のまま due_text に写してください。
「来週」を日付に直さないでください。期日が書かれていなければ「記載なし」としてください。
- 宿題ごとに、根拠にしたメールの日付を source_date に入れてください。
- 引用された古いメールの中の約束を、今回の宿題として数えないでください。
- 先週の一覧で担当者が「済んだ」と書いたものは、メールに新しい動きが無ければ宿題に入れないでください。
- 受注の見込み、取引先の担当者の人柄、営業担当の対応の良し悪しは書かないでください。
- メールに書かれていない電話や対面の内容を想像して補わないでください。
「先週の一覧で担当者が『済んだ』と書いたもの」の一文は、二重の宿題を防ぐために入れます。 電話で見積りの話が済んでいても、メールには「お送りします」としか残っていません。担当者が直した一言を正として扱わせることで、毎週同じ宿題が出続けるのを止めます。
「営業担当の対応の良し悪しは書かない」は、一覧の使われ方を決めるために入れます。 この一覧は会議の準備のためのもので、担当者を評価するためのものではありません。
出力形式を固定する
次の形のJSONで受け取ります。
{
"account_id": "",
"history": "",
"last_message_reply": "reply_needed | no_reply_needed",
"our_tasks": [
{ "task": "", "due_text": "来週中", "source_date": "2026-09-29" }
],
"their_tasks": [
{ "task": "", "due_text": "記載なし", "source_date": "2026-10-01" }
],
"next_step": ""
}
1つ目の理由は、週次の一覧の列にそのまま書けることです。 Gemini API の構造化出力では、response_format に MIME タイプ application/json とスキーマを渡します。required と enum が使えるので、last_message_reply を2つの値に絞り、すべての取引先で同じ列が埋まるようにします。
2つ目は、規則の判定にAIの値の一部だけを使えることです。 スクリプトは、スレッドから取った日付と送り手に、AIの last_message_reply を1つだけ足して判定します。
| 印 | 条件 |
|---|---|
waiting_on_us | 最後のメールが取引先からで、reply_needed、送られてから3営業日を超えた |
waiting_on_them | 最後のメールが自社からで、送ってから10営業日を超えた |
task_overdue | 自社の宿題の due_text をスクリプトが日付に直せて、その日付を過ぎた |
silent | 商談の段階が「進行中」で、最後のメールから21日を超えた |
ok | 上のいずれにも当たらない |
日数は自社の営業の取り決めで置き換えてください。 規則はスプレッドシートの側に置き、営業マネージャーが変えられるようにします。
3つ目は、値を検査できることです。 Gemini API の案内でも、構造化出力の値はアプリケーションの側で検査すべきとされています。source_date が渡したメールの日付のどれかに一致しない宿題は、根拠の無い宿題として一覧に載せず、担当者の確認欄に回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取引先の一覧 | スプレッドシートの読み取り | 担当する取引先とドメイン |
| 営業担当のGmail | GmailApp の読み取り | スレッドとメッセージ |
| Gemini API | UrlFetchApp.fetch | 取引先ごとの要約 |
| 週次の一覧 | スプレッドシートへの書き込み | 要約、宿題、規則の印、最終更新 |
| 営業担当への知らせ | Gmail から本人へのメール | 毎朝の waiting_on_us の一覧 |
メールには書き込みません。 ラベルを付ける、既読にする、下書きを作る、といった操作はしません。営業担当のメールの状態を変えないことで、スクリプトを入れても普段の使い方が変わらないようにします。
顧客管理のシステムにも書き込みません。 週次の一覧から顧客管理のシステムへ写すかは、担当者が直した後に決めます。AIの要約がそのまま顧客管理の履歴に残ると、誤りが正式な記録になります。
1回の実行は6分までです。 20社を順に処理し、1社ごとにAIを呼ぶと、6分に近づくことがあります。どこまで処理したかをユーザーのプロパティに残し、6分に近づいたら区切って、数分後に続きを動かすトリガーを置きます。 Google Workspace のアカウントでは、メールの読み書きが1日50,000回、トリガーの合計実行時間が1日6時間とされています。
人が確認する
営業担当は、自分の行を必ず見ます。 見る順番を決めておきます。
waiting_on_usの取引先を先に見る … 本当に返していないかを確かめます。電話で返していれば、一言欄に「電話で回答済み」と書きます- 自社の宿題を確かめる … 済んだものは「済んだ」と書きます。この一言が、翌週の要約に引き継がれます
- 経緯の誤りを直す … メールに残っていない電話や対面の内容を一言欄に足します
silentの取引先に一言を書く … 止まっている理由が分かっていれば書きます
営業マネージャーは、印の付いた行から読みます。 全行を読まずに、waiting_on_us、task_overdue、silent の順に見ます。
2番目を省かないでください。 「済んだ」を書かないと、同じ宿題が毎週出続け、一覧の宿題の欄を誰も信じなくなります。 書くのは1語で足ります。
目標は、1社あたり1分です。 書き出しの作業が無くなり、読んで、違うところだけを直す作業になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 取引先のドメインが一覧に無い | その取引先は「ドメイン未登録」と書き、要約しない |
| スレッドが大きすぎて検索が失敗する | 件数を区切って読み直す。それでも失敗すれば、その取引先だけ「読み取り失敗」と書く |
| 1回の実行が6分に近づく | 進み具合をプロパティに残し、続きを別の実行で処理する |
| 取引先との1通もない週 | AIを呼ばず、日付だけで silent かを判定する |
| 最後のメールが自動送信の通知 | 一斉配信の一覧で除いた後の、最後の人のメールで判定する |
| Gemini API が応答しない、失敗する | muteHttpExceptions を true にして状態を見て、その取引先を「要約失敗」として残す |
| 根拠の日付が無い宿題が返る | 一覧に載せず、担当者の確認欄に回す |
| 担当者の交代 | 取引先の一覧の担当者を変える。前の担当者のメールは読めないので、引き継ぎの一言を前週の一覧に書いてもらう |
| トリガーが止まっている担当者がいる | 「最終更新」の列で営業マネージャーが気づく |
8行目は、この構成の限界です。 スクリプトは、動かしている本人のメールしか読めません。担当者が交代したとき、前の担当者とのやり取りは新しい担当者の要約に入りません。 前週の一覧の要約と一言が、引き継ぎの材料になります。
記録を残す
- 週ごとの一覧(要約、宿題、規則の印、担当者の一言)と、その週に読んだスレッドの ID
- AIが返したJSONの全文
- 規則の判定に使った日付と送り手
- 担当者が直した内容と、AIの要約から何を変えたか
- 処理に失敗した取引先と、その理由
メールの本文は一覧に残しません。 残すのはスレッドの ID と要約までにし、本文は必要なときにGmailで開きます。 一覧が共有されるので、本文を写すと、取引先とのやり取りが担当者の外へ広がります。
4つ目の記録は、指示の改善の材料になります。 担当者が毎週同じ種類の誤りを直しているなら、指示か前処理に足りないところがあります。
04実装レベルの3段階
最小構成では、20社分のメールをコピーする手間が残ります。 確かめるための段階です。 半自動化で、1社4分が1分になります。 読み出しと要約と印が自動になり、担当者は自分の行を読んで直すだけです。本記事の想定はこの段階です。 本格構成は、半自動化を3か月回してから考えます。 担当者が直した内容が毎週どれくらいあるかを見て、直しの少ない項目から顧客管理へ写します。 直しの多い項目を写すと、誤りが顧客管理の正式な記録に残ります。
05工数削減シミュレーション
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 法人向けのSaaS・商社・広告・人材サービスなど、取引先とのやり取りの多くをメールで行っている営業組織。営業担当1人が同時に十数社から数十社の商談を持ち、週次の営業会議の前に取引先ごとの状況を書き出している場合。Google Workspace を使い、取引先のメールのドメインを一覧にできる場合。返事を待たせている取引先や、宿題の期限切れに気づくのが遅れている場合。
- 取引先とのやり取りが電話と対面とチャットが中心で、メールにほとんど残らない場合。営業担当1人が持つ取引先が数社で、全部を覚えていられる場合。メールの内容を外部のAIサービスへ送ることが取引先との契約で禁じられている場合。営業担当の評価や監視のためにメールを読みたい場合。
07最小構成で試す方法
- 営業担当1名が、担当する取引先から5社を選ぶ(うち1社は、返事を待たせていると分かっている取引先を入れる)
- その5社について、先週の会議用の書き出しを手元に用意する
- 取引先ごとに先週のメールを古い順にコピーし、引用と署名を手で消す
- 手元のAIサービスの画面に、第7章の指示とメールを貼り、5つの項目を書き出させる
- 出てきた要約を、先週の自分の書き出しと突き合わせる
これを2週続けてください。 2週目は、1週目の要約に自分で「済んだ」を書いたものを先週の一覧として渡します。前週の一覧を渡すと宿題が引き継がれるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 自分の書き出しとほぼ同じ宿題が出た | スクリプトでの読み出しに進む |
| 書かれていない期日を足してきた | 指示の書き方で直る。構成は有効 |
| 引用の中の古い約束が宿題に出た | 前処理の引用の除去を先に作る |
3行目は、手で消したつもりでも出ます。 返信の本文の中に、前のメールの一部を自分で貼り直していることがあるからです。引用の除去を自動にする前に、どういう形の引用が多いかを見ておきます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
返事を求めるメールが no_reply_needed になる | 迷ったら reply_needed に寄せる |
| 書かれていない期日が足される | 期日は本文の言葉のまま写させ、無ければ「記載なし」 |
| 引用の中の古い約束が毎週出る | 前処理で引用を除く。前週の一覧の「済んだ」を渡す |
| 下書きを「返信した」と数える | isDraft と isInTrash で除く |
| マネージャーのアカウントで動かしても担当者のメールが読めない | トリガーは営業担当それぞれのアカウントで作る |
| 6分で処理が途中で止まる | 進み具合をプロパティに残して続きを動かす |
| 個人のメールのドメインで関係のないメールを拾う | 個人のドメインは取引先のドメインに入れず、アドレスで登録する |
| メールマガジンが返事待ちに数えられる | 一斉配信の送り手を一覧で除く |
| 担当者の交代で経緯が途切れる | 前週の一覧に引き継ぎの一言を書く |
| AIの要約がそのまま顧客管理に残る | 半自動化では顧客管理に書き込まない |
| 一覧が担当者の評価に使われる | 対応の良し悪しを書かせない。使い方を先に決める |
上の3行が、この構成の失敗のほとんどです。 どれも、メールに書かれていないことが一覧に載るという同じ問題です。期日を作らせない、迷ったら返事が要るほうに寄せる、古い約束を引き継がない。この3つを設計で決めておくかどうかで、一覧が信じられるかが決まります。
5行目は、作り始めて最初に当たる壁です。 1本のスクリプトで全員分を読めるように見えますが、GmailApp が読めるのは動かしている本人のメールだけです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 取引先とのメールの本文、取引先の担当者の名前とアドレス、見積りや契約の条件、そして営業担当ごとの対応の記録です。
- 外部へ渡す範囲を、要約に必要なところまでに限る … 署名・引用・添付ファイルはAIへ渡しません。添付ファイルの見積書や契約書は、この構成では読みません
- Gemini API は有料の枠で使う … 無料の枠では、機密や個人の情報を送らないよう求められ、有料の枠ではプロンプトと応答を製品の改善に使わないとされています
- 取引先との契約を確かめる … 秘密保持の契約で、やり取りの内容を第三者のサービスで扱うことに制限がある取引先があります。その取引先は一覧で「対象外」にし、読み出さないようにします
- 一覧を評価や監視に使わない … この構成は、営業担当のメールを本人のアカウントで読み、本人のための要約を作るものです。営業マネージャーが担当者のメールを読むための仕組みにしないと、最初に決めて担当者に伝えます
- 共有の一覧に本文を写さない … 一覧に残すのは要約とスレッドの ID までにします
- トリガーの権限を担当者に説明する … スクリプトは本人のメールを読む権限で動きます。何を読み、何を書くかを手順書に書き、承認の画面を通す前に読んでもらいます
誤りが起きた場合のリスクは、返事を求めるメールを見落とすことと、無い期日を一覧に載せることの2つです。 前者は reply_needed への寄せ方で、後者は期日を作らせないことで防ぎます。どちらも、担当者が自分の行を読む工程を外さないことが最後の守りです。
10まず何から始めるか
1週目:取引先の一覧にドメインを足す
営業担当それぞれが、担当する取引先のメールのドメインと、個人のアドレスで書いてくる担当者のアドレスを一覧に足します。秘密保持の契約で対象外にすべき取引先がないかも、このときに確かめます。
2週目:1名が5社で試す
営業担当1名が5社を選び、手元のAIサービスで要約させます。書かれていない期日を足していないか、引用の中の古い約束を拾っていないかを最優先で見ます。
3週目:規則と使い方を決める
waiting_on_us、waiting_on_them、task_overdue、silent の日数を、営業マネージャーと決めます。一覧を評価に使わないことを、担当者に伝えます。
4週目:3名のアカウントで動かす
3名がそれぞれのアカウントでトリガーを作り、共有の一覧に書き出すところまで作ります。この時点では、担当者が自分の書き出しも並べて書き、要約とのずれを数えます。
2か月目: 15名に広げ、毎朝の waiting_on_us の知らせを足します。3か月目以降: 担当者が直した内容の量を見て、1社4分が何分になったかを実測します。担当者の直しが1社に一言程度に収まり、会議で「止まっている」の印から話が始まるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
search(query) と、開始位置と件数を指定する search(query, start, max) があり、スレッドの大きさの合計が大きすぎると失敗すること。getMessagesForThreads が複数のスレッドのメッセージを返すこと。https://mail.google.com/ のスコープが要ること | Google for Developers: Class GmailApp | 2026-10-06 |
GmailThread の getLastMessageDate(最後のメールの日時)、getMessageCount、getMessages、getFirstMessageSubject、getId | Google for Developers: Class GmailThread | 2026-10-06 |
GmailMessage の getFrom、getTo、getCc、getDate、getPlainBody(HTMLを除いた本文)、isDraft、isInTrash | Google for Developers: Class GmailMessage | 2026-10-06 |
| 時間主導型のトリガーが毎分から月1回まで設定でき、時刻が1時間の幅で決まり、その時刻が保たれること。インストール型のトリガーが作った人のアカウントで動くこと。失敗時に失敗をまとめたメールが届くこと | Google for Developers: Installable Triggers | 2026-10-06 |
| 1回の実行が6分まで、Google Workspace のアカウントでメールの読み書きが1日50,000回、トリガーの合計実行時間が1日6時間であること。上限が予告なく変わりうること | Google for Developers: Quotas for Google Services | 2026-10-06 |
| スクリプトのプロパティがすべての利用者に共有されるアプリ全体の設定値の置き場所で、ユーザーのプロパティが利用者ごとであること。値が文字列で保存されること | Google for Developers: Properties Service | 2026-10-06 |
response_format に MIME タイプ application/json とスキーマを渡すこと。enum・required が使えること。値をアプリケーションの側で検査すべきこと | Google AI for Developers: Structured outputs | 2026-10-06 |
| 無料の枠では送った内容と応答が製品の改善に使われ、機密や個人の情報を送らないよう求められていること。有料の枠ではプロンプトと応答を製品の改善に使わないこと | Google AI for Developers: Gemini API Additional Terms of Service | 2026-10-06 |
「止まっている」とする日数と、一覧の使い方は、自社の営業の責任者と決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。取引先とのメールを外部のAIサービスで扱うことの契約上の扱いは、自社の法務の担当者に確認してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0476)についてのご相談はこちらから。
