氷の卸が飲食店から届く注文と変更の連絡を Apps Script と AI で読み、定期の注文に反映して配達の順の一覧と配達の伝票を作る
飲食店から届く氷の注文と変更の連絡を、AIが店・品目・数・配達日・連絡の種類に読み分け、スクリプトが定期の注文に反映します。締めのあとには便ごとの配達の順の一覧と積み込みの数、店ごとの伝票が自動でそろいます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/n8n
- 対象業界
- 小売/物流/製造/飲食
- 対象部門
- 営業/物流
- 対象業務
- データ入力・転記/書類作成
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 事務が受注用の Gmail を開き、届いた連絡を1件ずつ読む
- 差出人とメールの署名から、どの店かを店の台帳で探す
- 「明日」「今週」「来月から」がどの日のことかを考え、明日だけの変更か、定期の変更かを決める
- 明日だけの変更は翌日の注文の表に、定期の変更は定期の注文の表に書き足す
- 締めの16時のあと、翌日の注文の表を便ごとに並べ、配達の順の一覧を作る
- 品目ごとの合計を数え、製氷会社からの仕入れと冷凍庫からの積み込みの数を決める
- 店ごとの配達の伝票を作り、印刷して便ごとに束ねる
- 人店の担当者が受注用のアドレスへメールを送る。電話は事務が受注のフォームに書く(今と同じ)
- 自動10分ごとに Apps Script が受注用の Gmail から未処理の連絡を探す
- 自動差出人のアドレスから店の台帳で店を引き当てる。引き当たらなければ確認の一覧へ
- 自動連絡の本文、その店の定期の数、今日の日付と曜日を Claude API に渡し、品目・数・配達日・連絡の種類を取り出させる
- 自動取り出した内容を確かめ、明日だけの変更は翌日以降の注文の表へ、定期の変更は「定期の変更の候補」へ、休みは休みの表へ書く
- 人事務が確認の一覧と定期の変更の候補を見て、直すか承認する
- 自動締めの16時のあと、翌日の注文を便ごと・配達の順に並べ、積み込みの数と店ごとの伝票のシートを作る
- 人配車の担当が一覧と積み込みの数を確かめ、伝票を印刷する
各工程の詳しい説明を読む
- 事務が受注用の Gmail を開き、届いた連絡を1件ずつ読む
- 差出人とメールの署名から、どの店かを店の台帳で探す
- 「明日」「今週」「来月から」がどの日のことかを考え、明日だけの変更か、定期の変更かを決める
- 明日だけの変更は翌日の注文の表に、定期の変更は定期の注文の表に書き足す
- 締めの16時のあと、翌日の注文の表を便ごとに並べ、配達の順の一覧を作る
- 品目ごとの合計を数え、製氷会社からの仕入れと冷凍庫からの積み込みの数を決める
- 店ごとの配達の伝票を作り、印刷して便ごとに束ねる
(a)連絡の種類を読み分けるのに時間がかかる。 「明日10袋で」が「明日だけ10袋」なのか「明日から毎日10袋」なのかは、その店のふだんの数と、連絡の前後の言い回しで判断しています。 事務は店ごとの癖を覚えていて、それで読み分けています。
(b)休みと減らす連絡を見落とす。 追加の連絡は店から念を押されることが多いのに対し、臨時休業や減らす連絡は一言で終わることが多く、読み流されやすい連絡です。 見落とすと、閉まっている店に氷を届けて持ち帰ることになり、溶けて売り物になりません。
(c)締めのあとの1〜2時間が一覧づくりで埋まる。 16時の締めから翌朝の積み込みまでに、配達の順の一覧と伝票をそろえる必要があります。連絡が締めの直前に集中する日は、事務が残って作業しています。
(d)変更がどこから来たかが残らない。 日ごとの注文の表の数は書き換えてしまうので、「先週の金曜に8袋届いたのはなぜか」を後から調べるには、メールを探し直すしかありません。 月末の請求で店と数が合わないとき、その確かめに時間がかかります。
(e)事務が休むと回らない。 店ごとの癖と、定期の注文の書き方を知っているのが事務1人で、配車の担当が代わると、読み分けの判断が変わります。
- 【人】 店の担当者が受注用のアドレスへメールを送る。電話は事務が受注のフォームに書く(今と同じ)
- 【自動】 10分ごとに Apps Script が受注用の Gmail から未処理の連絡を探す
- 【自動】 差出人のアドレスから店の台帳で店を引き当てる。引き当たらなければ確認の一覧へ
- 【自動】 連絡の本文、その店の定期の数、今日の日付と曜日を Claude API に渡し、品目・数・配達日・連絡の種類を取り出させる
- 【自動】 取り出した内容を確かめ、明日だけの変更は翌日以降の注文の表へ、定期の変更は「定期の変更の候補」へ、休みは休みの表へ書く
- 【人】 事務が確認の一覧と定期の変更の候補を見て、直すか承認する
- 【自動】 締めの16時のあと、翌日の注文を便ごと・配達の順に並べ、積み込みの数と店ごとの伝票のシートを作る
- 【人】 配車の担当が一覧と積み込みの数を確かめ、伝票を印刷する
5番目で定期の変更を「候補」にしているのが、この設計の分かれ目です。 明日だけの変更や休みは翌日以降の注文にそのまま入れますが、ずっと続く定期の変更は、事務が承認してから定期の注文の表に入れます。 読み違えたときの影響が、1日分か、何週間分かで違うからです。
7番目の並べ替えと数えはスクリプトの式で行います。 AIは使いません。
02今回想定するシステム構成
飲食店(メール) / 事務(電話を受注のフォームに書く → メールで届く) │ ▼【トリガー①】10分ごと(時間主導型) Google Apps Script ├──▶ Gmail を検索し、未処理のラベルが付いた連絡を取る ├──▶ 差出人のアドレスで店の台帳から店を引き当てる ▼ Claude API(構造化出力)── 品目・数・配達日・連絡の種類を取り出す ▼ Google Apps Script ── 内容を確かめて書き分ける ├── 明日だけの変更・追加 ─▶ 日ごとの注文の表 ├── 休み ─▶ 休みの表 ├── 定期の変更 ─▶ 定期の変更の候補 ─▶【事務が承認】─▶ 定期の注文の表 └── 決められない ─▶ 確認の一覧 ─▶【事務が確かめる】 ▼【トリガー②】毎日16時台(締めのあと) Google Apps Script ├──▶ 便ごと・配達の順の一覧 ├──▶ 品目ごとの積み込みの数 └──▶ 店ごとの配達の伝票のシート ─▶【配車の担当が確かめて印刷】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、n8n |
| 生成AI | Claude API(Messages API、構造化出力) | OpenAI API、Gemini API |
| 保管 | Google スプレッドシート(店の台帳、定期の注文、日ごとの注文、休み、確認の一覧、配達の一覧、伝票) | - |
| メール | Gmail(受注用のアドレス) | - |
新しく足すのは、Apps Script と、日ごとの注文・休み・定期の変更の候補・確認の一覧・処理の記録のシートです。 店の台帳と定期の注文の表は今のものを使い、店の台帳に「連絡に使うメールアドレス」の列を足します。 1つの店から複数の人が連絡してくることがあるので、アドレスは複数を書けるようにします。
Apps Script を実行環境にしているのは、受注用の Gmail と表がどちらも Google のサービスにあるからです。 時間主導型のトリガーは毎分から月1回までの間隔で動かせ、Gmail の検索と表の読み書きを同じスクリプトで行えます。
伝票はスプレッドシートのシートとして作ります。 店ごとに1ブロックずつ並べたシートを、配車の担当が印刷の画面から出します。新しい文書を毎日作ると、個人のアカウントでは文書やスプレッドシートを作れる数に1日の上限があるので、 決まったシートを毎日書き換える作りにします。
03どうやって実装するのか
処理の起点を決める
トリガーは2つです。
①10分ごとの時間主導型のトリガー。 受注用の Gmail から、まだ処理していない連絡を探して1件ずつ処理します。インストール型のトリガーの種類(時間主導型、スプレッドシートの編集・変更、フォームの送信、カレンダーなど)に Gmail の受信は無いので、 短い間隔で探しに行く形にします。10分ごとなら、店からの連絡が締めの直前に届いても、締めまでに確認の一覧に出せます。
②毎日16時台の時間主導型のトリガー。 締めのあとに、翌日の配達の一覧と伝票を作ります。定時のトリガーは設定した時刻から1時間の間でばらつくので、16時に設定すると16時台のどこかで動きます。動く前に、①がその日の最後の連絡まで処理し終えているかを確かめます。 未処理のラベルが残っていれば、先に①の処理を呼んでから一覧を作ります。
締めの後に届いた連絡は、翌々日以降の配達として扱います。 ①は止めずに動き続け、締めの後の連絡には「締め後」の印を付けて確認の一覧に出します。明日の配達に入れるかは、配車の担当が積み込みの余裕を見て決めます。
どちらもインストール型のトリガーで、作った人のアカウントで動きます。 受注用の Gmail を読むので、受注用のアカウントでトリガーを作ります。 個人のアカウントで作ると、その人の受信箱を読みに行ってしまいます。
トリガーの合計の実行時間に気をつけます。 個人のアカウントでは1日90分、Google Workspace では1日6時間です。10分ごとに1日144回動くので、1回が数十秒でも個人のアカウントでは上限に近づきます。 受注用のアカウントは Google Workspace にし、連絡の無い時間帯(深夜)は処理を何もせずに終えるようにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 連絡の本文 | 差出人、件名、本文、受信の日時 | 受注用の Gmail |
| 店の台帳 | 店のコード、店名、連絡に使うメールアドレス、便、配達の順、時間帯、置き場所、鍵の有無、定休日 | 店の台帳のシート |
| 定期の注文 | 店のコード、曜日ごとの品目と数 | 定期の注文のシート |
| 品目の一覧 | 品目のコード、品名、単位(袋・個・本)、店がよく使う呼び方 | 品目の一覧のシート |
AIに渡すのは、連絡の本文と、その店の定期の数、品目の一覧、今日の日付と曜日です。 店の台帳の置き場所や鍵の情報は渡しません。店の特定もAIにはさせず、差出人のアドレスでスクリプトが行います。
その店の定期の数を渡すのは、(a) の読み分けのためです。 定期が角氷3袋の店から「明日5袋で」と来たら、「明日だけ5袋(2袋の追加)」と読むのが自然です。AIはこの数を見て、連絡が定期に対する変更かどうかを判断します。
今日の日付と曜日を渡すのは、「明日」「月曜」「来週から」を日付に直すためです。 ただし、日付への直しはスクリプトでも確かめます(後述)。
データの取得方法を決める
- Gmail を検索する …
GmailApp.search('label:受注-未処理', 0, 20)のように、未処理のラベルが付いたスレッドを20件ずつ取ります。公式の説明は、件数が分からず多くなりうるときは範囲を指定して取るよう案内しています - 未処理のラベルを付ける … 受注用のアドレスに届いたメールに、Gmail のフィルタで「受注-未処理」のラベルを付けておきます
- 店を引き当てる … 差出人のアドレスで店の台帳を引きます。受注のフォームから来たメールは、本文の店のコードの欄で引きます
- 定期の数を引く … その店の曜日ごとの品目と数を、明日から7日分の表にします
- Claude API を呼ぶ …
UrlFetchApp.fetchで Messages API を呼びます。muteHttpExceptionsをtrueにして、失敗の応答でも例外で止めずに処理の記録へ書きます - ラベルを付け替える … 書き分けが終わったら「受注-未処理」を外し「受注-処理済み」を付けます。失敗したものは未処理のまま残します
ラベルを付け替えるのは、成功したときだけにします。 そうすれば、未処理のラベルが残っている数が、そのまま処理できていない連絡の数になります。
1回の実行は6分までです。 20件ずつ取るのは、1件ごとにAIを呼ぶ時間を見込んで、6分に収めるためです。残りは次の10分後に処理されます。
AIへ渡す前に整形する
- 引用と署名を外す … 返信のメールに付いてくる前のやりとりの引用と、店の署名を外します。前の連絡の数をAIが今回の連絡と取り違えないようにするためです
- 全角の数字をそろえる … 「5袋」「五袋」を数字に直す前に、全角の数字を半角にします
- 日付の表を作る … 今日から7日分の「日付・曜日・その日の定期の数・定休日か」の表を作り、AIに渡します
- 店が引き当たらない連絡を外す … AIに渡さず、確認の一覧へ回します
- 同じ連絡の二重送信を見つける … 同じ店から同じ本文が10分以内に2通来たら、2通目を「重複の疑い」にします
3番目の日付の表が、日付の読み違いを減らします。 「月曜」と書かれても、それが今週の月曜か来週の月曜かは、今日の曜日しだいです。7日分の日付と曜日を並べて渡せば、AIは表から選ぶだけで済みます。 定休日も表に入れておけば、「定休日の配達の追加」という矛盾にも気づけます。
AIに処理させる
させるのは、連絡の本文から、品目・数・配達日・連絡の種類を1行ずつ取り出すことだけです。
| 取り出すもの | 取り出し方 | 決められないときの扱い |
|---|---|---|
| 連絡の種類 | add(その日だけ増やす)/set_day(その日だけこの数に)/reduce(その日だけ減らす)/skip(その日は休み)/change_regular(定期を変える)/inquiry(問い合わせ) | 判断できなければ unclear |
| 品目 | 品目の一覧の品名・呼び方と照らしてコードを選ぶ | 当てはまらなければ空にして item_unclear |
| 数 | 書かれた数をそのまま | 書かれていなければ空にして no_quantity |
| 配達日 | 日付の表から選ぶ。期間なら開始と終了 | 表に無い日なら空にして date_unclear |
| 便 | 「午前に」「夜の前に」など書かれていれば | 書かれていなければ空(店の台帳の便に従う) |
連絡の種類を add と set_day に分けているのが、(a) への答えです。 「明日5袋追加で」は add で5袋を足し、「明日5袋で」は set_day で5袋にします。どちらか決められないときは unclear にして、人に回します。 定期が3袋の店で読み違えると、8袋と5袋で3袋の差が出ます。
| させないこと | 理由 |
|---|---|
| 店の特定 | 差出人のアドレスでスクリプトが行う |
| 翌日の数の計算 | add・reduce の足し引きはスクリプトが行う |
| 定期の注文の書き換えの確定 | 候補として出し、事務が承認する |
| 配達の順・便の組み直し | 配車の担当が店の台帳で決める |
| 品切れのときの割り振り | どの店を優先するかは人が決める |
指示内容を固定する
あなたは氷の卸の受注の事務として、飲食店からの連絡を読み、注文の変更を取り出します。
【この店の定期の注文(今日から7日分)】
{schedule_table} (日付|曜日|品目ごとの定期の数|定休日か)
【品目の一覧(コード|品名|単位|よく使われる呼び方)】
{item_list}
【今日】{today}({weekday})
【連絡の本文】
{message}
【やること】
連絡の本文から、変更を1行ずつ取り出してください。1つの連絡に複数の変更があれば、
すべて別の行にしてください。
【type の選び方】
- add ............ その日だけ、定期の数に足す(「追加」「あと2袋」など)
- set_day ........ その日だけ、この数にする(「明日は5袋で」など)
- reduce ......... その日だけ、定期の数から減らす
- skip ........... その日は配達しない(休み・臨時休業)
- change_regular . これから先の定期の数を変える(「来月から」「今後は」「毎週〜に」など)
- inquiry ........ 注文の変更ではない質問
- unclear ........ 上のどれか決められない
add と set_day のどちらか迷ったら unclear にしてください。
【厳守事項】
- 配達日は【この店の定期の注文】の表の日付から選んでください。表に無い日は空にし、
flags に date_unclear を入れてください。
- 数を計算しないでください。「あと2袋」は quantity=2、type=add のまま返します。
- 書かれていない品目を、定期の品目で補わないでください。
品目が書かれていない「明日多めに」などは unclear にしてください。
- 定休日の日付への add・set_day は、そのまま返したうえで flags に closed_day を入れてください。
- 本文の引用部分(「>」で始まる行)は読まないでください。
- 推測で埋めないでください。書かれていないことは空にしてください。
「add と set_day のどちらか迷ったら unclear」を明記しているのは、ここがいちばん間違えやすいからです。 書かないと、AIは文の調子からどちらかを選びます。選んだほうが外れていたとき、配達の現場で初めて分かります。
「多めに」を unclear にさせるのも同じです。 何袋が「多め」かは店ごとに違い、事務が電話で確かめるしかありません。
出力形式を固定する
Claude API の構造化出力で、次の形の JSON を受け取ります。 スキーマは output_config.format に type: "json_schema" で渡し、type は enum で6つの種類と unclear に限ります。
{
"changes": [
{ "type": "add", "item_code": "KAKU-1K", "quantity": 2,
"date_from": "2026-11-06", "date_to": "2026-11-06",
"slot": "", "source_text": "明日は宴会なので角氷あと2袋" },
{ "type": "skip", "item_code": "", "quantity": null,
"date_from": "2026-11-09", "date_to": "2026-11-09",
"slot": "", "source_text": "月曜は臨時休業です" }
],
"flags": [],
"inquiry_text": ""
}
スクリプトは、受け取った行を次のように書き分けます。
| type | 書く先 | スクリプトが行うこと |
|---|---|---|
add・reduce・set_day | 日ごとの注文の表 | 定期の数に足し引きするか置き換え、0未満になれば確認の一覧へ |
skip | 休みの表 | その日のその店の配達を0にする |
change_regular | 定期の変更の候補 | 事務の承認を待つ |
inquiry・unclear | 確認の一覧 | 本文と source_text を並べて出す |
1つ目の理由は、明日だけの変更と定期の変更を、書く先で分けられることです。 自由文で受けると、どこに書くかを人が判断し直すことになります。
2つ目は、source_text で確認が速くなることです。 確認の一覧で、本文のどの部分からその行を取り出したかが一目で分かります。
enum の値は、大文字・小文字が変わって返ることがあるとされているので、スクリプトでは小文字にそろえてから比べます。数値の範囲の制約(minimum など)は構造化出力で使えず400になるので、数が0以上かはスクリプトで確かめます。停止の理由が max_tokens のときは出力がスキーマに合わないことがあるので、end_turn 以外なら結果を使わずに未処理のまま残します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受注用の Gmail | GmailApp.search・ラベルの付け替え | 未処理の連絡を取り、処理済みにする |
| Claude API | UrlFetchApp で Messages API を呼ぶ | 変更の取り出し |
| 店の台帳・定期の注文 | SpreadsheetApp で読む | 店の特定と定期の数 |
| 日ごとの注文・休み・候補・確認の一覧 | SpreadsheetApp で書く | 種類ごとの書き分け |
| 配達の一覧・伝票のシート | SpreadsheetApp で書く | 便ごと・配達の順の一覧と店ごとの伝票 |
配達の一覧は、店の台帳の「便」と「配達の順」で並べるだけです。 同じ便の中では配達の順の数字の小さい店から並べ、置き場所と時間帯と鍵の有無を一覧に載せます。 運転手が一覧だけで動けるようにするためです。
積み込みの数は、便ごとに品目の合計を出します。 製氷会社からの仕入れの数は、全便の合計に予備を足して配車の担当が決めます。
伝票のシートには、店ごとに次の欄を並べます。 店名、配達日と便、品目ごとの数(定期の数と、変更があればその内容)、置き場所、受け取りの印の欄です。変更があった品目には「本日追加2」「本日休み」のように変更の中身を印字します。 店の人が受け取りのときに、いつもと数が違う理由をその場で確かめられ、「頼んでいない」という行き違いが減ります。伝票の通し番号は、配達日・便・配達の順から作り、同じ伝票を二度印刷しても番号で気づけるようにします。
人が確認する
人が見る場面は3つです。
- 確認の一覧(随時) …
unclear・inquiry・店が引き当たらない連絡・締め後の連絡を、事務が見ます。電話で店に確かめてから、日ごとの注文の表に手で書きます - 定期の変更の候補(毎日) … 事務が本文と見比べて承認すると、定期の注文の表に入ります。承認するまで、定期の数は変わりません
- 配達の一覧と積み込みの数(締めのあと) … 配車の担当が、休みの店が抜けているか、積み込みが車に載るかを見て、伝票を印刷します
1番目は、締めの直前に集中します。 15時台に確認の一覧が増えたら、事務は他の作業より先にここを片付けます。 締めを過ぎると、明日の配達に入れるかの判断が配車の担当に移ります。
目標は、600件をならして1件1分です。 そのまま書き分けられた連絡は配達の一覧で数秒、確認の一覧に入った連絡は電話を含めて数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 差出人のアドレスが台帳に無い | 確認の一覧へ。店に確かめて台帳にアドレスを足す |
add か set_day か決められない | unclear で確認の一覧へ。電話で確かめる |
| 定休日に追加の注文 | closed_day で確認の一覧へ。臨時の営業か確かめる |
| 減らした結果が0未満 | 確認の一覧へ |
| 締めの後に届いた連絡 | 「締め後」の印を付けて確認の一覧へ。配車の担当が判断する |
| Claude API がエラーかタイムアウト | 処理の記録に書き、未処理のラベルを残す。次の10分後に再試行 |
| 3回続けて失敗した連絡 | 確認の一覧へ回し、事務が手で読む |
| 返信の引用に前の注文の数がある | 前処理で引用を外す。外しきれなければ source_text で確かめる |
| 1通に複数の店の注文(系列店) | 店の台帳の系列の欄で複数の店を候補にし、確認の一覧へ |
上の4行が大半を占めます。 どれもAIの読み違いというより、連絡の書き方と台帳の整い方の問題です。 確認の理由を月ごとに数え、多い理由から台帳とお店への案内を直します。
記録を残す
- 連絡の本文(Gmail に残る)と、処理済みにした日時
- AIに渡した日付の表と、返った JSON の全文
- 日ごとの注文・休み・定期の変更に書いた行と、もとになった連絡
- 定期の変更を承認した人と日時、承認の前と後の定期の数
- 確認の一覧で人が直した内容
- Claude API のエラーの応答と再試行の回数
3つ目で「もとになった連絡」を行ごとに残すのは、配達のあとの問い合わせに答えるためです。 「頼んだ数と違う」と言われたとき、どの連絡からその数になったかを、その場で示せます。
4つ目の定期の数の前と後は、月末の請求の確かめにも使います。 定期の数がいつ変わったかが分からないと、月の途中で数が変わった店の請求を説明できません。処理の記録は少なくとも請求の確定まで残し、 古い記録は月ごとに別のシートへ移して、スクリプトが毎回読む表を軽く保ちます。
04実装レベルの3段階
最小構成は、確かめるための段階です。 1日25件を手で貼るのは続きません。 半自動化で、1件3分が1分になる想定で、これが本記事の想定です。 読み分けと書き分けと一覧づくりが自動になり、残るのは確認の一覧と定期の変更の承認、一覧の確認です。 本格構成は、店の協力しだいです。 決まった形のフォームで頼んでもらえれば、AIで読み分ける連絡そのものが減ります。ただ、スマートフォンから一言で送れる気軽さを店が手放すとは限らないので、 半自動化で読み分けが安定してから相談します。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 氷の卸や製氷の会社、おしぼり・酒・米・青果など飲食店へ毎日決まった品を配達する卸で、多くの店が定期の注文を持ち、そこへ「明日は宴会で倍」「月曜は休み」などの変更の連絡がメールや電話で毎日届く場合。連絡を読んで定期の注文に書き足し、翌日の便ごとの配達の順の一覧と伝票を事務が手で作っており、締めのあとの1〜2時間が毎日その作業で埋まっている場合。店の台帳と定期の注文を Google スプレッドシートで持っている場合。
- 受発注の専用の仕組みで飲食店が直接注文を入れ、配達の一覧と伝票がそこから出ている場合。配達先が十数店で、変更の連絡が日に数件の場合。注文の大半が FAX の手書きで届く場合(読み取りから始める別の構成になる)。なお、配達のルートの組み直しや、品切れのときにどの店を優先するかという判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の連絡から50件を選ぶ(うち10件は、追加か置き換えかで迷った連絡を入れる)
- その店の定期の数と、その日から7日分の日付の表を用意する
- 手元で使えるAIの画面に、定期の数・日付の表・連絡の本文を貼り、「この連絡を、その日だけ足すのか、その日だけこの数にするのか、休みか、定期を変えるのかに分け、品目・数・配達日を書き出してください。迷ったら決めずに『不明』としてください」と指示する
- 出てきた結果を、当時事務が実際に書いた数と突き合わせる
50件は必ずやってください。 スクリプトを書く前に、「定期の数を一緒に渡せば、変更の種類を読み分けられるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の事務と同じ読み分けになった | スクリプトの作成に進む |
| 迷う連絡を、どちらかに決めてしまった | 指示の書き方で直る。構成は有効 |
| 店によって言い回しの意味が違い、読み分けられない | その店の連絡の書き方をそろえてもらうのが先 |
3行目の店は、多くはありません。 事務が「この店の『で』は置き換え」と覚えている店です。そういう店には、「追加なら『あと』を付けてください」とお願いするほうが、AIの指示を細かくするより確実です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 「明日5袋で」を追加と読む | add と set_day を分け、迷えば unclear にさせる |
| 「多めに」をAIが数にする | 品目と数が書かれていなければ unclear |
| 返信の引用の前の数を拾う | 前処理で引用を外し、指示でも引用を読まないよう書く |
| 「月曜」を違う週の月曜と読む | 7日分の日付の表を渡し、表から選ばせる |
| 定期の変更がすぐに定期の表に入る | 候補にして、事務の承認を通す |
| 個人のアカウントでトリガーの実行時間の上限に近づく | 受注用のアカウントを Google Workspace にし、深夜は何もせずに終える |
| Gmail の検索が多すぎて失敗する | 範囲を指定して20件ずつ取る |
| 1回の実行が6分を超える | 1回に扱う件数を絞り、残りは次の実行に回す |
| 文書を毎日作って上限に当たる | 決まった伝票のシートを書き換える |
スキーマに minimum を入れて400になる | 数値の制約は使えない。範囲はスクリプトで確かめる |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが文の調子から数を決めることから起きます。決められないときに決めない、を指示と種類の分け方で守ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店の名前・連絡先のメールアドレス、注文の品目と数、配達の時間帯と置き場所、鍵の有無です。置き場所と鍵の有無は、店の防犯に関わる情報です。
- AIに置き場所と鍵の情報を渡さない … 渡すのは連絡の本文、定期の数、日付の表、品目の一覧だけです。配達の一覧には載せますが、それはスクリプトが店の台帳から書くものです
- 配達の一覧の印刷物の扱いを決める … 鍵の場所が書かれた一覧は、運転手が持ち歩いたあと、事務所で回収して捨てる決まりにします
- 受注用のアカウントを個人のアカウントと分ける … トリガーは作った人のアカウントで動くので、受注用のアカウントで作り、個人の受信箱を読まないようにします
- 定期の注文の変更を自動で確定させない … 何週間分もの配達に効くので、事務の承認を挟みます
- 連絡の本文に、店の従業員の個人的な事情が書かれることがある … 「店長が入院で」など。処理の記録を見られる人を事務と配車の担当に限ります
誤りが起きた場合のリスクは、休みの店に届けて持ち帰ることと、違う数を届けることの2つです。 前者は skip の見落とし、後者は add と set_day の取り違えから起きます。どちらも、読み分けを種類として取り出し、迷ったものを人に回す設計で防ぎます。
10まず何から始めるか
1週目:店の台帳にアドレスの列を足す
過去3か月の連絡の差出人を拾い、店の台帳に連絡に使うメールアドレスを書き足します。受注用のアドレスに、Gmail のフィルタで「受注-未処理」のラベルを付けるようにします。
2週目:50件で試す
先月の連絡から50件を選び、定期の数と日付の表と一緒に手元のAIの画面に貼って読み分けさせます。追加か置き換えかで迷う連絡を、決めずに不明としているかを最優先で見ます。
3週目:読み分けと書き分けを作る
10分ごとのトリガーで、Gmail から連絡を取り、読み分けて日ごとの注文・休み・候補・確認の一覧に書くところまで作ります。この時点では、事務がこれまでどおり手で書いた表と並べて1週間比べます。
4週目:配達の一覧と伝票を足す
締めのあとのトリガーで、便ごと・配達の順の一覧、積み込みの数、伝票のシートを作ります。最初の数日は、手で作った一覧と並べ、休みの店が抜けているかを必ず見ます。
2か月目: 確認の一覧に入った理由を数え、店への案内(「追加なら『あと』を付けて」)を出します。3か月目以降: 1件3分が何分になったかを実測し、休みの店への配達が無くなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせること。作った人のアカウントで動くこと。定時のトリガーは設定の時刻から1時間の間でばらつくこと。失敗すると要約のメールが届くこと | Google for Developers: Installable triggers | 2026-10-28 |
| トリガーの合計の実行時間が個人のアカウントで1日90分、Google Workspace で1日6時間。1回の実行が6分。文書の作成が個人のアカウントで1日250件、スプレッドシートの作成が1日250件であること | Google for Developers: Quotas for Google Services | 2026-10-28 |
GmailApp.search(query) がスレッドの量が多すぎると失敗することがあり、件数が分からないときは search(query, start, max) で範囲を指定して取るよう案内されていること。getUserLabelByName でラベルを取れること | Google for Developers: Class GmailApp | 2026-10-28 |
UrlFetchApp.fetch に method・contentType・headers・payload を渡せ、muteHttpExceptions を true にすると失敗の応答でも例外を投げないこと | Google for Developers: Class UrlFetchApp | 2026-10-28 |
構造化出力を output_config.format に type: "json_schema" で指定すること。enum が使え、値の大文字・小文字が違って返ることがあること。数値の範囲の制約は非対応で400になること。max_tokens で止まると出力がスキーマに合わないことがあること | Claude API Docs: Structured outputs | 2026-10-28 |
配達のルートの組み直しや、品切れのときにどの店を優先するかは、配車の担当と営業で決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2217)についてのご相談はこちらから。
