ウォーターサーバーの宅配会社がお客様から届く配送日の変更・休止・本数の変更をフォームで受け、Apps Script で配送の予定表を直して確認の連絡を作る
お客様からフォームで届く定期配送の変更の申し出を、配送日の変更・休止・本数の変更・解約などに分け、どの回の配送についての申し出かを特定します。締切とルートの決まりに照らして配送の予定表を仮に直し、確認の連絡を下書きします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Zapier
- 対象業界
- EC/小売/物流
- 対象部門
- カスタマーサポート/物流
- 対象業務
- データ入力・転記/分類・仕分け
- 主な課題
- 入力作業が多い/問い合わせが多い/確認ミスが多い
- AIで行う処理
- 分類
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 受付の担当が1日に数回、フォームの回答のシートを開く
- お客様の番号と電話番号の下4桁で、お客様の一覧と突き合わせて本人かを確かめる
- 選択の欄と自由記入を読み、何の申し出かを決める。1件に複数の申し出があれば分ける
- 配送の予定表でそのお客様の行を探し、どの回の申し出かを決める
- 締切に間に合うか、変える先の日がルートの曜日か、ルートの積み込みに余裕があるかを見る
- 予定表を直し、お客様に確認のメールを書いて送る
- 解約・判断に迷うものは、専任の担当や配送の責任者に回す
- 自動フォームに回答が届くたびに Apps Script が動く
- 自動お客様の番号と電話番号の下4桁で、お客様の一覧と突き合わせる。合わなければ「本人未確認」で止める
- 自動そのお客様の次の4回分の配送予定を、番号付きで並べる
- 自動自由記入と選択の欄と予定の一覧を OpenAI API に渡し、申し出ごとに種類と対象の回を JSON で受け取る
- 自動申し出ごとに、締切・ルートの曜日・積み込みの余裕を決まりで確かめる
- 自動決まりを満たすものは、予定表に「仮」の印を付けて直す。満たさないものと解約は直さずに担当へ回す
- 自動確認の連絡を Gmail の下書きにする
- 人受付の担当が、仮の変更と下書きを一覧で確かめ、確定して送る
- 人専任の担当が解約の申し出に折り返し、配送の責任者が積み込みの超過を判断する
各工程の詳しい説明を読む
- 受付の担当が1日に数回、フォームの回答のシートを開く
- お客様の番号と電話番号の下4桁で、お客様の一覧と突き合わせて本人かを確かめる
- 選択の欄と自由記入を読み、何の申し出かを決める。1件に複数の申し出があれば分ける
- 配送の予定表でそのお客様の行を探し、どの回の申し出かを決める
- 締切に間に合うか、変える先の日がルートの曜日か、ルートの積み込みに余裕があるかを見る
- 予定表を直し、お客様に確認のメールを書いて送る
- 解約・判断に迷うものは、専任の担当や配送の責任者に回す
(a)予定表への手入力が多い。 4番目と6番目は、6,000件の予定表から1人のお客様の行を探し、日付や本数を書き換える作業です。似た名前のお客様の行を直してしまう、休止にしたつもりで本数を0にし忘れる、という誤りが起きます。
(b)締切とルートの曜日を見落とす。 5番目は、急ぐほど省かれます。締切を過ぎた申し出を受けてしまい、当日にボトルが積まれたまま戻ってくる、ルートの無い曜日に変えてしまう、といったことが起きます。配送の担当は当日の朝に気づいて、ルートを組み直すことになります。
(c)1件に複数の申し出がある。 3番目で、自由記入の中の2つ目の申し出を読み落とすと、「休止」は直ったのに「その次は3本」が直っていない状態になります。お客様は両方伝えたつもりでいます。
(d)「変わっているか」の問い合わせが来る。 確認のメールが遅れると、お客様から電話で「申し込んだけれど変わっているか」と問い合わせが来ます。受付の担当は、そのたびに予定表を開いて答えます。 問い合わせに答えている間は、次のフォームの回答が処理されずに積み上がり、確認の連絡がさらに遅れます。
- 【自動】 フォームに回答が届くたびに Apps Script が動く
- 【自動】 お客様の番号と電話番号の下4桁で、お客様の一覧と突き合わせる。合わなければ「本人未確認」で止める
- 【自動】 そのお客様の次の4回分の配送予定を、番号付きで並べる
- 【自動】 自由記入と選択の欄と予定の一覧を OpenAI API に渡し、申し出ごとに種類と対象の回を JSON で受け取る
- 【自動】 申し出ごとに、締切・ルートの曜日・積み込みの余裕を決まりで確かめる
- 【自動】 決まりを満たすものは、予定表に「仮」の印を付けて直す。満たさないものと解約は直さずに担当へ回す
- 【自動】 確認の連絡を Gmail の下書きにする
- 【人】 受付の担当が、仮の変更と下書きを一覧で確かめ、確定して送る
- 【人】 専任の担当が解約の申し出に折り返し、配送の責任者が積み込みの超過を判断する
3番目と4番目の組み合わせが、この設計の要です。 AIに渡すのは、日付を計算するための暦ではなく、そのお客様の予定表の行そのものです。AIは「来月の2回目」がどの行かを選ぶだけで、選ばれた行の日付は予定表の値のまま使われます。
6番目で「仮」にするのは、受付の担当の確認を通すためです。 仮の変更は配送の担当にも見えますが、確定の印が付くまでは配車の計算に入れません。 確定は毎日の配車の締めの前に行います。
02今回想定するシステム構成
変更の申し出のフォーム(回答はスプレッドシート) │ ▼【トリガー】フォームの送信ごと Google Apps Script(スクリプトのロックで1件ずつ処理) ├──▶ お客様の番号と電話番号の下4桁で本人を確かめる ├──▶ そのお客様の次の4回分の配送予定を番号付きで並べる ▼ OpenAI API ── 申し出ごとに種類と対象の回を JSON で返す ▼ Google Apps Script ├──▶ 締切・ルートの曜日・積み込みの余裕を確かめる ├──▶ 満たすもの:予定表を「仮」で直す ├──▶ 満たさないもの・解約:直さずに担当へ ▼ Gmail の下書き(確認の連絡) ──▶【人】受付の担当が確かめて確定・送信
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Zapier |
| 生成AI | OpenAI API(Responses API、構造化出力) | Claude API、Gemini API |
| 保管 | Google スプレッドシート(お客様の一覧、配送の予定表、ルートの一覧、決まり、処理ログ) | - |
| 窓口 | Google フォーム(変更の申し出) | - |
| メール | Gmail(確認の連絡の下書き) | - |
新しく足すのは、Apps Script と処理ログのシート、予定表の「仮」「確定」の列だけです。 フォームの見た目は変えません。お客様から見た申し出のしかたは、これまでと同じです。 フォームの選択の欄を細かくしたり、自由記入を禁じたりはしません。書きやすい形のままにしておくほうが、申し出が電話に流れずに済みます。
OpenAI API を選んだのは、構造化出力で申し出の配列を受け取れるためです。 公式のページでは、Responses API の text.format に type: "json_schema" と strict: true を指定すると、渡したスキーマに沿った応答が返るとされています。1件のフォームに複数の申し出があっても、申し出ごとの要素を持つ配列で受け取れます。 Claude API の構造化出力でも同じ形で組めます。
決まりのシートに、確かめに要る値をすべて持たせます。 変更の締切(配送日の何日前の何時まで)、ルートごとの配送の曜日、ルートごとの1日の積み込みの上限、休止を続けられる回数、本数の上限と下限です。これらを AI に判断させることはしません。
03どうやって実装するのか
処理の起点を決める
フォームの回答が届くたびに、インストール型のトリガーで動かします。 公式のページでは、フォームの送信のトリガーには、フォームそのものに付けるものと、回答先のスプレッドシートに付けるものの2つがあるとされています。この構成では回答先のスプレッドシートに付けます。 回答の行に処理済みの印を付け、予定表と同じファイルの中で扱えるからです。
同じ時刻に回答が重なっても、予定表は1件ずつ直します。 夕方にはフォームの回答が続けて届き、2つの処理が同じルートの同じ日の積み込みの余裕を同時に見ると、どちらも「余裕あり」と判断して上限を超えます。 Apps Script のロックのサービスには、スクリプト単位のロックがあり、公式のページでは、ロックで守った部分は利用者が誰であっても同時には動かないとされています。余裕を確かめてから予定表を直すまでを、スクリプトのロックで囲みます。 ロックが取れなかった回答は処理済みの印を付けずに残し、後で拾い直します。
拾い直しのために、15分ごとの時間主導型のトリガーも置きます。 処理済みの印が無い回答と、API の失敗で止まった回答を拾います。インストール型のトリガーは作った人のアカウントで動くので、受付の共有のアカウントで作ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| フォームの回答 | 送信の日時、お客様の番号、電話番号の下4桁、申し出の種類(選択)、自由記入 | フォームの回答のシート |
| お客様の一覧 | お客様の番号、氏名、電話番号、住所、ルート、周期、1回の本数、契約の状態、メールアドレス | お客様の一覧のシート |
| 配送の予定表 | お客様の番号、回の番号、配送日、ルート、本数、状態(予定・休止・配送済み)、仮・確定の印 | 配送の予定表のシート |
| ルートの一覧 | ルート、配送の曜日、1日の積み込みの上限 | ルートの一覧のシート |
| 決まり | 締切、休止を続けられる回数、本数の上限と下限、確認の連絡の文面の決まり | 決まりのシート |
質を決めるのは、配送の予定表が先の回まで作られていることです。 AIに渡すのは「次の4回分」の予定で、予定表に来月の行がまだ無ければ、「来月の2回目」を選べません。 予定表は周期に沿って、少なくとも2か月先まで行を作っておきます。
お客様の一覧の氏名・住所・電話番号は、AI に渡しません。 本人の確かめと確認の連絡の宛先にだけ使います。
データの取得方法を決める
フォームの回答は、トリガーが渡す値から取ります。 公式のページでは、スプレッドシートのフォームの送信のイベントには、質問の名前と値の組の namedValues、シートの並びの値の values、回答が書かれた範囲の range が入っているとされています。range で回答の行が分かるので、その行の横に処理の状態を書き込めます。
| 取るもの | どう取るか | 何に使うか |
|---|---|---|
| お客様 | お客様の番号で一覧を引き、電話番号の下4桁を比べる | 本人の確かめ |
| 次の4回分の予定 | 予定表をお客様の番号で絞り、状態が「予定」「休止」の行を日付の順に4つ | AIが選ぶ回の候補 |
| ルートの曜日 | ルートの一覧 | 変える先の日の確かめ |
| 積み込みの余裕 | 予定表をルートと日付で絞って本数を足し、上限と比べる | 変える先の日と本数の確かめ |
| 締切 | 決まりの値と、対象の回の配送日から計算する | 変えられるかの確かめ |
予定の候補には、その回の状態も添えます。 すでに「休止」になっている回の休止の申し出は、二重の申し出か、休止の取り消しのつもりで書かれていることがあります。 状態が分かれば、AIは「取り消し」かどうかを読み分けられます。
AIへ渡す前に整形する
- 処理済みかを見る … 回答の行の印を見ます。済んでいれば何もしません
- 本人を確かめる … お客様の番号と電話番号の下4桁が一覧と合うかを見ます。合わなければ AI に渡さず「本人未確認」
- 契約の状態を見る … 解約済み・停止中のお客様は、AI に渡さずに担当へ回します
- 予定の候補を作る … 次の4回分の予定を、
D1〜D4の番号と、配送日・曜日・本数・状態で並べます - 自由記入を整える … 前後の空白と改行をそろえます。本文に電話番号や住所が書かれていれば記号に置き換えます
- 今日の日付を添える … 「今週」「来月」の手がかりとして、今日の日付と曜日を添えます
4番目の番号は、AIが返す値をそのまま予定表の行に結び付けるためのものです。 番号はスクリプトが付け、AIは番号を選ぶだけです。AIが番号の代わりに日付を返したら、その申し出は「要確認」にします。
6番目の今日の日付は、AIに計算させるためのものではありません。 「今週の分」と書かれたときに、D1 がそれに当たるかをAIが読むための手がかりです。候補を4回分にしているのは、2週に1回のお客様でも「来月の2回目」までが入るからです。 4週に1回のお客様には、同じ4回で約4か月先まで入ります。
AIに処理させる
させるのは、自由記入を申し出ごとに分け、それぞれの種類と対象の回を選ぶことです。
| 出力 | 中身 | 決め方 |
|---|---|---|
| 種類 | 配送日の変更/1回の休止/休止の取り消し/本数の変更/配送先・時間帯の変更/解約/その他 | 自由記入から。選択の欄は手がかりとして扱う |
| 対象の回 | D1〜D4、「以降すべて」、または「特定できない」 | 予定の候補から選ぶ |
| 希望の日 | お客様が書いたとおりの日付の文字列 | 書かれていなければ空 |
| 希望の本数 | お客様が書いた本数 | 書かれていなければ空 |
| 根拠 | 判断に使った自由記入の一部 | そのまま写す |
選択の欄より、自由記入を優先させます。 お客様は選択の欄を一番上のものにしたまま、自由記入で本当の申し出を書くことが多いからです。選択と自由記入が食い違うときは、その申し出に「選択と記入が違う」の印を付けさせます。
| させないこと | 理由 |
|---|---|
| 日付を計算する | 対象の回は予定の候補から選ぶ。希望の日は書かれたとおりに写す |
| 変更できるかを決める | 締切・曜日・積み込みは決まりでスクリプトが確かめる |
| 解約を引き留める文を書く | 解約は専任の担当が折り返す |
| 休止の手数料に触れる | 契約の内容によって違う。担当が確かめる |
| 書かれていない本数を補う | 「多めに」は数ではない。担当が確かめる |
1行目がいちばん起きやすい失敗です。 「再来週の水曜にしてください」と書かれた申し出を渡すと、今日の日付から計算して「11月11日」のように日付を返します。 数え方を1週ずれれば、別の日に届きます。希望の日は書かれた文字列のまま返させ、日付として読めるものだけをスクリプトが解釈し、読めないものは担当に回します。
指示内容を固定する
あなたはウォーターサーバーの宅配会社の受付の担当です。
お客様から届いた定期配送の変更の申し出を、申し出ごとに分けてください。
【申し出の種類】
change_date(配送日の変更) / skip(1回の休止) / unskip(休止の取り消し) /
change_qty(本数の変更) / change_place(配送先・時間帯の変更) /
cancel(解約) / other(その他)
【対象の回の選び方】
- 【配送予定】の D1〜D4 の中から、申し出が当てはまる回を選んでください。
- 「今後ずっと」「次回以降すべて」などは "all_after" とし、起点の回を from に入れてください。
- 当てはまる回を1つに決められないときは "unclear" にしてください。
【厳守事項】
- 日付を計算しないでください。希望の日は、お客様が書いたとおりの文字列で
requested_date_text に写してください。書かれていなければ空にしてください。
- 本数は、数字で書かれているときだけ requested_qty に入れてください。
「多めに」「少なめに」は数ではありません。空にし、needs_review に理由を書いてください。
- 変更できるか、締切に間に合うかを書かないでください。
- 解約の申し出には、引き留めの言葉や手数料の説明を書かないでください。
- 1つの記入に複数の申し出があれば、requests にすべて分けて並べてください。
- 選択の欄と記入の内容が違うときは、記入を優先し、choice_mismatch を true にしてください。
- evidence には、判断の根拠にした記入の一部をそのまま写してください。
【今日】{today}({weekday})
【選択の欄】{choice}
【配送予定】{deliveries}
【記入】{free_text}
「日付を計算しない」は、理由も書いたほうが守られます。 実際の運用では、指示の冒頭に「日付は予定表の値を使うので、計算は不要です」と添えます。計算を禁じるだけだと、「念のため」として日付を併記してきます。
出力形式を固定する
OpenAI API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、strict: true のときはすべての項目を required に入れ、オブジェクトには additionalProperties: false を付けた例が示されており、値が無いことがある項目は null との組み合わせで表すとされています。
{
"requests": [
{
"type": "skip",
"target": "D2",
"from": null,
"requested_date_text": null,
"requested_qty": null,
"choice_mismatch": true,
"evidence": "来月は旅行なので1回お休みにして",
"needs_review": null
},
{
"type": "change_qty",
"target": "D3",
"from": null,
"requested_date_text": null,
"requested_qty": 3,
"choice_mismatch": true,
"evidence": "その次は3本にしてください",
"needs_review": null
}
]
}
1つ目の理由は、申し出ごとに決まりを当てはめられることです。
| 種類 | スクリプトが確かめること | 満たすとき |
|---|---|---|
skip | 締切に間に合うか、休止を続けられる回数を超えないか | 予定表の状態を「休止」(仮) |
unskip | 締切に間に合うか、ルートの積み込みに余裕があるか | 状態を「予定」(仮) |
change_qty | 締切、本数の上限と下限、積み込みの余裕 | 本数を直す(仮) |
change_date | 希望の日が読めるか、ルートの曜日か、締切、積み込みの余裕 | 配送日を直す(仮) |
cancel・change_place・other | 確かめない | 直さずに担当へ |
2つ目は、「特定できない」を正しく止められることです。 target が unclear のもの、needs_review に理由のあるもの、requested_date_text が日付として読めないものは、予定表を直さずに担当の一覧に並べます。
all_after は、決まりを満たしても仮の変更にしません。 「今後ずっと3本に」は、予定表の4回分ではなく、お客様の一覧の「1回の本数」そのものを変える申し出だからです。一覧の値を変えると、その先に作られるすべての回に効きます。一覧の書き換えは受付の担当が行い、スクリプトは「契約の内容の変更」として担当に並べるだけにします。
3つ目は、拒否と途中切れを見分けられることです。 公式のページでは、拒否のときは応答に refusal が入り、スキーマに従わないことがあるので、読む前に確かめることとされています。出力の上限で切れたときは status が incomplete になります。どちらもその回答を「要確認」にします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フォームの回答のシート | フォームの送信のトリガー | 回答を読み、処理の状態を書き込む |
| OpenAI API | UrlFetchApp.fetch | 申し出ごとの種類と対象の回を受け取る |
| 配送の予定表 | Apps Script の書き込み(ロックの中) | 決まりを満たす変更を「仮」で書き込む |
| Gmail | GmailApp.createDraft | 確認の連絡を下書きにする |
確認の連絡は、下書きまでにします。 公式のページでは、createDraft は宛先・件名・本文に加えて、CC や返信先などを指定して下書きを作れるとされています。受付の担当が仮の変更を確定したら、その下書きを送ります。 確定の前に連絡が届くと、担当が直した内容と食い違うことがあるからです。
連絡の文面は、AIに書かせずにひな形で作ります。 「◯月◯日の配送を休止にしました。次回は◯月◯日、◯本をお届けします」の日付と本数は、予定表の確定した値を差し込みます。 お客様が一番知りたいのは「次はいつ・何本か」で、そこを誤らないことが連絡の目的です。
人が確認する
- 「本人未確認」を見る … 番号の打ち間違いか、別のお客様の番号かを確かめ、必要なら電話します
- 仮の変更を一覧で確かめる … 申し出の根拠と直した行を並べて見ます。
choice_mismatchのものは記入を読み直します - 担当へ回ったものを片付ける … 締切を過ぎたもの、曜日の合わないもの、特定できないものに、お客様へ連絡して決めます
- 確定して下書きを送る … 確定の印を付け、下書きの日付と本数を見て送ります
- 解約と積み込みの超過を渡す … 解約は専任の担当、積み込みの超過は配送の責任者へ
目標は、1件2分です。 仮の変更の確定と送信は1件1分足らずで、担当へ回ったものは電話を含めて数分かかります。毎日の配車の締めの前に、仮のまま残っているものが無いようにします。
確かめの一覧は、配送日の近い順に並べます。 翌々日の配送に関わる仮の変更が、来月の分の後ろに埋もれていると、確定が配車の締めに間に合いません。 配送日までの日数と、担当へ回った理由の列を一覧の左に置きます。
例外に対処する
| 起きること | 対応 |
|---|---|
| お客様の番号と電話番号の下4桁が合わない | 「本人未確認」。予定表を直さない |
| 予定表に先の回の行が無い | 「要確認」。周期に沿って行を作ってから処理し直す |
| 締切を過ぎている | 直さずに担当へ。次の回からの変更を提案する |
| 希望の日がルートの曜日でない | 直さずに担当へ。近いルートの曜日を案内する |
| 積み込みの上限を超える | 直さずに配送の責任者へ |
| 対象の回を特定できない | 直さずに担当へ。お客様に確かめる |
| 同じお客様から続けて申し出が届く | 後の申し出を前の申し出の仮の変更の上で処理し、両方を担当に並べる |
| ロックが取れない | 処理済みの印を付けずに残し、15分ごとの処理で拾う |
refusal・incomplete・API の失敗 | 「要確認」。15分ごとの処理でやり直し、続けば担当へ |
最後の行のやり直しは、Apps Script の上限の中で行います。 公式の上限の表では、スクリプトの実行時間は1回あたり6分、同時に動かせる実行は利用者あたり30まで、外部へのアクセス(URL Fetch)の呼び出しは Google Workspace のアカウントで1日10万回です。月1,500件の申し出なら十分に収まります。
記録を残す
- 回答の行の番号、受けた日時、処理の日時と状態
- AIに渡した予定の候補と、AIが返した JSON の全文
- 申し出ごとの決まりの確かめの結果(締切、曜日、積み込み)と、そのとき使った決まりの値
- 予定表の変更の前と後の値、仮から確定にした担当と日時
- 送った確認の連絡の日時
4つ目の「変更の前と後」は、お客様からの問い合わせに答えるためのものです。 「頼んだのに届いた」と言われたとき、いつ、どの申し出で、何を何に変えたかを1行で示せます。
04実装レベルの3段階
最小構成では、予定表を探して直す作業が手で残ります。 読み分けの質を確かめるための段階です。 本記事の想定は半自動化です。 フォームに届いた申し出が、仮の変更と下書きの形で担当の前にそろいます。1件6分が2分になるのはこの段階です。 差が大きいのは、②の行を探す作業と④の書き換えがスクリプトに移るからです。 本格構成は、配送の管理システムの仕様によります。 予定を API で受け付けるかは製品ごとに違うので、使っている製品の仕様を確かめてから進めてください。
05工数削減シミュレーション
導入後 1,500件 × 2分 ÷ 60 = 50 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 地域で数千件のお客様にウォーターサーバーのボトルを定期で届けている宅配会社。配送日の変更や休止の申し出を Web のフォームで受け、受付の担当が配送の予定表(スプレッドシート)を1件ずつ直している場合。フォームに自由記入の欄があり、「来月は1回飛ばして再来月は3本」のように、1件に複数の申し出が書かれて届く場合。Google Workspace を使っている場合。
- 定期配送の変更をお客様がマイページで自分で行い、予定表に直接反映される仕組みがすでにある会社。申し出の大半が電話で、フォームでの受付がほとんど無い場合。配送の管理システムが予定の変更を API で受け付けず、スプレッドシートとの二重管理を避けられない場合(先に管理の場所を決める必要があります)。なお、解約の引き留めや、休止の手数料の扱いの判断はこの構成の対象外です。
07最小構成で試す方法
- 先月のフォームの回答から40件を選ぶ(1件に複数の申し出があるもの、選択と記入が違うもの、「来月の2回目」のような書き方のもの、解約を混ぜる)
- 40件について、氏名・電話番号を消し、そのお客様の次の4回分の予定を番号付きで書き出す
- 手元の ChatGPT の画面に、第7章のプロンプトと、1件ずつの記入と予定を貼る
- 出てきた種類と対象の回を、実際に担当が直した内容と見比べる
40件は必ず書き方をばらして選んでください。 選択と記入が合っている素直な申し出ばかりだと、分ける力と特定できないときの扱いが試せません。
| 出てきた内容 | 判断 |
|---|---|
| 担当が直した回と同じ回を選んだ | スクリプトでつなぐ段階に進む |
| 日付を計算して返した | 指示の書き方で直る。構成は有効 |
| 2つ目の申し出を落とした | 「すべて分けて並べる」を強め、例を足す |
| 対象の回を決められないものが多い | 予定の候補の書き方を見直す。 曜日と状態を添える |
2行目は、ほぼ必ず出ます。 「再来週」と書かれると、親切に日付にします。日付はスクリプトが予定表から持ってくる、という分け方を指示の冒頭に書いてください。
試した40件の結果は、そのまま決まりのシートの見直しにも使えます。 担当が直した内容のうち、締切を過ぎていたのに受けていたもの、ルートの曜日でない日に変えていたものが見つかれば、それは AI の問題ではなく、いまの運用で決まりが守られていなかったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが日付を計算して1週ずれる | 予定の候補から回を選ばせる。 希望の日は文字列で写させる |
| 2つ目の申し出を落とす | 申し出ごとに配列で返させ、例を指示に添える |
| 同時の回答で積み込みが上限を超える | 余裕の確かめから書き込みまでをロックで囲む |
| 選択の欄を信じて誤る | 記入を優先し、食い違いに印を付ける |
| 先の回の行が無く選べない | 予定表を2か月先まで作っておく |
| 別のお客様の行を直す | 番号と電話番号の下4桁で本人を確かめる |
| 確認の連絡と予定表が食い違う | 連絡はひな形で、確定した値を差し込む |
| 解約に引き留めの文が付く | 解約は直さず、文も作らずに担当へ |
| 個人のアカウントでトリガーを作る | 作成者のアカウントで動く。共有のアカウントで作る |
上の3行が、この構成の失敗のほとんどです。 どれも、ボトルが届く日と本数を誤る失敗です。日付は予定表から、本数は書かれた数字から、書き込みは1件ずつ、を守ってください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の番号、氏名、住所、電話番号、メールアドレス、配送の予定、申し出の自由記入です。自由記入には、不在の理由(入院・旅行・引っ越し)が書かれていることがあります。
- AI に渡す範囲を、読み分けに要るものまでに限る … OpenAI API に渡すのは、自由記入と選択の欄と4回分の予定だけです。氏名・住所・電話番号は渡しません。 記入に書かれた連絡先は記号に置き換えます
- 本人の確かめを AI の前に置く … 番号と電話番号の下4桁が合わない申し出は、AIにも予定表にも渡しません
- 予定表を直してよいかを AI に決めさせない … 決まりはスクリプト、確定は受付の担当が行います
- 解約を AI に扱わせない … 契約の期間や手数料に関わるので、専任の担当が折り返します
- 確認の連絡を自動で送らない … 下書きまでにし、確定した後に担当が送ります
- API キーをスクリプトに直接書かない … スクリプトのプロパティに置き、編集権限を持つ人を限ります
誤りが起きた場合のリスクは、届けるべき日に届かないことと、休止したはずの日に届いて請求されることの2つです。どちらも日付と本数の誤りから来るので、日付は予定表の値、変更は決まりで確かめ、確定は人という3段で防ぎます。
10まず何から始めるか
1週目:予定表とルートの一覧を整える
配送の予定表を、すべてのお客様について2か月先まで作ります。ルートの一覧に、配送の曜日と1日の積み込みの上限を入れます。
2週目:決まりをシートにまとめる
締切、休止を続けられる回数、本数の上限と下限を1つのシートにまとめます。担当ごとに違う覚え方をしていないかを、ここで確かめます。
3週目:40件で試す
書き方をばらした40件を ChatGPT の画面に貼り、種類と対象の回を選ばせます。日付を計算していないか、2つ目の申し出を落としていないかを最優先で見ます。
4週目:フォームの送信から仮の変更までをつなぐ
Apps Script で本人を確かめ、AIで読み分け、決まりを満たすものを予定表に「仮」で書き込むところまで作ります。この時点では確認の連絡は手で書き、仮の変更が担当の判断と合うかを毎日見ます。
2か月目: 確認の連絡の下書きを足し、仮の変更を確定して送る流れに切り替えます。3か月目以降: 1件6分が何分になったかを実測します。配送の当日の朝に、変更の見落としでルートを組み直すことが無くなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| インストール型のトリガーが作成者のアカウントで動くこと。フォームの送信のトリガーに、フォームに付けるものと回答先のスプレッドシートに付けるものの2つがあること。時間主導型のトリガーが毎分から月1回まで動かせること | Google: Installable triggers | 2026-10-27 |
スプレッドシートのフォームの送信のイベントに namedValues・values・range が入ること | Google: Event objects | 2026-10-27 |
| 実行時間が1回6分、同時実行が利用者あたり30、URL Fetch の呼び出しが Workspace で1日10万回であること | Google: Quotas for Google Services | 2026-10-27 |
| スクリプト単位のロックで守った部分が、利用者が誰であっても同時には動かないこと | Google: Class LockService | 2026-10-27 |
createDraft が宛先・件名・本文と、CC・返信先などの指定で下書きを作ること | Google: Class GmailApp | 2026-10-27 |
Responses API の text.format に json_schema と strict: true を指定すること。例ですべての項目を required にし additionalProperties: false を付け、値が無いことのある項目を null との組み合わせで表すこと。拒否のときは refusal が入りスキーマに従わないことがあること。上限で切れたときに status が incomplete になること | OpenAI: Structured model outputs | 2026-10-27 |
変更の締切、休止の回数、解約の条件は、自社の利用規約とお客様との契約で確かめてください。 本記事は、変更の申し出の読み分けと予定表の仮の更新に絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1984)についてのご相談はこちらから。
