顧問先から届くメールから期限のある依頼を拾ってタスク表に載せ、期限の近いものを毎朝担当者に知らせる
顧問先から届くメールを読み、期限のある依頼(書類の提出・手続き・回答)を拾って担当者別のタスク表に1行ずつ載せます。毎朝、期限の近いものと期限を過ぎたものを担当者へ知らせます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/n8n/Power Automate
- 対象業界
- その他/不動産/士業/建設
- 対象部門
- 総務
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が朝と昼休み明けにメールを開き、受け持つ顧問先からのものを読む
- 本文を読み、事務所に何かを頼んでいるか、期限が書かれているかを判断する
- 依頼があれば、自分の手帳や表に「顧問先名・依頼の中身・期限」を書き写す
- 期限が「月末」「来週中」のような書き方なら、日付に直して書く
- 毎朝、手帳や表を見返し、期限の近いものから手を付ける
- 休む日は、隣の担当者に口頭で「この件だけ見ておいて」と頼む
- 担当替えのときは、引き継ぎのメモを作り、残っている依頼を書き出す
- 自動平日の毎時、共通の受付アドレスに届いた未処理のメールを集める
- 自動差出人のアドレスを顧問先台帳と照らし、顧問先と担当者を決める。台帳に無い差出人は「顧問先不明」に回す
- 自動引用部分・署名・定型のあいさつを落とし、本文を短くする
- 自動生成AIが依頼を1件ずつ取り出し、中身・期限・期限の書かれ方・誰がやるのかをJSONで返す
- 自動相対的な期限(「月末」「来週中」)を、メールの受信日と事務所の休業日表から日付に直す
- 自動タスク表に1行ずつ追記し、元のメールへのリンクを付ける。状態は「未確認」にする
- 人担当者がタスク表の「未確認」の行を見て、中身と期限を確かめ、「確認済」にする。期限が空欄の行は担当者が埋める
- 自動毎朝8時台に、担当者ごとに「期限を過ぎたもの」「3営業日以内のもの」「未確認のまま24時間たったもの」をメールで知らせる
- 人依頼を終えたら、担当者がタスク表の状態を「完了」にする
各工程の詳しい説明を読む
- 担当者が朝と昼休み明けにメールを開き、受け持つ顧問先からのものを読む
- 本文を読み、事務所に何かを頼んでいるか、期限が書かれているかを判断する
- 依頼があれば、自分の手帳や表に「顧問先名・依頼の中身・期限」を書き写す
- 期限が「月末」「来週中」のような書き方なら、日付に直して書く
- 毎朝、手帳や表を見返し、期限の近いものから手を付ける
- 休む日は、隣の担当者に口頭で「この件だけ見ておいて」と頼む
- 担当替えのときは、引き継ぎのメモを作り、残っている依頼を書き出す
(a)依頼が本文の途中に埋もれる。 顧問先のメールは、資料の送付と報告と依頼が1通に混ざって届きます。「領収書を送ります。あと、来月から役員報酬を変えたいので手続きをお願いします」。件名は「領収書」のままで、依頼は3段落目にあります。 件名だけで流し読みすると、ここで落ちます。
(b)期限の管理が担当者の記憶頼み。 2番から5番は全部、担当者の頭と手帳の中で行われています。本人が覚えている限りは回りますが、繁忙期に1件抜けると、気づくのは顧問先から「どうなりましたか」と聞かれたときです。
(c)休みと担当替えで抜ける。 6番の口頭の引き継ぎは、頼んだ側が思い出せた件だけが渡ります。7番の引き継ぎメモも同じで、書き出し漏れた依頼は、新しい担当者の誰の手帳にも載りません。
(d)顧問先の約束は誰も追っていない。 「書類は月末までに送ります」と顧問先が書いてきても、それを記録する人はいません。届かなかったことに気づくのは、事務所の作業が止まったときです。
- 【自動】 平日の毎時、共通の受付アドレスに届いた未処理のメールを集める
- 【自動】 差出人のアドレスを顧問先台帳と照らし、顧問先と担当者を決める。台帳に無い差出人は「顧問先不明」に回す
- 【自動】 引用部分・署名・定型のあいさつを落とし、本文を短くする
- 【自動】 生成AIが依頼を1件ずつ取り出し、中身・期限・期限の書かれ方・誰がやるのかをJSONで返す
- 【自動】 相対的な期限(「月末」「来週中」)を、メールの受信日と事務所の休業日表から日付に直す
- 【自動】 タスク表に1行ずつ追記し、元のメールへのリンクを付ける。状態は「未確認」にする
- 【人】 担当者がタスク表の「未確認」の行を見て、中身と期限を確かめ、「確認済」にする。期限が空欄の行は担当者が埋める
- 【自動】 毎朝8時台に、担当者ごとに「期限を過ぎたもの」「3営業日以内のもの」「未確認のまま24時間たったもの」をメールで知らせる
- 【人】 依頼を終えたら、担当者がタスク表の状態を「完了」にする
7番目が、この設計の分かれ目です。 AIが拾った依頼は、担当者が一度目を通すまで「未確認」のままです。期限の読み違いは、そのまま期日の見落としになるからです。 ただし全メールを読み直すのではなく、拾われた行だけを見ます。
8番目で「未確認のまま24時間」を知らせるのも意図してのことです。 7番が飛ばされると、AIの読み違いが確かめられないまま期日を迎えます。確認されていない行が残っていること自体を、朝の一覧に出します。
02今回想定するシステム構成
顧問先からのメール(共通の受付アドレス) │ ▼【トリガー】平日の毎時(時間主導型トリガー) Google Apps Script ├──▶ Gmail ── 未処理ラベルの付いていないスレッドを検索して取得 ├──▶ 顧問先台帳(スプレッドシート)── 差出人 → 顧問先・担当者 ├──▶ 前処理 ── 引用・署名・あいさつを落とす ├──▶ Gemini API(構造化出力) │ 依頼の中身/期限/期限の書かれ方/やるのは誰か ├──▶ 期限の日付化 ── 受信日と休業日表から ├──▶ タスク表(スプレッドシート)へ追記 ──「未確認」 └──▶ 処理済みのスレッドにラベルを付ける ▼【トリガー】平日の毎朝8時台 Google Apps Script ── 担当者ごとの朝の一覧をメールで送る ▼ 【人】担当者が「未確認」を確かめ、期限を埋め、完了を付ける
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、n8n |
| 生成AI | Gemini API(構造化出力) | Claude API、OpenAI API |
| タスク表 | Google スプレッドシート | 事務所向けの案件管理システム |
| メール | Gmail(共通の受付アドレス) | Microsoft Outlook |
案件管理システムが入っているなら、まずその依頼の登録機能を確かめてください。 この構成が役に立つのは、依頼がメールで届く流れを変えられない場合です。
Google Apps Script を選ぶのは、メールもタスク表も同じ Google Workspace の中にあるからです。 Gmail を読むのは GmailApp で、検索は search(query, start, max) の形でページを分けて呼べます。メッセージからは getPlainBody()(HTMLの書式を除いた本文)、getFrom()、getDate()、getSubject()、getId() が取れます。外へ出るのは、生成AIへの呼び出しだけです。
実行は、トリガーを作った人のアカウントで行われます。 インストール型のトリガーは、作成した人のアカウントの権限で動くとされています。共通の受付アドレスを読める専用のアカウントで作り、個人のアカウントで作らないでください。 その人が退職すると、トリガーが止まります。
上限も Google Workspace のアカウントを前提に見ます。 1回の実行は6分まで、トリガーの合計の実行時間は1日6時間、URL Fetch の呼び出しは1日10万回、メールの送信先は1日1,500件です。月1,200件なら余裕があり、効いてくるのは6分の上限だけです(第7章)。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを2本使います。 1本目は平日の毎時に動き、新しいメールから依頼を拾います。2本目は平日の朝8時台に1回動き、担当者ごとの一覧を送ります。
時間主導型のトリガーは毎分から月1回まで指定できますが、実行時刻は少しばらつきます。 9時のトリガーなら9時から10時の間で時刻が選ばれ、以後はその時刻で続くとされています。朝の一覧が8時ちょうどに届く必要はないので、この幅で困ることはありません。
メールが届いた瞬間に処理しないのは、顧問先がメールを続けて送ってくるからです。 「先ほどの件、期限は25日でした」と10分後に訂正が来ることがあります。1時間分をまとめて同じスレッドとして読むほうが、期限の取り違えが減ります。
1回の実行で処理するのは、最大30スレッドまでにします。 1回の実行は6分が上限です。生成AIの呼び出しを含めると1スレッドに数秒かかるため、余裕をみて件数で止め、残りは次の回に回します。 未処理のラベルで区別しているので、取りこぼしは起きません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| メール | 件名、差出人、宛先・CC、受信日時、本文(書式なし)、添付ファイルの名前、スレッドID | Gmail(共通の受付アドレス) |
| 顧問先台帳 | 顧問先コード、名称、登録済みの差出人アドレスとドメイン、主担当・副担当 | スプレッドシート |
| 休業日表 | 事務所の休業日(土日祝、年末年始、夏季休業) | スプレッドシート |
| 未完了のタスク | 同じ顧問先の「未確認」「確認済」の行(依頼の中身と期限) | タスク表 |
質を決めるのは、顧問先台帳の差出人アドレスです。 顧問先の経理担当者が替わると、知らないアドレスからメールが来ます。台帳に無い差出人は、AIに回す前に「顧問先不明」として総務へ回します。 推測で顧問先を当てると、別の会社の依頼が別の担当者のタスクに載ります。
未完了のタスクを渡すのは、同じ依頼の二重登録を避けるためです。 顧問先は、返事がないと同じ依頼をもう一度送ってきます。既存の行と同じ依頼なら、新しい行を作らずに「再依頼あり」の印を付けます。 催促されたという事実は、それ自体が担当者に知らせるべき情報です。
添付ファイルは中身を読みません。名前だけを渡します。 「源泉所得税納付書.pdf」という名前は、依頼の中身を補う手がかりになります。中身を読む必要がある書類の仕分けは、UC-0072 の構成の役目です。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 未処理のスレッド | Gmail | search() で「受付アドレス宛て、処理済みラベル無し、2日以内」を検索 |
| メッセージ | スレッド | getMessagesForThread() でスレッド内の全メッセージ |
| 本文・差出人・日時 | メッセージ | getPlainBody()、getFrom()、getDate()、getSubject() |
| 宛先・CC | メッセージ | getTo()、getCc() |
| 添付の名前 | メッセージ | getAttachments() で得たファイルの名前だけ |
| 台帳・休業日・未完了 | スプレッドシート | シートを読み、スクリプトの中で引く |
検索の条件には、Gmail の検索演算子を使います。 処理済みのラベルを除くには -label: を、期間を絞るには newer_than:2d を付けます。期間を絞るのは、ラベルの付け忘れで古いスレッドを延々と読み直さないためです。
処理が終わったスレッドには、ラベルを付けます。 ラベルは createLabel() で一度作り、以後は getUserLabelByName() で引きます。ラベルを付けるのは、タスク表への追記が成功したときだけにします。 途中で失敗したスレッドはラベルが無いまま残り、次の回にもう一度処理されます。
APIキーはスクリプトに書かず、スクリプトのプロパティに置き、 PropertiesService.getScriptProperties() で読みます。編集権限を持つ人は、専用アカウントの管理者に絞ります。
AIへ渡す前に整形する
- 差出人で顧問先を決める … 差出人のアドレスを台帳で引き、無ければドメインで引きます。どちらにも無ければ「顧問先不明」です
- 事務所の自分のメールを除く … スレッドの中の事務所側の返信は、依頼の取り出しには使いません。ただし「承知しました、25日までに」と返した文は、期限を確かめる手がかりとして別に渡します
- 引用部分を落とす … 行頭の
>や「〜様のメッセージ」以下の引用を落とします。落とさないと、前のメールの依頼を新しい依頼として拾います - 署名とあいさつを落とす … 署名の区切り線以下と、「いつもお世話になっております」のような定型の文を落とします
- 長さを確かめる … 長すぎる本文は決めた長さで切り、「途中で切った」印を付けます
3番目を軽く見ないでください。 顧問先は返信のたびに前のメールを全文引用して送ってきます。引用を残したままにすると、1か月前に済んだ依頼が毎回「新しい依頼」として載ります。
AIに処理させる
させるのは、本文から依頼を1件ずつ取り出し、決めた項目を埋めることだけです。
| 取り出す項目 | 中身 | 判断できないときの扱い |
|---|---|---|
| 依頼の種類 | submit(書類の作成・提出)/procedure(手続き)/answer(質問への回答)/send_material(資料の送付) | other |
| 依頼の中身 | 何をしてほしいのかを1文で | 原文の該当箇所をそのまま |
| やるのは誰か | office(事務所)/client(顧問先) | unknown |
| 期限の原文 | 本文に書かれた期限の言い方をそのまま | 書かれていなければ空 |
| 期限の書かれ方 | explicit(日付)/relative(月末・来週中など)/none | none |
| 根拠 | 依頼と期限の根拠にした本文の文 | 必ず埋める |
| 既存のタスクとの関係 | 新規か、既存の行の再依頼か | new |
2行目の「やるのは誰か」が、第1章で書いた中心です。 顧問先が「月末までに送ります」と書いたものは client で、担当者の朝の一覧には入れず、「届くはずのもの」の一覧に載せます。 期限を過ぎても届かなければ、そのとき担当者に知らせます。
期限の日付化はAIにさせません。 AIには期限の原文と書かれ方だけを返させ、relative のものはスクリプトの側で受信日と休業日表から日付に直します。「月末」の解釈を毎回AIに任せると、受信日をどう扱ったかが記録に残りません。 規則で直せない言い方(「例の件の期限までに」)は、日付を空欄のまま担当者に回します。
| させないこと | 理由 |
|---|---|
| 法定の期限を補う | 期限がいつかは事務所の専門家が判断する |
| 期限の言い方を日付に直す | 規則で直し、どう直したかを記録に残す |
| 顧問先を推測する | 台帳で引けないものは人へ回す |
| 依頼を受けるかどうかの判断 | 顧問契約の範囲かどうかは担当者が決める |
| 返信の文面を作る | この構成の役目ではない |
1行目がいちばん起きやすい失敗です。 「年末調整の資料、送りました」というメールから、AIは年末調整の期限を知識で補って載せようとします。書かれていない期限が一覧に並ぶと、担当者はそれを顧問先の希望と取り違えます。
指示内容を固定する
あなたは税理士事務所で、顧問先から届いたメールを読み、
事務所や顧問先が「いつまでに何をするか」を取り出す係です。
下のメール本文だけを根拠にしてください。推測で埋めないでください。
【取り出すもの】
メールに含まれる依頼・約束を1件ずつ、requests の配列に入れてください。
依頼・約束が1件も無いメールなら、requests は空の配列にしてください。
【各項目の決め方】
- kind: submit / procedure / answer / send_material / other
- summary: 何をするのかを1文で。本文の言葉を使ってください
- actor: office(事務所に頼んでいる)/ client(顧問先が自分でやると言っている)
/ unknown(どちらか本文から決められない)
- due_text: 期限の言い方を本文からそのまま写す。書かれていなければ空文字
- due_kind: explicit(日付が書かれている)/ relative(月末・来週中など)
/ none(期限が書かれていない)
- evidence: 依頼と期限の根拠にした文を、本文からそのまま写す
- relation: new / repeat_of:{既存タスクID}
【厳守事項】
- 期限が書かれていなければ due_text は空、due_kind は none にしてください。
手続きの種類から、法律や慣習上の期限を補わないでください。
- due_text を日付に直さないでください。「月末」は「月末」のまま写してください。
- 「よろしくお願いします」だけで何を頼んでいるか分からないものは、
kind を other、summary に原文を写してください。
- 資料を送ったという報告だけで、事務所への依頼が無いものは取り出さないでください。
- 引用されている過去のメールの内容は、依頼として取り出さないでください。
- 既存タスクと同じ依頼なら relation を repeat_of にし、新しく作らないでください。
- 顧問先名や担当者名を本文から推測して書かないでください。
【顧問先】{client_name}(台帳で照合済み)
【受信日時】{received_at}
【添付ファイルの名前】{attachment_names}
【この顧問先の未完了のタスク】{open_tasks}
【本文】{body}
「手続きの種類から期限を補わない」を明記しないと、AIは親切に補います。 役員報酬の変更、従業員の入社といった言葉には、AIが知っている期限が結び付いています。禁じるのは、本文の外から期限を持ち込むことそのものです。
「日付に直さない」も同じ考え方です。 直すこと自体は難しくありませんが、受信日が金曜の夕方だった「来週中」をどう読むかは、事務所で決める規則です。AIの中で黙って決めさせず、スクリプトの規則に置きます。
出力形式を固定する
Gemini API の構造化出力で、次の形のJSONを受け取ります。 構造化出力では、応答の形式を application/json とし、JSON Schema を渡します。返るJSONは構文として正しいものになりますが、値はアプリケーション側で確かめるよう公式も書いています。
{
"message_id": "",
"client_code": "",
"requests": [
{
"kind": "submit | procedure | answer | send_material | other",
"summary": "",
"actor": "office | client | unknown",
"due_text": "",
"due_kind": "explicit | relative | none",
"evidence": "",
"relation": "new | repeat_of:T-0000"
}
]
}
JSONで受け取る1つ目の理由は、タスク表の列にそのまま入れられることです。 自由文で返させると、「期限:来週中(たぶん金曜)」のような書き方が混ざり、列に分けられません。
2つ目は、actor と due_kind で振り分けを規則にできることです。
| 条件 | 振り分け先 |
|---|---|
actor が office | 担当者のタスク |
actor が client | 「届くはずのもの」の一覧 |
actor が unknown | 担当者のタスク(「要確認」の印) |
due_kind が relative | スクリプトで日付化。直せなければ空欄 |
due_kind が none | 期限空欄のまま「期限の記載なし」 |
3つ目は、evidence で確認が速くなることです。 担当者はメールを開き直さなくても、根拠の文を読めば取り出しが正しいかを判断できます。
スクリプトの側では、受け取ったJSONに対して次を確かめてから書き込みます。evidence が本文に実際に含まれているか(含まれていなければAIが作った文なので「要確認」にする)、due_text が本文に含まれているか、relation の既存タスクIDがタスク表に実在するか、です。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Gmail | GmailApp | 未処理のスレッドを読み、処理済みのラベルを付ける |
| 顧問先台帳・休業日表 | SpreadsheetApp で読み取り | 顧問先と担当者を引き、期限を日付に直す |
| Gemini API | UrlFetchApp.fetch() で POST | 依頼の取り出し。JSONで受け取る |
| タスク表 | SpreadsheetApp で追記 | 1依頼1行。状態は「未確認」 |
| 担当者への通知 | Gmail からの送信 | 朝の一覧を担当者ごとに1通 |
生成AIの呼び出しは UrlFetchApp.fetch() で行い、muteHttpExceptions を true にします。 これを付けると、応答がエラーのときに例外を投げずに応答そのものを返します。応答コードを見て、待って再試行するか、そのスレッドを飛ばすかを決められます。
タスク表の列は、タスクID、顧問先コード、顧問先名、担当者、種類、依頼の中身、やるのは誰か、期限の原文、期限(日付)、期限の直し方、根拠、元メールのリンク、状態、再依頼の回数、登録日時、確認者、確認日時です。「期限の直し方」には「月末→受信月の末日」のように、規則のどれを使ったかを書きます。
タスク表への書き込みは追記だけです。 既存の行の期限や状態をスクリプトが書き換えることはしません。再依頼のときも、既存の行の「再依頼の回数」を1増やすだけにします。期限を変えるのは担当者です。
人が確認する
- 「未確認」の行を毎日1回見る … 担当者は自分の行だけを見ます。
evidenceを読み、依頼の中身と期限が本文と合っているかを確かめます - 期限が空欄の行を埋める … 本文に期限が書かれていなくても、法定の期限や顧問先の事情から期限がある依頼は、担当者が自分の判断で期限を入れます
- 「やるのは誰か」が
unknownの行を決める … 事務所がやるのか、顧問先に頼み返すのかを決めます - 取り出しが誤っていたら直し、「AIの誤り」に印を付ける … 依頼でないものを拾った、期限を取り違えた、などを残します
2番目を省かないでください。 この構成は書かれていない期限を補いません。その分、空欄の行に期限を入れるのは担当者の仕事として残ります。 空欄を放置すると、朝の一覧に一度も載らないまま期日が過ぎます。そのため、期限が空欄の行は「未確認」と同じく、24時間たてば朝の一覧に出します。
目標は、1,200件をならして1件1分です。 依頼を含まないメールはタスク表に何も載らず、確認の手間がかかりません。依頼が載ったものだけ、根拠の文を読んで確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 差出人が台帳に無い | AIに回さず「顧問先不明」として総務へ。台帳への追加は人が行う |
| 1回の実行が6分に近づく | 30スレッドで打ち切り、残りは次の回に回す |
| 生成AIがエラーを返す | ラベルを付けずに残し、次の回に再処理。3回続けて失敗したら総務へ知らせる |
| JSONの値が決めた候補の外 | そのメールを「要確認」として担当者へ。書き込まない |
evidence が本文に無い | AIが作った文として「要確認」にする |
| 顧問先の約束の期限を過ぎた | 「届くはずのもの」から担当者の朝の一覧へ上げる |
| 同じ依頼が二度届く | 既存の行の再依頼の回数を増やし、朝の一覧で目立たせる |
| 担当者が休み | 台帳の副担当にも同じ一覧を送る |
| トリガーを作ったアカウントが使えない | 専用アカウントで作っておく。 個人のアカウントで作らない |
上から3行目までは、AIの判断ではなく仕組みの問題です。 どれもラベルが付かないまま次の回に処理されるので、メールが失われることはありません。ラベルを付けるのは書き込みが成功したときだけ、という決まりが効いています。
記録を残す
- 処理したメールのID、スレッドID、受信日時、顧問先コード
- 生成AIへ渡した本文(前処理の後)と、返ってきたJSONの全文
- スクリプトが確かめた結果(
evidenceが本文にあったか、値が候補の内かなど) - 期限の日付化に使った規則と、そのときの休業日表の版
- 担当者が取り出しを直した記録 … どの項目を、何から何に変えたか
- 朝の一覧を送った日時と、送った件数
4つ目で休業日表の版を残すのは、表が後から変わるためです。 臨時の休業日を足すと、過去の「来週中」の日付が変わります。当時どの表で直したかが残っていないと、期日がずれた理由を追えません。
5つ目は、プロンプトを直す材料になります。 「AIの誤り」の印が付いた行を月に1回集めると、引用を拾っている、顧問先の約束を事務所の依頼と取り違えている、のように誤りの型が見えます。
04実装レベルの3段階
最小構成では件数がさばけません。 1通ずつ貼り付けるので、月1,200件には使えません。確かめるための段階です。 半自動化が、本記事の想定です。 タスク表への書き写しと毎朝の見返しが自動になり、担当者に残るのは拾われた行の確認です。1件3分が1分になるのは、この段階です。 本格構成で増えるのは、時間の削減より抜けの防止です。 顧問先の約束の追跡や担当替えの引き継ぎ一覧は、月の工数にはあまり出ませんが、事務所の信用に直結します。 半自動化を3か月回してから進んでください。
05工数削減シミュレーション
導入後 1,200件 × 1分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 顧問先からの依頼の多くがメールで届き、期限の管理が担当者ごとのメモや記憶に頼っている税理士・社会保険労務士・司法書士などの事務所。Google Workspace を使っており、顧問先からのメールが共通の受付アドレスに集まる、または集められる場合。担当替えや休みのときに、依頼の抜けが起きた経験がある場合。
- 依頼の大半が電話や来所で、メールで届く依頼が少ない事務所。顧問先からの依頼をすでに専用の案件管理システムやポータルで受け付けており、期限の項目が入力の時点で埋まる場合。顧問先の情報を外部の生成AIのAPIへ渡すことが、事務所の規程や顧問先との約束で認められていない場合。なお、法定の期限がいつかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月、顧問先から届いたメールから30通を選ぶ(うち数通は、依頼を見落としかけたと分かっているものを入れる)
- その30通について、担当者が実際に拾った依頼と期限を書き出しておく
- 1通ずつ本文を手元のAIサービスの画面に貼り付ける
- 「このメールに含まれる依頼と約束を1件ずつ取り出し、何をするか・事務所と顧問先のどちらがやるか・期限の原文・根拠の文を表にしてください。書かれていない期限を補わないでください。引用部分は対象外です」と指示する
- 出てきた表を、2番の書き出しと突き合わせる
30通は必ずやってください。 スクリプトを書く前に、「本文から依頼を正しく拾えるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者が拾った依頼がそろって出た | スクリプトとタスク表の連携に進む |
| 書かれていない期限を補った | 指示の書き方で直る。構成は有効 |
| 引用部分の古い依頼を拾った | 前処理で引用を落とす。 AIの問題ではない |
3行目は珍しくありません。 本番では前処理で引用を落とすので、試すときも引用を消してから貼ると本番に近くなります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 引用部分の古い依頼を毎回拾う | 前処理で引用を落とす。 試すときも引用を消して貼る |
| 書かれていない法定の期限を補う | 指示で明確に禁じ、due_text が本文にあるかをスクリプトで確かめる |
| 顧問先の約束が事務所のタスクに混ざる | actor を必須の項目にし、client は別の一覧に分ける |
| 「月末」の解釈が担当者ごとに違う | 日付化の規則をスクリプトに置き、直し方を列に残す |
| 知らないアドレスから届いて顧問先が決まらない | 推測で当てない。 総務へ回して台帳に足す |
| 1回の実行が6分を超えて止まる | 1回30スレッドで打ち切り、ラベルで続きを拾う |
| 処理済みのラベルが付かず同じメールを何度も読む | newer_than:2d で期間を絞り、書き込み成功時だけラベルを付ける |
| トリガーを作った人が退職して止まる | 専用のアカウントで作る |
| 個人アドレスに届いた依頼が漏れる | 共通アドレスへの転送を事務所の決まりにする |
上の2行が、この構成の失敗のほとんどです。 どちらも「本文に書かれていないものを拾う」という同じ型です。引用は前処理で、補われた期限は指示と照合で止めます。
最後の行の転送の漏れは、仕組みでは防げません。 共通アドレスに届かないメールは、この構成からは見えません。導入の前に、顧問先への案内文で送り先を共通アドレスに寄せておくのが確実です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧問先の名称、経理担当者の氏名とアドレス、そしてメール本文に書かれる売上・給与・役員報酬・従業員の入退社・借入といった顧問先の内部の情報です。
- 生成AIのAPIは有料の利用区分で使う … Gemini API の規約では、無料の区分では送った内容と応答がサービスの改善に使われ、人が読むことがあるとされています。有料の区分では、プロンプトと応答を製品の改善に使わず、禁止事項の検知のために限られた期間記録するとされています。顧問先の情報を送るなら、有料の区分が前提です
- 渡す範囲を本文と添付の名前に限る … 添付ファイルの中身は渡しません。前処理で署名を落とすので、顧問先の担当者の電話番号なども渡りません
- 顧問先台帳そのものを渡さない … 照合はスクリプトの中で行い、AIには照合済みの顧問先名だけを渡します
- 期限の判断を代替させない … この構成が出すのは、本文に書かれた依頼と期限の写しです。法定の期限がいつか、その依頼を受けるかは、事務所の担当者が判断します
- スクリプトとタスク表の権限を絞る … タスク表には全顧問先の依頼が1枚に並びます。閲覧できるのは事務所の職員だけにし、外部と共有しないでください。 スクリプトのプロパティにあるAPIキーも、編集権限のある人なら読めます
- 顧問先との約束を確かめる … 顧問先の情報を外部のサービスで処理してよいかを、顧問契約と事務所の規程で確かめます
誤りが起きた場合のリスクは、依頼を拾い損ねることと、期限を取り違えることの2つです。 後者は、担当者が「未確認」の行を確かめる工程で止めます。
10まず何から始めるか
1週目:顧問先台帳をそろえる
顧問先台帳に、差出人のアドレス(複数可)、ドメイン、主担当、副担当の列を足します。180社すべてを一度に埋める必要はありません。メールの多い上位50社から埋めます。 残りは「顧問先不明」に回ってきたときに足していきます。
2週目:30通で試す
先月のメールから30通を選び、手元のAIサービスに貼り付けて依頼を取り出させます。担当者が拾った依頼と突き合わせ、書かれていない期限を補っていないか、顧問先の約束を事務所の依頼と取り違えていないかを最優先で見ます。
3週目:日付化の規則とタスク表の列を決める
「月末」「来週中」「今週中」「〇日まで」をどう日付に直すかを、事務所で決めます。受信日が金曜の夕方だった場合や、休業日に当たった場合の扱いまで決めます。 あわせてタスク表の列を決め、休業日表を作ります。
4週目:メールからタスク表までをつなぐ
専用のアカウントで Google Apps Script を作り、毎時のトリガーでメールを読み、タスク表に追記するところまで作ります。この時点では朝の一覧を送らず、担当者は自分の手帳と並べてタスク表を見ます。
2か月目: 朝の一覧を送り始め、未確認の行の件数と「AIの誤り」の印を毎週数えます。3か月目以降: 顧問先の約束の追跡と、担当替えのときの引き継ぎ一覧を足します。担当者が手帳ではなくタスク表を見て1日を始めるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
GmailApp に search(query, start, max)、getMessagesForThread()、createLabel()、getUserLabelByName() があること | Google for Developers: Class GmailApp | 2026-10-06 |
GmailMessage に getPlainBody()(HTMLの書式を除いた本文)、getFrom()、getDate()、getSubject()、getId()、getTo()、getCc()、getAttachments() があること | Google for Developers: Class GmailMessage | 2026-10-06 |
| 時間主導型トリガーが毎分から月1回まで指定でき、9時のトリガーなら9時から10時の間で実行されること。インストール型トリガーが作成者のアカウントで動くこと | Google for Developers: Installable Triggers | 2026-10-06 |
| Google Workspace のアカウントでメールの送信先が1日1,500件、URL Fetch が1日10万回、トリガーの合計実行時間が1日6時間、1回の実行が6分であること | Google for Developers: Quotas for Google Services | 2026-10-06 |
| スクリプトのプロパティがスクリプトの利用者全員から使われるアプリ全体の設定の置き場であること | Google for Developers: Properties Service | 2026-10-06 |
UrlFetchApp.fetch() の method・contentType・payload・headers の指定と、muteHttpExceptions を true にすると失敗の応答でも例外を投げずに応答を返すこと | Google for Developers: Class UrlFetchApp | 2026-10-06 |
Gemini API の構造化出力で application/json と JSON Schema を指定できること。出力は構文として正しいJSONだが、値はアプリケーションで確かめるよう書かれていること | Google AI for Developers: Structured outputs | 2026-10-06 |
| 無料の区分では送った内容がサービスの改善に使われ人が読むことがあり、有料の区分では改善に使わず禁止事項の検知のために限られた期間記録されること | Google AI for Developers: Gemini API Additional Terms of Service | 2026-10-06 |
法定の期限がいつか、どの依頼を受けるかは、事務所の担当者が判断してください。 本記事は公式の資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0478)についてのご相談はこちらから。
