印刷会社が校正刷りの発送の記録から、戻りの期限が近い客への催促のメールを Apps Script と Gemini で下書きし、印刷の枠に間に合う戻りを営業日で追う
校正刷りとPDFの校正の発送の記録から、戻りの期限が近い案件と過ぎた案件を毎朝拾い、客への催促のメールを Apps Script と Gemini が下書きします。営業事務は下書きを読んで直し、担当の営業に確かめてから送ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Zapier
- 対象業界
- その他/広告/製造
- 対象部門
- 営業
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 営業フォローが追いつかない/書類作成に時間がかかる/期限・対応漏れが起きる
- AIで行う処理
- 生成
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 営業事務が校正を出したときに、発送の記録に案件番号・客・校正の種類・初校/再校・発送日・発送の方法を入れる
- 担当の営業が印刷の予定表から戻りの期限を出し、発送の記録に書き込む
- 毎朝、営業事務が発送の記録を戻りの期限で並べ替え、期限が翌営業日までで戻りの欄が空の案件を拾う
- 客から返信が来ていないかを Gmail で探し、宅配便の戻りが届いていないかを受付に聞く
- 担当の営業に「催促してよいか」を聞き、前回の催促のメールを写して、案件名・校正の種類・期限を書き換えて送る
- 期限を過ぎた案件は営業に回し、営業が電話をかけて印刷の枠をどうするかを製造の担当と相談する
- 人営業事務が校正を出したときに、発送の記録に案件番号・客・校正の種類・初校/再校・発送日・発送の方法・担当の営業を入れる。戻ったら戻りの欄に日付を入れる
- 自動毎朝8時台に Apps Script が発送の記録と印刷の予定表を読み、案件ごとに戻りの期限を営業日で計算する
- 自動戻りの欄が空で、期限が翌営業日・当日・過ぎた案件を拾い、段階を付ける
- 自動案件ごとに Gmail で、発送の後の客からの返信を探す。返信があれば下書きを作らず「返信あり」にする
- 自動校正の種類・段階・客の区分・初校/再校を事実の束にし、案件名・期限・担当を記号に置き換えて Gemini API に渡す
- 自動Gemini が記号を残した件名と本文を JSON で返す。Apps Script が記号を値に置き換えて検査し、Gmail の下書きを作る
- 自動確認の一覧に、案件・段階・期限・返信の有無・検査の結果を1行ずつ書き、担当の営業ごとに並べる
- 人営業事務が「返信あり」を確かめて戻りの欄を埋め、営業が担当分の下書きに目を通して、営業事務が送る。超過の案件は営業が電話も入れる
各工程の詳しい説明を読む
- 営業事務が校正を出したときに、発送の記録に案件番号・客・校正の種類・初校/再校・発送日・発送の方法を入れる
- 担当の営業が印刷の予定表から戻りの期限を出し、発送の記録に書き込む
- 毎朝、営業事務が発送の記録を戻りの期限で並べ替え、期限が翌営業日までで戻りの欄が空の案件を拾う
- 客から返信が来ていないかを Gmail で探し、宅配便の戻りが届いていないかを受付に聞く
- 担当の営業に「催促してよいか」を聞き、前回の催促のメールを写して、案件名・校正の種類・期限を書き換えて送る
- 期限を過ぎた案件は営業に回し、営業が電話をかけて印刷の枠をどうするかを製造の担当と相談する
(a)期限の計算が人によって違う。 2番目で戻りの期限を出すのは担当の営業で、会社の休日や、色校正の後の修正に何日みるかの数え方が人ごとに違います。 連休の前の案件では、休日を数え忘れた期限が書かれ、実際には間に合わない日まで催促しないことがあります。
(b)戻ったのに催促してしまう。 4番目で返信を探すのは、件名と客の名前を頼りにした手作業です。客が別の件名で返信していたり、営業個人のアドレスに返していたりすると見つかりません。 戻した客に催促が届くと、「もう送りましたが」という返事と、営業へのお詫びの電話が増えます。
(c)催促の言い方がばらつく。 期限の前日のやわらかい確認と、期限を過ぎた後の印刷の予定に関わる連絡では、書くべき中身が違います。 前回のメールを写すと、前日の案件に超過の書き方が残ったり、その逆が起きたりします。
(d)朝の30分が全部これで終わる。 3番目から5番目は毎朝の作業で、1日に15件前後を4人で回します。 営業が外出していると5番目の確認が取れず、催促が昼過ぎになります。
- 【人】 営業事務が校正を出したときに、発送の記録に案件番号・客・校正の種類・初校/再校・発送日・発送の方法・担当の営業を入れる。戻ったら戻りの欄に日付を入れる
- 【自動】 毎朝8時台に Apps Script が発送の記録と印刷の予定表を読み、案件ごとに戻りの期限を営業日で計算する
- 【自動】 戻りの欄が空で、期限が翌営業日・当日・過ぎた案件を拾い、段階を付ける
- 【自動】 案件ごとに Gmail で、発送の後の客からの返信を探す。返信があれば下書きを作らず「返信あり」にする
- 【自動】 校正の種類・段階・客の区分・初校/再校を事実の束にし、案件名・期限・担当を記号に置き換えて Gemini API に渡す
- 【自動】 Gemini が記号を残した件名と本文を JSON で返す。Apps Script が記号を値に置き換えて検査し、Gmail の下書きを作る
- 【自動】 確認の一覧に、案件・段階・期限・返信の有無・検査の結果を1行ずつ書き、担当の営業ごとに並べる
- 【人】 営業事務が「返信あり」を確かめて戻りの欄を埋め、営業が担当分の下書きに目を通して、営業事務が送る。超過の案件は営業が電話も入れる
2番目の計算が、この設計の土台です。 期限を営業日で数える決まりは、工程ごとの日数の表と会社の休日の表に書き出します。一度表にしてしまえば、連休の前でも同じ数え方になります。
8番目で営業が見るのは、担当分の一覧です。 席にいない営業にも、確認の一覧を見れば今日どの客に何の段階の催促が出るかが分かります。超過の案件だけは、印刷の枠の相談があるので、送る前に営業が必ず読みます。
02今回想定するシステム構成
校正の発送の記録(案件・客・校正の種類・初校/再校・発送日・方法・担当・戻り) + 印刷の予定表(案件・印刷の予定日) + 工程の日数の表 + 会社の休日の表 + 催促の記録(Google スプレッドシート) │ ▼【トリガー】毎朝8時台(時間主導型) Google Apps Script ├──▶ 戻りの期限を営業日で計算し、段階を付ける ├──▶ Gmail で発送の後の客からの返信を探す ├──▶ 案件名・期限・担当を記号に置き換える ▼ Gemini API(Interactions API、構造化出力、store=false) │ 記号入りの件名と本文を JSON で返す ▼ Google Apps Script ── 記号を値に置き換え、日付と記号の残りを検査 ├──▶ Gmail の下書き(案件ごと) └──▶ 確認の一覧・催促の記録(スプレッドシート) ▼ 【人】返信ありを確かめ、営業が目を通し、営業事務が送る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Zapier |
| 生成AI | Gemini API(Interactions API、構造化出力) | Claude API、OpenAI API |
| 保管 | Google スプレッドシート(発送の記録、印刷の予定表、工程の日数、休日、催促の記録、確認の一覧) | - |
| メール | Gmail(営業事務の共用のアカウント。下書きを作るだけで、送るのは営業事務) | - |
新しく足すのは、Apps Script と、工程の日数・会社の休日・催促の記録・確認の一覧の4つのシートです。 発送の記録と印刷の予定表はこれまでどおり入れます。この構成はメールを送りません。 Gmail の下書きを作るところで止まります。
生成AIに Gemini API を選ぶのは、Google の中で完結させたいからです。 呼び出しは Interactions API で、公式の説明では既定で入出力が保存され、有料の段階で55日、無料の段階で1日保持されます。 会話を続ける使い方はしないので、store を false にして保存させません。 客は企業と団体で、この構成を使うのは社内の営業事務と営業だけです。
生成AIに渡すのは、記号に置き換えた事実だけです。 客の会社名、担当者の名前、案件名、印刷物の中身はAIに渡しません。AIに要るのは、校正の種類・段階・客の区分・初校か再校か・前回の催促の有無だけです。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを1つ置き、everyDays(1) と atHour(8) で毎朝動かします。 公式の説明では、nearMinute() を指定しないと分はランダムに決まります。8時台のどこかで動けばよく、営業事務が始業する9時には一覧と下書きがそろっています。
休日は動かしても何もしないで終えます。 トリガーの設定では会社の休日を指定しないので、Apps Script の最初で会社の休日の表を見て、休日なら読み込みをせずに終わります。 連休の明けの朝には、休み中に期限が来た案件がまとめて超過として拾われます。
トリガーは、営業事務の共用のアカウントで作ります。 下書きはトリガーを作ったアカウントの Gmail に入るので、営業個人のアカウントで作ると、催促がその営業の下書きに散らばります。 失敗したときの通知も共用のアカウントに届くようにし、受信箱を誰が見るかを決めておきます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 校正の発送の記録 | 案件番号、客のコード、客の区分(直取引/制作会社/団体)、宛先のメールアドレス、校正の種類(PDF/簡易校正/本機色校正)、初校/再校/念校、発送日、発送の方法、担当の営業、戻り日、メールのスレッドの ID | スプレッドシート |
| 印刷の予定表 | 案件番号、印刷機、印刷の予定日 | スプレッドシート |
| 工程の日数 | 校正の種類と初校/再校ごとに、戻りから印刷までに要る営業日の数(修正・面付け・刷版) | スプレッドシート(新しく作る) |
| 会社の休日 | 日付、休日の区分(会社の休日・工場の稼働日) | スプレッドシート(新しく作る) |
| 催促の記録 | 案件番号、校正の回、段階、下書きを作った日時、送った日時 | スプレッドシート(新しく作る) |
質を決めるのは、工程の日数の表です。 色校正の戻りの後は色の調整があるので修正に2営業日、PDFの文字の修正なら1営業日、というように、製造の担当が普段の段取りから決めた日数を入れます。 この表が無ければ、期限は担当の営業の数え方のままです。
メールのスレッドの ID を、発送の記録に持たせます。 校正のPDFを Gmail で送ったときに、営業事務がそのスレッドの ID を写しておく運用にします。返信を探すときに、件名ではなくスレッドで引けるようにするためです。 宅配便で校正刷りを送った案件は、送り状の控えの番号を入れます。
データの取得方法を決める
発送の記録、印刷の予定表、工程の日数、休日は、Apps Script のスプレッドシートのサービスで読むだけです。 客からの返信は Gmail から探します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 戻り日が空の校正 | 発送の記録 | 催促の候補 |
| 印刷の予定日 | 印刷の予定表(案件番号でつなぐ) | 戻りの期限の起点 |
| 工程の日数・休日 | 工程の日数・会社の休日 | 営業日での逆算 |
| 発送の後の客からの返信 | Gmail(スレッドの ID、または客のドメインと案件番号での検索) | 「返信あり」の判定 |
| これまでの催促 | 催促の記録 | 同じ段階で二度作らない |
戻りの期限は、次のように数えます。
| 計算するもの | 計算のしかた |
|---|---|
| 戻りの期限 | 印刷の予定日から、工程の日数の分だけ営業日をさかのぼった日 |
| 段階 | 今日が期限の前営業日なら before、期限の日なら due、期限を過ぎていれば overdue |
| 超過の営業日数 | 期限の翌営業日から今日までの営業日の数 |
| 印刷の予定に響く日 | 超過の営業日数が1以上なら、印刷の予定日に間に合わない恐れとして営業に回す |
返信の確かめ方は2段にします。 スレッドの ID があれば GmailApp.getThreadById() でそのスレッドを開き、発送の日時より後に客のアドレスからのメッセージがあるかを見ます。 スレッドの ID が無い案件は、GmailApp.search() で from: に客のドメイン、本文に案件番号、after: に発送日を入れて探します。公式の説明では、検索の結果が大きすぎると呼び出しが失敗するとされ、ページを分けて取る search(query, start, max) の形を使うよう書かれています。 1回に10件までに絞って取ります。
営業個人のアドレスに来た返信は、共用のアカウントからは見えません。 これは仕組みでは埋まらないので、営業には、客から校正の返信が来たら共用のアドレスに転送してもらう決まりにします。
AIへ渡す前に整形する
- 状態で絞る … 戻り日が入っている校正、案件が保留・取消の校正は外します
- 期限を計算する … 印刷の予定日が空の案件は、期限を計算できないので「予定日なし」にします
- 重複を外す … 催促の記録に、同じ案件・同じ校正の回・同じ段階の行があれば外します。段階が進んだときだけ、新しい催促を作ります
- 返信を見る … 上の2段の確かめ方で返信を探し、あれば「返信あり」にして下書きを作りません
- 同じ客をまとめる … 同じ客の同じ担当者に、同じ日に2件以上の催促があれば1通にまとめ、案件ごとに期限を並べます
- 日付を整える … 期限を
M月d日(曜日)の形にし、曜日は Apps Script が日付から計算して付けます - 記号に置き換える … 宛名を
{{宛名}}、案件名を{{案件名_1}}、校正の回を{{校正回_1}}、期限を{{戻り期限_1}}、担当の営業を{{担当営業}}のような番号付きの記号にします
4番目を前処理に置くのは、AIを呼ぶ前に止めるためです。 返信がある案件にAIで催促の文面を作っても、捨てるだけです。
AIに処理させる
させるのは、記号の入った事実の束から、催促のメールの件名と本文を作ることだけです。
| させること | 中身 |
|---|---|
| 件名を作る | 段階と案件名の記号が分かる件名。例「【校正のお戻しのお願い】{{案件名_1}}」 |
| 段階に合わせて書き分ける | before はやわらかい確認、due は本日が期限である旨、overdue は担当の営業から改めて連絡する旨 |
| 校正の種類に合わせて戻し方を書く | 戻し方の表にある文(PDFなら赤字を入れたPDFの返送、色校正なら校正刷りの返送)を入れる |
| 客の区分に合わせて書き出す | 直取引の企業の担当者/制作会社のディレクター/団体の事務局で敬語の向きを変える |
| 気になる点を挙げる | 事実の束で食い違って見える点(例:念校なのに前回の催促が無い) |
AIに書かせないことのほうが大事です。
| させないこと | 理由 |
|---|---|
| 日付・曜日を数字で書く | 計算は Apps Script。数字の日付が本文にあれば検査で止める |
| 遅れたときの新しい納期や印刷の日を書く | 印刷の枠を組み直すかは営業と製造が決める |
| 追加の費用に触れる | 費用の扱いは営業が客と話して決める |
| 客を責める言い方をする | 校正の遅れは客の社内の事情によることが多い |
| 校正の中身(直すべき箇所)に触れる | AIは校正刷りを見ていない |
2行目がいちばん起きやすい失敗です。 AIは親切に「お戻しが遅れた場合、納期が2営業日ほど後ろにずれる見込みです」と書き足します。どれだけずれるかは、ほかの案件の枠と印刷機の空きで決まり、営業と製造が相談してはじめて言えることです。 書いてよいのは、「担当の営業から改めてご連絡します」までです。
指示内容を固定する
system_instruction に次の指示を入れ、input に事実の束を渡します。
あなたは印刷会社の営業事務として、校正をお送りしたお客様に、お戻しをお願いするメールの下書きを書きます。
渡す「事実の束」だけを使って書いてください。
【書き方】
- 宛名は {{宛名}} と書き、customer_type に合わせて敬語の向きを決めてください。
direct …… 直取引の企業のご担当者
agency …… 制作会社のディレクター。業界の言葉(初校・再校・念校)をそのまま使ってよい
association …… 団体の事務局。業界の言葉には短い言い換えを添える
- stage に合わせて本文を書いてください。
before …… お戻しの期限が近いことの確認。「行き違いでしたらご容赦ください」を添える
due …… 本日がお戻しの期限であることのお知らせ
overdue …… 期限を過ぎていることのお知らせと、担当の {{担当営業}} から改めてご連絡する旨
- 日付・曜日は、事実の束の記号({{戻り期限_1}} など)をそのまま置いてください。
数字で日付を書かないでください。曜日も書かないでください。
- 案件名・校正の回も記号のまま置いてください。
- items が複数あるときは、番号の順に1件ずつ並べてください。
- return_method_texts にある文は、意味を変えずに入れてください。
【書かないこと】
- 遅れたときの新しい納期、印刷の日、作業の日数
- 追加の費用、特急の対応
- お客様を責める言い方(「再三」「至急」など)
- 校正の中身や、直す箇所についての言及
【notes】
事実の束の中で食い違って見えるもの、文面を書くのに足りないものがあれば、
notes に短く書いてください。無ければ空の配列にしてください。
「新しい納期を書かない」を明記しないと、overdue の文面にほぼ必ず納期の見込みが入ります。 客にとって最も知りたいことだからこそ、AIは先回りして書きます。営業と製造が決めていない日付が客の手元に残ると、それが約束として扱われます。
出力形式を固定する
Gemini API の Interactions の構造化出力で、次の形の JSON を受け取ります。 公式の説明では、POST /v1beta/interactions の本文の response_format に、mime_type を application/json とし、schema を入れて渡します。
{
"subject": "【校正のお戻しのお願い】{{案件名_1}}",
"body": "{{宛名}}\n\nいつもお世話になっております。\n{{案件名_1}}の{{校正回_1}}につきまして、お戻しの期限が{{戻り期限_1}}となっております。\n…",
"stage": "before",
"placeholders_used": ["{{宛名}}", "{{案件名_1}}", "{{校正回_1}}", "{{戻り期限_1}}"],
"notes": []
}
stage は enum で before・due・overdue に絞り、事実の束の段階と同じかを検査します。 構造化出力を使う理由は、件名と本文と使った記号を別の項目で受け取り、placeholders_used と事実の束の記号を突き合わせられることです。
本文の長さの制約は、スキーマに書いても効きません。 公式の説明では、minLength・maxLength などはエラーにならずに外され、クライアントの側で確かめるよう書かれています。 本文が600字を超えたら「要確認」にする検査を Apps Script に置きます。また、出力は JSON として正しい形でも、値が意味の上で正しいかはアプリの側で確かめるよう書かれています。
Apps Script の検査は次のとおりです。
| 検査 | 引っかかったとき |
|---|---|
| 事実の束の記号が本文にすべてあるか | 抜けた記号を確認の一覧に出し、「要確認」 |
| 事実の束に無い記号が本文にあるか | 「要確認」(案件の入れ違いの恐れ) |
| 置き換えた後の本文に、事実の束に無い日付が出ていないか | 赤の「要確認」 |
stage が事実の束と同じか | 「要確認」 |
| 「再三」「至急」などの避ける言葉、「納期」「費用」の語が本文にあるか | 「要確認」 |
| 本文が600字を超えるか | 「要確認」 |
5行目で「納期」の語を拾うのは、AIが新しい納期を書いたときの網です。 「納期に間に合わせるため」のような、書いてよい使い方でも止まりますが、止まった下書きを営業事務が読めば済みます。 拾い漏らすより、止まりすぎるほうを選びます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 発送の記録・印刷の予定表・工程の日数・休日 | スプレッドシートのサービスで読む | 催促の候補と期限の計算 |
| Gmail(返信の確かめ) | GmailApp.getThreadById()・GmailApp.search(query, start, max) | 発送の後の客からの返信の有無 |
| Gemini API | UrlFetchApp で Interactions API を呼ぶ(store は false) | 件名と本文の JSON |
| Gmail(下書き) | GmailApp.createDraft() | 案件ごとの下書き |
| 確認の一覧・催促の記録 | スプレッドシートのサービスで書く | 段階・期限・返信の有無・検査の結果 |
下書きは GmailApp.createDraft(recipient, subject, body, options) で作ります。 オプションの cc に担当の営業のアドレスを入れ、客が返信したときに営業にも届くようにします。 name には会社名と「営業部」を入れます。
呼び出しの回数は月に300回前後です。 URL の取得の上限(個人のアカウントで1日20,000回、Workspace で1日100,000回)には届きません。気をつけるのは1回の実行が6分までという上限で、Gmail の検索は1件ずつ時間がかかるので、連休の明けで候補が多い朝は、処理した案件に印を付けて続きを次の実行に回します。
人が確認する
- 「返信あり」を先に見る … 返信を開き、校正の戻りなら戻りの欄に日付を入れます。質問や修正の相談の返信なら、担当の営業に回します
- 「予定日なし」を見る … 印刷の予定表に予定日が入っていない案件です。製造の担当に予定日を入れてもらいます
overdueの下書きは、担当の営業が読む … 印刷の枠の相談が要るので、営業が電話を入れるかどうかを決めてから送ります- 赤の「要確認」を見る … 事実の束に無い日付が本文にある下書きです
- 送る … 営業事務が Gmail から送り、催促の記録に送った日時を入れます
1番目を省かないでください。 返信の確かめは機械の仕事ですが、返信の中身が戻りなのか、「明日戻します」という連絡なのかは、人が読まないと分かりません。 後者なら戻りの欄は埋めず、催促の記録に「戻る予定の連絡あり」と残します。
目標は、300件をならして1件2分です。 before の下書きは読んで送るだけで1分ほど、overdue は営業とのやり取りを含めて5分ほどです。時間を使うのは「返信あり」の中身を読むところです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 印刷の予定日が空 | 期限を計算できないので下書きを作らず「予定日なし」 |
| 発送の後に客からの返信がある | 下書きを作らず「返信あり」。中身を人が読む |
| 宛先のメールアドレスが空・形が正しくない | 下書きを作らず「宛先不明」。営業に確かめる |
| 宅配便の戻りの受付が記録されていない | 受付の宅配便の受け取りの記録と照らすまで、overdue は「受け取り確認」を付ける |
| Gemini API がエラーを返す | 1回だけやり直し、だめなら確認の一覧に「生成失敗」。催促の記録に書かない(翌朝また拾う) |
| 本文が600字を超える | 下書きは作り、「要確認」 |
| 案件が保留・取消になった | 催促を作らない。発送の記録の状態の列で外す |
| 1回の実行が6分を超えそう | 処理した案件に印を付けて終わり、続きは次の実行で |
4行目の宅配便の戻りは、Gmail では見えません。 校正刷りが受付に届いていても、営業事務の手元に渡るまで戻りの欄が埋まりません。overdue の催促を送る前に、受付の受け取りの記録を見ます。
記録を残す
- 実行の日時、拾った案件の数、作った下書きの数、作らなかった案件とその理由
- 案件ごとの戻りの期限と、計算に使った印刷の予定日・工程の日数の行
- 事実の束(記号に置き換えた後のもの)と、Gemini が返した JSON
- 検査の結果(記号の抜け・余り、日付の食い違い、避ける言葉、字数)
- 営業事務と営業が下書きを直したかどうかと、直した箇所の種類
- 送った日時と、送った後に戻った日(催促から戻りまでの日数)
最後の行が、工程の日数の表を直す材料になります。 before の催促を送った後、ほとんどの客が翌日に戻すなら、期限の前営業日の催促は効いています。 戻りが期限を過ぎがちな客の区分が分かれば、その区分だけ催促を1営業日早めます。
04実装レベルの3段階
本記事の想定は半自動化です。 催促を送るのは営業事務で、戻りの欄を埋めるのも営業事務です。期限の計算と、戻った案件を外す作業と、段階に合わせた文面が自動になれば、毎朝の30分の大半は消えます。 半自動化で、1件8分が2分になります。 差が大きいのは、営業への確認が一覧で済むようになり、前回のメールを写して書き換える作業が無くなるからです。 本格構成は、返信の中身を読むので一段難しくなります。 「明日戻します」と「この箇所を相談したい」を取り違えると、営業への連絡が抜けます。半自動化を半年回してから考えれば十分です。
05工数削減シミュレーション
導入後 300件 × 2分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- カタログ・パンフレット・チラシ・社内報などの商業印刷を受け、校正刷りやPDFの校正を月に数百件出している印刷会社。校正の発送の記録を Google スプレッドシートで持ち、客とのやり取りを Gmail でしている場合。戻りの遅れで印刷機の枠を組み直すことが月に何度もあり、営業や営業事務が期限の近い案件を毎朝表で探して、催促の電話やメールを1件ずつしている場合。
- 校正のやり取りを校正の Web サービスの中だけで済ませていて、発送と戻りの記録をスプレッドシートに書き出せない会社。校正が月に数十件で、営業が案件ごとに覚えていられる場合。名刺や伝票のように校正を省く小さな仕事が中心の場合。なお、戻りが遅れたときに印刷の枠をずらすか、納期を変えるか、追加の費用をいただくかの判断は、この構成の対象外です。
07最小構成で試す方法
- 先月の催促から、段階と校正の種類と客の区分が散らばるように20件を選ぶ
- それぞれについて、段階・校正の種類・客の区分・初校/再校を手で書き出す(案件名・期限・担当は記号にする)
- 手元の Gemini の画面に、第7章の指示と、記号に置き換えた事実を1件ずつ貼る
- 返ってきた文面に数字の日付や新しい納期が混ざっていないか、
overdueで客を責める言い方になっていないかを見る - 営業事務がこれまで送った同じ段階の催促と並べ、担当の営業に「直さずに送れるか」を聞く
20件で十分です。 確かめたいのは、「記号のまま返してくれるか」と「納期を書き足さないか」の2つです。
| 出てきた内容 | 判断 |
|---|---|
| 記号のまま返り、少し直せば送れる | 工程の日数と休日の表を作り、Apps Script で期限を計算する段階に進む |
| 日付を数字に書き直す | 指示の書き方で直る。「数字で書かない」を前に出す |
overdue で新しい納期を書き足す | 書かないことの一覧が足りない。営業が客に言える範囲を先に決める |
並行して、先月の期限を手で営業日に数え直してみてください。 担当の営業が書いていた期限と、工程の日数の表で数えた期限がどれだけ食い違うかが、この構成の効き目の目安になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 戻した客に催促が届く | AIを呼ぶ前に Gmail で返信を探し、あれば下書きを作らない |
| 営業個人のアドレスへの返信が見えない | 共用のアドレスへの転送を決まりにする |
| AIが新しい納期を書き足す | 書かないことを具体的に並べ、「納期」の語を検査で拾う |
| 連休の前に期限を数え違える | 会社の休日の表で営業日を数える |
| 検索の結果が大きすぎて失敗する | スレッドの ID で引き、検索は search(query, start, max) で絞る |
minLength などを書いても効かない | 外されるので、字数は Apps Script で確かめる |
| 入出力が55日保存される | store を false にする |
| 休日にトリガーが空振りする | 最初に休日の表を見て、休日なら何もしないで終える |
| 同じ段階の催促が二度できる | 催促の記録に案件・校正の回・段階で残す |
上の3行が、この構成の失敗のほとんどです。 どれも「客にとって何が正しい知らせか」を、どこで決めるかから起きます。戻ったかどうかは Gmail と受付の記録で、期限は表で、納期は営業と製造で決め、AIは段階に合わせて文面を整えるだけにしておけば、残りは運用の注意で足ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 客の会社名と担当者の名前、メールアドレス、案件名、印刷の予定日、そして催促のやり取りの中にある発表前の商品のカタログや、社外に出る前の会社案内の情報です。
- AIに案件の中身を渡さない … 案件名・客の名前・期限は記号にして渡し、校正のPDFや印刷物の中身はAIに渡しません。 発表前の商品名が案件名になっていることがあります
- 入出力を保存させない … Interactions API は既定で入出力を保存するので、
storeをfalseにします - 送るのは人 … 宛先を間違えれば、他の客の発表前の案件名を知らせることになります。下書きを読んで宛先を確かめてから送ります
- 納期と費用の話を AIに作らせない … 遅れたときの扱いは営業と製造が決め、営業が客に直接伝えます
- 鍵とアカウントを共用で持つ … API の鍵はスクリプトのプロパティに置き、トリガーは営業事務の共用のアカウントで作ります
- 利用規約を確かめる … Gemini API の利用規約とデータの扱いを導入の前に確かめ、製品を替えるときも同じように確かめてください
誤りが起きた場合のリスクは、戻した客に催促が届くことと、期限の誤りで催促が遅れて印刷の枠に間に合わなくなることの2つです。 前者は返信の確かめと転送の決まりで、後者は工程の日数と休日の表で防ぎます。
10まず何から始めるか
1週目:工程の日数と休日の表を作る
製造の担当と一緒に、校正の種類と初校/再校ごとに、戻りから印刷までに要る営業日の数を表にします。会社の休日の表も1年分入れます。
2週目:20件で試す
第8章のとおり、段階と校正の種類が散らばるように20件を選び、記号に置き換えた事実を手元の Gemini の画面に貼ります。数字の日付と新しい納期を書かないかを最優先で見ます。
3週目:発送の記録を整える
発送の記録に、客の区分・メールのスレッドの ID・担当の営業の列を足します。営業には、校正の返信を共用のアドレスに転送してもらう決まりを伝えます。
4週目:Apps Script で下書きまでをつなぐ
毎朝のトリガーを置き、期限の計算、返信の確かめ、Gemini の呼び出し、Gmail の下書きと確認の一覧を作るところまで作ります。最初の月は営業が全件の下書きに目を通し、直した箇所を記録します。
2か月目以降: 催促から戻りまでの日数を客の区分ごとに見て、催促の時期を調整します。営業事務が朝に発送の記録を並べ替えなくてよくなり、「この校正、もう戻っていますよ」と客に言われる場面がなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
atHour() と everyDays() で日ごとの時刻を指定できること。nearMinute() を指定しないと分がランダムになること | Google for Developers: ClockTriggerBuilder | 2026-10-29 |
| 1回の実行が6分まで、URL の取得が個人のアカウントで1日20,000回・Workspace で1日100,000回であること | Google for Developers: Quotas for Google Services | 2026-10-29 |
GmailApp.createDraft(recipient, subject, body, options) で下書きを作れ、cc・name などのオプションがあること。getThreadById() でスレッドを ID で取れること。search(query) は結果が大きすぎると失敗し、search(query, start, max) でページを分けて取るよう書かれていること。https://mail.google.com/ の権限が要ること | Google for Developers: Class GmailApp | 2026-10-29 |
構造化出力を POST /v1beta/interactions の response_format に mime_type: application/json と schema で指定すること。enum が使えること。minLength・maxLength などはエラーにならずに外され、クライアントで確かめるよう書かれていること。出力の値の意味の正しさはアプリで確かめるよう書かれていること | Google AI for Developers: Structured outputs | 2026-10-29 |
Interactions API が既定で入出力を保存し(store=true)、有料の段階で55日・無料の段階で1日保持すること。store=false で保存しないようにできること。system_instruction を渡せること | Google AI for Developers: Interactions API | 2026-10-29 |
戻りの期限の決め方と、遅れたときの納期・費用の扱いは、自社の工程と客との取り決めに合わせて決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2379)についてのご相談はこちらから。
