配送ドライバーが出す日報の自由記述を、荷主・納品先・道路・車両・荷物の問題に分類し、週ごとの件数と対応が要るものを配車担当に届ける
配送ドライバーが Google フォームで出す日報の自由記述を、荷主・納品先・道路・車両・荷物の問題に分類します。車両の不具合など対応が要るものはその日のうちに配車担当へ知らせ、週ごとに荷主・納品先別の件数をまとめます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Zapier
- 対象業界
- 小売/物流/製造
- 対象部門
- 物流
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/情報が見つからない/期限・対応漏れが起きる
- AIで行う処理
- 分類
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- ドライバーが乗務の後に日報のフォームを出す
- 配車担当が、回答のスプレッドシートを開いて自由記述を上から読む
- 車両の不具合が書かれていれば、整備の担当に知らせる
- 荷待ちや納品先の事情が書かれていれば、別のシートに荷主名・納品先名と一緒に書き写す
- 週に1回、書き写したシートを荷主ごと・納品先ごとに数えて、課長に報告する
- 人ドライバーが乗務の後に日報のフォームを出す
- 自動回答がスプレッドシートに入ったことで Apps Script が動く
- 自動自由記述が「特になし」などでなければ、Claude API に分類を頼む
- 自動区分・荷主名・納品先名・要約を、回答の行の右の列に書く
- 自動荷主名・納品先名を、名寄せの一覧で正式な名前に直す
- 自動区分ごとの規則で「対応が要る」と決まったものを、配車担当にメールで知らせる
- 自動毎週月曜の朝に、前の週の区分ごと・荷主ごと・納品先ごとの件数をまとめて送る
- 人配車担当が、知らせの来たものだけを読み、整備の担当や荷主の窓口へつなぐ
- 人配車担当が、週ごとの件数を見て、課長と荷主への話を準備する
各工程の詳しい説明を読む
- ドライバーが乗務の後に日報のフォームを出す
- 配車担当が、回答のスプレッドシートを開いて自由記述を上から読む
- 車両の不具合が書かれていれば、整備の担当に知らせる
- 荷待ちや納品先の事情が書かれていれば、別のシートに荷主名・納品先名と一緒に書き写す
- 週に1回、書き写したシートを荷主ごと・納品先ごとに数えて、課長に報告する
(a)読み切れない。 配車担当は、翌日の配車を組む夕方に日報を読みます。配車の電話が続く日は、日報を開かないまま次の日になります。 2日分たまると、もう全部は読みません。
(b)車両の不具合が埋もれる。 「ブレーキの効きが少し甘い気がする」が、「今日は渋滞がひどかった」の間に書かれています。読まれなかった日報の中に、車両の報告が残っていることがあります。 ドライバーは書いたので伝わったと思い、配車担当は読んでいないので知りません。
(c)書き写すときに名前がそろわない。 同じ荷主のセンターが、「A社」「A社の厚木」「厚木センター」と書かれます。数えるときに名寄せをしないと、荷待ちの件数が3つに割れます。
(d)同じ問題が繰り返し書かれても気づかない。 同じ納品先の「置き場が無い」が、別々のドライバーから週に何度も書かれています。1件ずつ読んでいる限り、それが同じ問題の繰り返しだとは分かりません。
(e)数字が荷主に出せる形にならない。 手で数えた件数は、どの日報から数えたかが残りません。荷主に「荷待ちが多い」と伝えても、根拠を示せずに話が終わります。
- 【人】 ドライバーが乗務の後に日報のフォームを出す
- 【自動】 回答がスプレッドシートに入ったことで Apps Script が動く
- 【自動】 自由記述が「特になし」などでなければ、Claude API に分類を頼む
- 【自動】 区分・荷主名・納品先名・要約を、回答の行の右の列に書く
- 【自動】 荷主名・納品先名を、名寄せの一覧で正式な名前に直す
- 【自動】 区分ごとの規則で「対応が要る」と決まったものを、配車担当にメールで知らせる
- 【自動】 毎週月曜の朝に、前の週の区分ごと・荷主ごと・納品先ごとの件数をまとめて送る
- 【人】 配車担当が、知らせの来たものだけを読み、整備の担当や荷主の窓口へつなぐ
- 【人】 配車担当が、週ごとの件数を見て、課長と荷主への話を準備する
6番目が、この設計の分かれ目です。 知らせるかどうかは AI ではなく、区分ごとの規則で決めます。 車両の区分は全件、荷物の区分は破損と数量違いのとき、などです。AI が「軽い」と読んでも、車両の報告は必ず人に届きます。
8番目で人が読むのは、知らせの来たものだけです。 それ以外は、週ごとの件数の中で見ます。
ドライバーの側は何も変わりません。 フォームの設問も出し方もいまのままです。書いたことが読まれるようになるだけなので、導入にあたってドライバーへの説明はほとんど要りません。
02今回想定するシステム構成
ドライバーが日報のフォームを出す(スマートフォン) │ 回答はスプレッドシートに入る ▼【トリガー】フォーム送信のインストール型トリガー(スプレッドシート) Google Apps Script ├──▶ 自由記述が空・「特になし」なら何もしない ├──▶ Claude API(構造化出力) │ 区分・荷主名・納品先名・要約・根拠の文 ├──▶ 名寄せの一覧で荷主名・納品先名を正式な名前に直す ├──▶ 回答の行の右の列に書く └──▶ 区分ごとの規則で「対応が要る」なら MailApp で配車担当へ ▼【トリガー】毎週月曜の朝(時間主導型トリガー) Google Apps Script ── 前の週の件数をまとめ、週次のシートとメールで届ける
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Make、Zapier |
| 生成AI | Claude API(構造化出力) | Gemini API、OpenAI API |
| 保管 | Google スプレッドシート(回答、名寄せの一覧、週次のシート) | - |
| 通知 | Gmail(MailApp) | Google Chat |
新しく足すのは、Apps Script と名寄せの一覧と週次のシートだけです。 フォームと回答のスプレッドシートはいまのものを使います。配車表と運行の記録には、この構成から書き込みません。
Apps Script は、スプレッドシートに付けるスクリプトとして書きます。 フォームの回答が入ったときに動くフォーム送信のインストール型トリガーと、毎週決まった時刻に動く時間主導型のトリガーの2つを使います。インストール型のトリガーは、作った人のアカウントで動きます。 配車課の共有のアカウントで作るか、担当者が異動したときに作り直す手順を決めておきます。
AI の処理は Claude API の構造化出力で行います。 Messages API の output_config.format に type: "json_schema" と JSON Schema を渡すと、その形に合う JSON が返ります。 Claude API では正式提供で、ベータのヘッダは要りません。オブジェクトには additionalProperties: false が必要で、enum が使えます。区分を enum で縛るのに使います。
03どうやって実装するのか
処理の起点を決める
フォームの回答がスプレッドシートに入ったことを起点にします。 スプレッドシートに付けたスクリプトで、フォーム送信のインストール型トリガーを作ります。回答1件ごとに動き、その行の自由記述だけを分類します。
1日1回まとめて分類する形にしないのは、車両の報告のためです。 夕方に出た日報で「ブレーキの効きが甘い」と書かれていれば、翌朝その車が出る前に整備の担当が見る必要があります。 まとめて夜中に分類すると、知らせが翌朝の出庫に間に合わないことがあります。
週ごとの集計は、時間主導型のトリガーで毎週月曜の朝に動かします。 ScriptApp.newTrigger() に timeBased()・onWeekDay()・atHour() を続けて作ります。公式のページでは、時刻は少しずれることがあり、たとえば9時に設定すると9時から10時のあいだの時刻が選ばれ、その時刻が日をまたいで保たれるとされています。月曜の朝の打ち合わせの前に届けばよいので、7時台に設定します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 日報の回答 | 提出日時、ドライバー、車番、運行日、配送した荷主(選択式)、自由記述 | 回答のスプレッドシート |
| 名寄せの一覧 | 荷主と納品先の正式な名前と、ドライバーが書きがちな別名 | 名寄せの一覧(シート) |
| 区分の定義 | 区分ごとの説明と、典型的な書き方の例 | 区分の定義(シート) |
| 知らせの規則 | 区分ごと・小区分ごとに、配車担当へ知らせるかどうか | 規則の一覧(シート) |
質を決めるのは、名寄せの一覧です。 「A社の厚木」「厚木センター」「厚木DC」を1つの正式な名前に結べなければ、週ごとの件数が割れて、第3章の(c)がそのまま残ります。 最初は配車担当が知っている別名を書き出すところから始め、unknown_name で返ってきた名前を週ごとに足していきます。
配送した荷主の選択式の欄も、AI への入力に入れます。 自由記述に「センターで2時間待ち」としか書かれていなくても、その日に回った荷主が1社なら、どこのセンターかが決まります。 ただし、2社以上なら決めつけさせません。
データの取得方法を決める
フォーム送信のトリガーは、回答の行の値をイベントとして渡します。 スクリプトはその値から自由記述と荷主の欄を取り出し、同じ行の右の列に結果を書きます。 シートを上から読み直す必要はありません。
| 取るもの | どこから | どう取るか |
|---|---|---|
| 自由記述・荷主・運行日 | フォーム送信のイベント | イベントの値から取り出す |
| 名寄せの一覧・区分の定義・知らせの規則 | 各シート | 1回の実行の最初に読む |
| 前の週の分類の結果 | 回答のスプレッドシートの右の列 | 週次のトリガーで運行日の範囲を絞って読む |
API キーはスクリプトに直接書きません。 スクリプトのプロパティに置き、実行時に読みます。スクリプトを人に見せたときにキーが漏れないようにするためです。
フォーム送信のトリガーで動く関数は、次の順で処理します。
1. イベントから、行の番号・自由記述・その日の荷主・運行日を取り出す
2. 自由記述が空か「特になし」だけなら、区分に none と書いて終わる
3. 名寄せの一覧・区分の定義・知らせの規則を読む
4. Claude API を呼び、JSON を受け取る(失敗したら「未分類」と書いて終わる)
5. 荷主名・納品先名を名寄せの一覧で正式な名前に直す
6. 行の右の列に、区分・名前・待ち時間・要約・根拠の文を書く
7. 規則の一覧と車両の語の一覧を見て、知らせるなら MailApp で送り、送った日時を書く
6番目の書き込みを、7番目の送信より先にしているのは意図してのことです。 送信が失敗しても、分類の結果は行に残ります。知らせの列が空のまま区分が vehicle の行は、拾い直しの処理で送り直せます。
Claude API は UrlFetchApp で呼びます。 送り先は Messages API で、ヘッダに API キーと API のバージョンを付け、本文に区分の定義・自由記述・output_config を入れます。Apps Script の公式の割り当てでは、URL Fetch の呼び出しは一般のアカウントで1日2万回、Google Workspace のアカウントで1日10万回で、月600件には十分です。
AIへ渡す前に整形する
- 空と「特になし」を除く … 自由記述が空、または「特になし」「なし」「異常なし」だけのものは API を呼びません。区分は
noneとして書き、件数には数えます - 前後の空白と絵文字を落とす … 分類に要らない文字を除きます
- 荷主の選択式の値を添える … その日に回った荷主の一覧を渡します
- 名寄せの一覧の別名を添える … AI が荷主名・納品先名を抜き出すときの手がかりにします
- 運行日を確かめる … 提出日と運行日が2日以上離れているものは、前の日の日報の出し直しかもしれません。分類はしたうえで、週ごとの集計では運行日の週に数えます
- 長さを確かめる … 自由記述が極端に長いもの(たとえば2,000字を超える)は、分類はしたうえで人の確認の印を付けます
1番目で API を呼ばない分が、費用の多くを占めます。 月1,200件の日報のうち半分は「特になし」で、呼ばなくても分類の結果は決まっています。
AIに処理させる
させるのは、自由記述を区分に分けることと、荷主名・納品先名・短い要約・根拠の文を抜き出すことです。
| 区分 | 中身の例 | 小区分 |
|---|---|---|
shipper 荷主 | 荷待ち、荷役の手伝い、積み込みの指示の変更 | 荷待ち/荷役/指示の変更/その他 |
consignee 納品先 | 受付時間の変更、置き場が無い、不在、検品の待ち | 時間/置き場/不在/検品/その他 |
road 道路 | 渋滞、通行止め、工事、駐車の場所が無い | 渋滞/通行止め/駐車/その他 |
vehicle 車両 | 異音、警告灯、ブレーキ、タイヤ、ミラー、荷台の設備 | (小区分なし。すべて知らせる) |
cargo 荷物 | 破損、数量違い、梱包の崩れ、温度 | 破損/数量違い/梱包/温度/その他 |
none 特になし | 問題の記述が無い | - |
1件の自由記述に、区分が2つ以上あることを許します。 「A社で1時間待ち、その後の国道が通行止め」は shipper と road です。1つに絞らせると、件数が片方に寄ります。
荷主名・納品先名は、書かれたとおりに抜き出させます。 正式な名前に直すのは、スクリプトが名寄せの一覧で行います。AI に直させると、一覧に無い名前をそれらしい名前に寄せてしまいます。
| させないこと | 理由 |
|---|---|
| 対応が要るかの判断 | 区分ごとの規則で決める。車両は全件 |
| 車両の不具合の軽重の判断 | 整備の担当が見る |
| 荷主名を正式な名前に直す | 名寄せの一覧で行う |
| 待ち時間の長さを推し量る | 書かれていなければ空にする |
| ドライバーの書き方の良し悪しを書く | 日報の目的ではない |
2行目が、この構成でいちばん守るべきことです。 「少し」「気がする」と書かれた車両の報告を、AI は軽いものとして要約しがちです。区分が vehicle であれば、要約の言い方にかかわらず配車担当に届けます。
指示内容を固定する
あなたは運送会社の配車課で、配送ドライバーの日報の自由記述を分類する立場です。
自由記述に書かれていることだけを使い、区分に分けてください。
【区分】
- shipper:荷主の都合による問題(荷待ち、荷役、積み込みの指示の変更)
- consignee:納品先の都合による問題(受付時間、置き場、不在、検品の待ち)
- road:道路の問題(渋滞、通行止め、工事、駐車の場所)
- vehicle:車両の問題(異音、警告灯、ブレーキ、タイヤ、ミラー、荷台の設備)
- cargo:荷物の問題(破損、数量違い、梱包の崩れ、温度)
- none:問題の記述が無い
1件に複数の区分があれば、すべて挙げてください。
【抜き出す項目】
- categories:区分の一覧と、それぞれの小区分
- shipper_name・consignee_name:書かれたとおりの名前。無ければ空
- wait_minutes:待ち時間が数字で書かれていれば分に直す。無ければ null
- summary:問題を1文で。書かれていない事情を足さない
- evidence:区分の根拠にした文をそのまま写す
【厳守事項】
- 車両について少しでも書かれていれば vehicle を挙げてください。
「気がする」「少し」でも、軽いものとして外さないでください。
- 荷主名・納品先名を正式な名前に直したり、似た名前に寄せたりしないでください。
- その日に回った荷主が1社だけなら、「センター」とだけ書かれた待ちを
その荷主のものとしてよいです。2社以上なら shipper_name は空にしてください。
- 待ち時間が「長かった」など数字でないときは、wait_minutes を null にしてください。
- 対応が要るか、急ぐかは書かないでください。
【区分の定義と例】{category_definitions}
【名寄せの一覧の別名】{alias_hints}
【その日に回った荷主】{shippers_of_day}
【自由記述】{free_text}
「軽いものとして外さないでください」を書くのは、要約の性質のためです。 AI は短くまとめるときに、程度の弱い記述を落とします。車両の記述が落ちると、その日報は none になり、誰の目にも入りません。
「2社以上なら空」も要ります。 書かなければ、最初に挙がった荷主を当てはめます。荷待ちの件数が別の荷主に付くと、荷主との話し合いの根拠が崩れます。
出力形式を固定する
構造化出力で、次の形の JSON を受け取ります。
{
"categories": [
{ "category": "shipper | consignee | road | vehicle | cargo | none",
"subcategory": "" }
],
"shipper_name": "",
"consignee_name": "",
"wait_minutes": null,
"summary": "",
"evidence": ""
}
スキーマでは category を enum で縛り、オブジェクトに additionalProperties: false を付けます。区分に無い語が返ってこないので、集計の関数が崩れません。
1つ目の理由は、区分で知らせの規則を引けることです。 スクリプトは categories を見て、規則の一覧から知らせるかどうかを決めます。自由文で返させると、「車両」が文中にあるかを探す処理になり、言い換えで漏れます。
2つ目は、回答の行の右の列にそのまま並べられることです。
| 列 | 中身 |
|---|---|
| 区分 | vehicle, road のように並べる |
| 小区分 | 区分ごとの小区分 |
| 荷主(書かれたとおり)・荷主(正式) | AI の出力と、名寄せの結果 |
| 納品先(書かれたとおり)・納品先(正式) | 同上 |
| 待ち時間(分) | 数字で書かれていたときだけ |
| 要約・根拠の文 | AI の出力 |
| 知らせ | 送った日時。送っていなければ空 |
| 確認 | 配車担当の確認の結果 |
3つ目は、書かれたとおりの名前と正式な名前を両方残せることです。 名寄せの一覧に無い名前は正式の列が空になり、週ごとに一覧へ足す候補として拾えます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 回答のスプレッドシート | フォーム送信のインストール型トリガー | 回答の行を受け取り、右の列に結果を書く |
| Claude API | UrlFetchApp で Messages API を呼ぶ | 区分と項目を構造化出力で返す |
| 名寄せの一覧・規則の一覧 | スプレッドシートの読み取り | 正式な名前と、知らせるかどうか |
| 配車担当 | MailApp | 対応が要るものを1件ずつ知らせる |
| 週次のシート | 時間主導型トリガー | 前の週の件数を書き、要約をメールで送る |
MailApp で送れる宛先の数には、1日の上限があります。 公式の割り当てでは、一般のアカウントで1日100、Google Workspace のアカウントで1日1,500の宛先です。知らせは配車課の共有アドレス1つに送るので、上限に近づくことはありません。
週次のメールには、件数の表と週次のシートへのリンクを載せます。 荷主ごと・納品先ごとの件数、荷待ちの合計の分、車両の報告の件数を並べます。根拠の日報は、週次のシートから回答の行へたどれます。
人が確認する
人が確かめるのは、知らせの来たものと、週ごとの件数です。
- 知らせを読む … 車両の報告は、整備の担当にその日のうちに回します。翌朝の出庫の前に見てもらいます
- 荷物の破損・数量違いを荷主の窓口へつなぐ … 荷主との連絡は配車担当が行います
- 週ごとの件数を見る … 荷待ちの多い荷主・センター、受付時間の変わった納品先を拾います
- 名寄せの一覧を足す … 正式の列が空の名前を一覧に足します
- 区分の誤りを直す … 誤りに気づいたら、右の列の区分を直し、確認の列に記録します
整備の担当に回した車両の報告は、結果を確認の列に書きます。 「点検して異常なし」「部品を交換」などです。同じ車番の報告が続くなら、その記録が整備の判断の材料になります。
知らせの来ないものは、1件ずつは読みません。 road の渋滞のように、週ごとの件数で見れば足りるものが大半だからです。ただし、最初の1か月は全件の分類の結果を流し見て、none に落ちたものの中に車両の記述が無いかを確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
| API の応答が返らない・エラー | 右の列に「未分類」と書き、時間主導型のトリガーで1時間ごとに未分類を拾い直す |
| 応答が途中で切れ、JSON として読めない | 「未分類」にして拾い直しに回す |
区分が none なのに車両の語がある | 規則の一覧に「ブレーキ」「警告灯」などの語を持ち、語があれば区分にかかわらず知らせる |
| 荷主名が名寄せの一覧に無い | 正式の列を空にし、週次のメールに「未登録の名前」として並べる |
| 1回の実行が6分を超えそう | フォーム送信では1件ずつなので起きない。拾い直しの処理は1回の件数を絞る |
| 同じ日報が二度出された | 同じドライバー・同じ運行日の行があれば、後の行に印を付けて集計から外す |
| トリガーを作った人が異動した | トリガーはその人のアカウントで動く。作り直す手順を決めておく |
3行目は、AI の分類に頼らない安全弁です。 車両の報告を漏らすことが、この構成でいちばん重い失敗です。語の一覧での拾い上げを、AI の区分と並べて持ちます。
5行目は、Apps Script の1回の実行が6分までという制限から来ます。 回答1件ごとの処理は数秒で終わりますが、未分類の拾い直しで溜まった件数を一度に回すと届きます。1回あたりの件数に上限を置きます。
記録を残す
- 日報の回答そのもの(回答のスプレッドシート)
- AI の出力(区分、項目、要約、根拠の文)と、そのときの区分の定義と知らせの規則の版
- 名寄せの前と後の名前
- 知らせを送った日時と宛先
- 配車担当が区分を直した記録 … どの行を、どの区分からどの区分へ変えたか
- 週次の件数(週次のシートに残す)
2つ目で区分の定義の版を残すのは、区分を後から足すためです。 たとえば consignee に「検品の待ち」を足した週から、件数の数え方が変わります。荷主に週ごとの推移を示すときに、定義の変わり目を説明できるようにします。
5つ目は、指示の見直しの材料です。 直された区分が特定の書き方に偏っていれば、区分の定義の例にその書き方を足します。
04実装レベルの3段階
本記事の想定は半自動化です。 1件3分のうち、読んで区分を見分ける作業・書き写す作業・週ごとに数える作業が自動になり、配車担当に残るのは知らせの来たものへの対応と、週ごとの件数の確認と、名寄せの一覧の手入れです。 半自動化を1か月回すと、名寄せの一覧の穴と、区分の定義の曖昧なところが見えてきます。 正式の列が空の名前と、配車担当が直した区分を数え、それが落ち着いてから本格構成に進みます。 本格構成で足すのは、荷待ちの時間の裏付けです。 自由記述の待ち時間は、ドライバーの書き方しだいで数字が無いこともあります。運行の記録の時刻と突き合わせれば、書かれていない待ちも数えられます。 ただし、それは日報の分類とは別の仕組みで、運行の記録の取り方によります。
05工数削減シミュレーション
導入後 600件 × 1分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十人の配送ドライバーを抱える運送会社や、自社便を持つメーカー・小売の物流部門。ドライバーが Google フォームで日報を出しており、自由記述に荷待ち・納品先の事情・車両の不具合などが書かれているのに、配車担当が読み切れていない場合。荷主との交渉や配送ルートの見直しに、問題の件数を根拠として使いたい場合。Google Workspace を使っている場合。
- ドライバーが数名で、配車担当が毎日全件を読める場合。日報が紙で、Google フォームに移す予定が無い場合。運行管理のシステムに日報と分類の機能があり、そこで集計できている場合。なお、車両の不具合への対処、運行の可否の判断、荷主との交渉は、この構成では代替できません。
07最小構成で試す方法
- 先月の日報から、自由記述のある100件を選ぶ(車両の報告が書かれたものを必ず入れる)
- その100件を、配車担当が手で区分に分けておく
- 自由記述を20件ずつ、手元のAIサービスの画面に区分の定義と一緒に貼り付ける
- 「それぞれの記述を、荷主・納品先・道路・車両・荷物・特になし に分けてください。複数あればすべて挙げてください。車両について少しでも書かれていれば車両を挙げてください。荷主名と納品先名は書かれたとおりに抜き出してください」と指示する
- 出てきた区分を、配車担当が手で分けた区分と突き合わせる
車両の報告の取りこぼしを最優先で見てください。 100件のうち、手で vehicle にしたものが AI でも vehicle になっているかを1件ずつ確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 手で分けた区分とおおむね同じ | Apps Script の組み立てに進む |
| 車両の軽い記述が落ちた | 指示の書き方で直る。語の一覧での拾い上げも併せて作る |
| 荷主と納品先の取り違えが多い | 区分の定義の例を足すのが先。 「センター」が荷主か納品先かを社内で決める |
100件を手で分けるのは手間ですが、省かないでください。 手で分けた結果が、そのまま区分の定義の例になります。配車担当3名で分け方が割れた記述は、区分の定義が曖昧なところです。
3行目は、社内の言葉の問題であることが多いです。 荷主の物流センターに納品する仕事では、同じ「センター」が荷主にも納品先にもなります。 どちらで数えるかを先に決めてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
車両の軽い記述が none になる | 「少しでも書かれていれば vehicle」と指示し、語の一覧でも拾う |
| 区分を1つに絞ってしまう | 複数の区分を許すスキーマにする |
| 荷主名を似た名前に寄せる | 書かれたとおりに抜き出させ、名寄せはスクリプトで行う |
| 回った荷主が2社以上の日に、待ちを1社に付ける | 2社以上なら空にすると指示する |
| 「センター」が荷主か納品先か割れる | 社内で決め、区分の定義の例に書く |
| スキーマで 400 が返る | オブジェクトに additionalProperties: false を付ける。 数値の範囲の制約は使わない |
| API キーがスクリプトに書かれている | スクリプトのプロパティに置く |
| 異動でトリガーが止まる | 共有のアカウントで作るか、作り直す手順を決める |
| 拾い直しで6分を超える | 1回あたりの件数に上限を置く |
| 「特になし」の言い方が多様で API を呼んでしまう | 「異常なし」「問題なし」など、除く語の一覧を持つ |
| 運行日と提出日がずれて週をまたぐ | 集計は運行日で行う |
| 毎朝の時刻が少しずれる | 時間主導型のトリガーは1時間の幅で動く。会議の前に余裕を持たせる |
6行目は、構造化出力を初めて使うときに必ず一度は当たります。 スキーマのすべてのオブジェクトに additionalProperties: false を付け、minimum などの数値の制約を書かないことです。待ち時間を0以上に縛りたくなりますが、スキーマではなくスクリプトの側で確かめます。
上の2行が、この構成の失敗のほとんどです。 どちらも、車両の報告と荷待ちの件数という、この構成が届けるべき2つを落とす失敗です。分類の質より先に、落とさない仕組みを作ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: ドライバーの名前、車番、運行日、荷主名と納品先名、自由記述に書かれた現場の事情(荷主や納品先の担当者の名前が書かれることもあります)です。
- AI に渡す範囲を絞る … Claude API に渡すのは、自由記述・その日の荷主の一覧・区分の定義・別名の一覧だけです。ドライバーの名前と車番は渡しません。 結果は行に書くので、誰の日報かは渡さなくても分かります
- 荷主との契約の守秘を確かめる … 荷主名と納品先名、現場の事情を外部の AI に渡してよいかは、荷主との契約の守秘の取り決めによります。 導入の前に確かめます
- 車両の報告の扱いを AI に任せない … 知らせるかどうかは区分と語の一覧で決め、軽重の判断と整備の要否は整備の担当が行います
- 件数をドライバーの評価に使わない … 週ごとの件数は、荷主・納品先・道路の問題を見るためのものです。誰がよく書くかで人を評価すると、書かれなくなります
- 自由記述に書かれた個人の名前を広げない … 納品先の担当者の名前が書かれていても、週次のメールには載せません。要約にも名前を残さないよう、区分の定義に書き添えます
- 週次のシートの閲覧者を絞る … 荷主ごとの荷待ちの件数は、荷主との話し合いの材料です。配車課と課長、営業の担当に限ります
誤りが起きた場合のリスクは、車両の報告を見落とすことと、荷待ちの件数を別の荷主に付けることの2つです。 前者は区分の取りこぼしから、後者は名前の決めつけから起きます。前者は語の一覧との二重で、後者は「書かれたとおりに抜き出し、名寄せはスクリプトで」の分け方で防ぎます。
10まず何から始めるか
1週目:区分の定義と名寄せの一覧を作る
配車担当3名で、6つの区分の説明と典型的な書き方の例を1枚にします。整備の担当にも見てもらい、車両の語の一覧の下書きを作ります。「センター」を荷主と納品先のどちらで数えるかを、ここで決めます。 荷主のセンターと主な納品先の別名を書き出します。
2週目:100件で試す
先月の日報から100件を選び、手で区分に分けたうえで、手元のAIサービスで分類させます。車両の報告が1件も落ちていないかを最優先で見ます。
3週目:Apps Script をつなぐ
フォーム送信のトリガー、Claude API の呼び出し、右の列への書き込みを作ります。この時点では知らせを送らず、配車担当が右の列を毎日流し見ます。 車両の語の一覧もここで作ります。
4週目:知らせと週次の集計を足す
規則の一覧を作り、対応が要るものの知らせを送ります。毎週月曜の朝の集計のトリガーを作り、初回の週次のメールを課長と一緒に見ます。
2か月目: 名寄せの一覧に未登録の名前を足し、配車担当が区分を直した件数を毎週数えます。3か月目以降: 1件3分が何分になったかを実測し、荷待ちの件数を荷主との定例の話し合いに出せる形になった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
インストール型のトリガーに時間主導型とフォーム送信(スプレッドシート用とフォーム用)があること。ScriptApp.newTrigger() に timeBased()・onWeekDay()・atHour() を続けて週ごとのトリガーを作れること。時刻が少しずれることがあり、9時の設定で9時から10時のあいだの時刻が選ばれ保たれること。インストール型のトリガーが作った人のアカウントで動くこと | Google Apps Script: Installable Triggers | 2026-10-08 |
| URL Fetch の呼び出しが一般のアカウントで1日2万回、Google Workspace で1日10万回であること。MailApp の宛先が一般のアカウントで1日100、Google Workspace で1日1,500であること。1回の実行が6分までであること。トリガーの合計の実行時間が一般で1日90分、Google Workspace で1日6時間であること | Google Apps Script: Quotas for Google Services | 2026-10-08 |
Messages API の output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに合う JSON が返ること。Claude API で正式提供でベータのヘッダが要らないこと。enum が使えること。オブジェクトに additionalProperties: false が必要なこと。minimum・maximum などの数値の制約が使えず、使うと 400 が返ること | Claude API Docs: Structured outputs | 2026-10-08 |
区分の定義と知らせの規則は、自社の配車と整備の取り決めに合わせて決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1004)についてのご相談はこちらから。
