倉庫の入出荷の件数と作業人員・作業時間から作業別の生産性を毎日集計し、下がった作業と理由の候補をセンター長への日報にまとめる
倉庫の作業の記録と作業人員の記録から、入荷・ピッキング・梱包などの作業別の生産性を毎日集計します。下がった作業について、記録から読める理由の候補を並べ、センター長への日報の文章にまとめます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- EC/小売/物流/製造
- 対象部門
- 物流
- 対象業務
- 書類作成/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 要約
- 主な効果
- 判断支援/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 業務課の担当者が、毎朝、WMSから前日の作業別の処理量(行数・ケース数)をCSVで出す
- 勤怠のシステムと割り振り表から、作業ごとの投入人時を数える
- スプレッドシートに貼り、作業ごとに処理量 ÷ 人時で生産性を出す
- 先週と先々週の同じ曜日の数字を探して並べる
- 下がった作業について、リーダーに理由を聞きに行くか、リーダーのメモを読む
- センター長への日報に、数字と理由を文章で書く
- 人リーダーが、その日のうちに割り振り表に作業の移動と、特記事項のメモ(設備の停止、入荷の遅れ、欠勤)を書く
- 自動夜間に WMS と勤怠のシステムから前日のCSVを出し、決まったフォルダに置く
- 自動毎朝6時台に Google Apps Script が動き、CSVと割り振り表を読み込む
- 自動作業ごとに処理量・投入人時・生産性を計算し、同じ曜日の直近4週の中央値と比べる
- 自動下がった作業について、物量の構成、新人の比率、作業の空白の時間、入荷の遅れを計算する
- 自動Gemini API に数字とメモを渡し、理由の候補と日報の文章を構造化した形で受け取る
- 自動業務課の担当者に日報の下書きを届ける
- 人担当者がリーダーに理由の候補を確かめ、直して確定する
- 自動確定した日報をセンター長に送り、記録のシートに残す
各工程の詳しい説明を読む
- 業務課の担当者が、毎朝、WMSから前日の作業別の処理量(行数・ケース数)をCSVで出す
- 勤怠のシステムと割り振り表から、作業ごとの投入人時を数える
- スプレッドシートに貼り、作業ごとに処理量 ÷ 人時で生産性を出す
- 先週と先々週の同じ曜日の数字を探して並べる
- 下がった作業について、リーダーに理由を聞きに行くか、リーダーのメモを読む
- センター長への日報に、数字と理由を文章で書く
(a)集計に毎日1時間以上かかる。 2番目の投入人時の数え方が手作業で、途中で作業を移った人の時間を分けるのに時間がかかります。 忙しい日ほど集計が後回しになり、日報が昼過ぎになります。
(b)理由がリーダーの記憶にしか無い。 5番目で聞きに行っても、リーダーは前日の現場を思い出して話すだけです。「入荷が遅れたから」という説明が、実際にトラックが何分遅れたのかの記録と合っていないことがあります。
(c)比べる相手が日によって違う。 4番目で、担当者によって「先週の同じ曜日」と比べたり「先月の平均」と比べたりします。同じ数字が、ある日は「下がった」、ある日は「いつもどおり」と書かれます。
(d)日報が読まれない。 5つの作業の数字がすべて並び、文章も毎日同じ型です。センター長が知りたいのは、どの作業が、なぜ、どれだけ下がったかだけです。
- 【人】 リーダーが、その日のうちに割り振り表に作業の移動と、特記事項のメモ(設備の停止、入荷の遅れ、欠勤)を書く
- 【自動】 夜間に WMS と勤怠のシステムから前日のCSVを出し、決まったフォルダに置く
- 【自動】 毎朝6時台に Google Apps Script が動き、CSVと割り振り表を読み込む
- 【自動】 作業ごとに処理量・投入人時・生産性を計算し、同じ曜日の直近4週の中央値と比べる
- 【自動】 下がった作業について、物量の構成、新人の比率、作業の空白の時間、入荷の遅れを計算する
- 【自動】 Gemini API に数字とメモを渡し、理由の候補と日報の文章を構造化した形で受け取る
- 【自動】 業務課の担当者に日報の下書きを届ける
- 【人】 担当者がリーダーに理由の候補を確かめ、直して確定する
- 【自動】 確定した日報をセンター長に送り、記録のシートに残す
8番目で人が確かめるのは、下がった作業の理由だけです。 下がっていない作業は数字だけを載せ、所見は書きません。5つの作業のうち、毎日見直すのは1〜2作業という想定です。
理由を確定させるのはリーダーです。 AIが並べるのは記録から読める候補で、現場で何が起きたかを知っているのは、その場にいた人だけです。
日報の形も変わります。 5つの作業の数字は表にまとめ、文章は下がった作業についてだけ書きます。下がった作業が無い日は、表と「いつもの水準どおり」の1行だけになります。
02今回想定するシステム構成
WMS(作業別の処理量・スキャンの時刻) 勤怠(出退勤) 割り振り表(作業の移動・メモ) │ CSVを毎晩出力 │ CSV │ スプレッドシート ▼ ▼ ▼ 共有ドライブの受け渡しフォルダ ─────────────────────────────┘ ▼【トリガー】毎朝 6時台 Google Apps Script ├──▶ 作業ごとの処理量・投入人時・生産性の計算 ├──▶ 同じ曜日の直近4週の中央値との比較(下がった作業の抽出) ├──▶ 理由の材料の計算(物量の構成・新人の比率・空白の時間・入荷の遅れ) ▼ Gemini API ── 構造化出力 │ ① 下がった作業ごとの理由の候補と根拠 │ ② センター長向けの3行の要約 ▼ Google Apps Script ── 数字の突き合わせ(AIの書いた数字が入力と一致するか) ├──▶ Gmail(業務課の担当者へ下書き) └──▶ 記録のシート ▼ 【人】担当者とリーダーが理由を確定 → センター長へ送信
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Python、Power Automate、Make |
| 生成AI | Gemini API | Claude API、OpenAI API |
| 台帳 | Google スプレッドシート(割り振り表・作業の基準・記録) | Microsoft Lists |
| メール | Gmail(センターの業務課のアカウント) | Outlook |
新しく足すのは、スクリプトと Gemini API の利用だけです。 WMSと勤怠のシステムからはCSVを出すだけで、システムには手を入れません。最初の準備作業は、割り振り表の書き方をそろえることです。 作業の移動を「誰が・何時に・どの作業からどの作業へ」の1行1件で書くようにします。今のように1人の行に時刻を書き足していく形では、スクリプトで読めません。
実行環境は Google Apps Script です。 時間主導型のトリガーで、毎分から月1回までの間隔で動かせます。時刻は1時間の幅の中で選ばれるため、6時台に置けば、センター長の出社前に日報の下書きができています。
AIの出力の形は、Gemini API の構造化出力で固定します。 response_format に mime_type を application/json とした形を指定し、スキーマを渡します。スキーマには enum、required などが使えます。ただし、出力は構文として正しいJSONでも、値は必ずアプリの側で確かめるべきとされています。 第7章で、数字を入力と突き合わせる理由です。
03どうやって実装するのか
処理の起点を決める
毎朝6時台の時間主導型のトリガーで、前日の1日分をまとめて処理します。 作業の途中で何度も動かすことはしません。生産性は1日の締めの数字で比べるもので、昼の時点の数字で「下がった」と知らせても、午後に取り戻すことがあるからです。
動き始めたら、まずCSVの基準日を確かめます。 WMSと勤怠のCSVが前日の分でなければ、計算を始めずに担当者へ「前日分が届いていない」とだけ送ります。割り振り表も、前日の分にリーダーの記入があるかを見ます。 記入が空の日は、投入人時を勤怠だけで数えたことを日報に明記します。
休日の翌朝は、休日の分を処理しません。 稼働日の一覧をシートに持ち、稼働日だけを処理します。稼働しなかった日を「生産性0」として基準に混ぜると、翌週から全作業が「上がった」と出ます。
トリガーは業務課の共有の管理用アカウントで作ります。 インストール型のトリガーは作った人のアカウントで動き、失敗したときには失敗をまとめたメールがその人に届きます。担当者が休みでも止まらないように、個人のアカウントでは作りません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 作業の実績 | 作業区分、作業者ID、処理量(行数・ケース数)、スキャンの時刻 | WMSのCSV |
| 出荷の明細 | 出荷番号、行数、単品か複数品か、出荷先の区分(通販・店舗) | WMSのCSV |
| 出退勤 | 作業者ID、出勤・退勤・休憩の時刻 | 勤怠のCSV |
| 割り振り | 作業者ID、作業区分、開始と終了の時刻、リーダーのメモ | 割り振り表 |
| 作業者の属性 | 作業者ID、入社日(経験の月数)、派遣か社員か | 作業者の一覧 |
| 入荷の予定と実績 | 便ごとの到着の予定時刻と実際の時刻 | 入荷の記録のシート |
| 過去の記録 | 作業ごとの過去の生産性、確定した理由 | 記録のシート |
質を決めるのは、割り振りの記録です。 処理量はWMSに正確に残りますが、分母の人時は割り振り表の書き方しだいです。 応援で1時間だけピッキングに入った人を書き忘れると、ピッキングの生産性が上がり、元の作業の生産性が下がって見えます。
出荷の明細は、物量の構成を見るために持ちます。 同じ1,000行でも、1件1行の単品の出荷が多い日と、1件10行の店舗向けが多い日では、ピッキングの歩く距離がまったく違います。生産性が下がった日の多くは、この構成の違いで説明がつきます。
データの取得方法を決める
CSVと割り振り表は、範囲を1回でまとめて読みます。 Apps Script では、スクリプトの中での計算は他のサービスを呼ぶより速く、読み書きを交互にくり返すと遅くなるとされています。作業者70名・スキャン数万件を1行ずつ読み書きすると、1回の実行の6分に収まりません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 作業区分ごとの処理量 | 作業の実績 | 生産性の分子 |
| 作業区分ごとの人時 | 割り振りと出退勤 | 生産性の分母 |
| 1件あたりの行数、単品の比率 | 出荷の明細 | 物量の構成の変化 |
| 経験3か月未満の人時の比率 | 割り振りと作業者の属性 | 新人の比率 |
| スキャンの間隔の空白 | 作業の実績のスキャンの時刻 | 作業の止まり |
| 便の遅れの分数 | 入荷の予定と実績 | 入荷の遅れ |
計算の式は、次の1つに決めます。
生産性 = 作業区分ごとの処理量 ÷ その作業区分に割り振られた人時
いつもの水準 = 同じ曜日の直近4週の生産性の中央値
下がった作業 = 生産性 ÷ いつもの水準 が 0.90 を下回った作業
空白の時間 = 同じ作業者のスキャンの間隔が10分を超えた部分の合計
比べる相手を「同じ曜日の直近4週の中央値」に固定するのは、第3章の(c)の対策です。 月曜は週末の受注がたまって単品の出荷が多い、といった曜日の癖を外せます。平均ではなく中央値にするのは、セールの日のような外れた1日に引っぱられないためです。 0.90の線と10分の線は、センター長が決めてシートに置きます。
AIへ渡す前に整形する
- 基準日の確認 … WMSと勤怠のCSV、割り振り表が前日の分かを確かめます
- 作業者IDの名寄せ … WMSのログインIDと勤怠の社員番号が違う場合は、作業者の一覧で対応させます
- 人時の配分 … 割り振り表の開始と終了の時刻で、1人の勤務時間を作業区分ごとに分けます。休憩の時間は除きます
- 割り振りの無い時間の扱い … 出勤しているのに割り振りが無い時間は「未割り振り」として別に数えます。どの作業にも足しません
- 生産性と比較の計算 … 「データの取得方法」の式で計算し、下がった作業に印を付けます
- 理由の材料の計算 … 下がった作業について、1件あたりの行数、単品の比率、新人の比率、空白の時間、入荷の遅れを、いつもの水準と並べて出します
- メモの抽出 … 割り振り表のリーダーのメモから、その作業区分に関係する行だけを取り出します
4番目を省かないでください。 未割り振りの時間をどこかの作業に足すと、その作業の生産性が下がって見え、AIはそれに理由を付けようとします。 未割り振りが多い日は、それ自体を日報に書きます。
6番目の材料は、AIに計算させません。 「新人の比率がいつもより高い」と書かせるなら、その比率は前処理で出しておきます。AIが件数から比率を割り出すと、桁を誤ったまま日報に載ります。
AIに処理させる
させるのは、下がった作業ごとに、前処理で並べた材料のどれが理由の候補になるかを選び、センター長向けの文章にまとめることです。 計算と、どの作業が下がったかの判定は前処理で終わっています。
| 理由の候補 | 根拠にする材料 | 書き方の例 |
|---|---|---|
volume_mix | 1件あたりの行数、単品の比率がいつもと違う | 店舗向けの複数行の出荷が多かった |
new_staff | 経験3か月未満の人時の比率が高い | 新人の比率がいつもより高かった |
idle_time | スキャンの空白の時間が長い | 作業が止まっていた時間が長かった |
inbound_delay | 入荷の便の遅れ | 入荷の遅れで検品の開始が遅れた |
leader_note | リーダーのメモ | 設備の停止などのメモがある |
unknown | 上のどれにも当てはまらない | 記録からは理由が分からない |
1つの作業に候補を複数付けてよく、順位を付けさせます。 ただし、どの候補にも evidence に材料の項目名と値を添えさせます。 根拠を添えられない候補は書かせません。
| させないこと | 理由 |
|---|---|
| 生産性や比率の計算 | 前処理の数字をそのまま使う。AIの計算で数字が変わらないように |
| 個人名を挙げた理由 | 「〇〇さんの作業が遅い」は、日報ではなく指導の場で扱う |
| 記録に無い理由の推測 | 疲労、天候、やる気などを、材料が無いのに書かない |
| 人の配置の指示 | 「明日はピッキングに3名足す」は、リーダーとセンター長が決める |
| 下がっていない作業の所見 | 毎日同じ文章が並び、日報が読まれなくなる |
2行目と3行目が、いちばん起きやすい失敗です。 作業者IDを渡すと、空白の時間が長かった作業者を名指しして書きます。AIには作業者IDを渡さず、作業区分ごとの合計だけを渡します。 3行目は、材料が乏しい日ほど起きます。何も言わなければ、もっともらしい理由で文章を埋めます。
指示内容を固定する
あなたは物流センターの業務課で、センター長への日報を書く立場です。
与えられた数字と記録だけを使って書いてください。推測で埋めないでください。
【あなたの仕事】
生産性が下がった作業ごとに、理由の候補を選んで順位を付け、
センター長が1分で読める日報の文章にまとめてください。
【理由の候補の選び方】
- volume_mix ..... 1件あたりの行数か単品の比率が、いつもの水準と違う
- new_staff ...... 経験3か月未満の人時の比率が、いつもの水準より高い
- idle_time ...... 空白の時間が、いつもの水準より長い
- inbound_delay .. 入荷の便に遅れがある(入荷検品・格納だけ)
- leader_note .... リーダーのメモに、その作業に関係する記載がある
- unknown ........ 上のどれにも当てはまらない
どの候補にも、evidence に根拠にした材料の項目名と値を書いてください。
根拠を書けない候補は挙げないでください。当てはまるものが無ければ unknown だけを返してください。
【厳守事項】
- 生産性、比率、時間などの数字は、入力の値をそのまま書いてください。計算し直さないでください。
- 個人を特定する書き方をしないでください。
- 疲労、天候、意欲など、入力に無い理由を書かないでください。
- 人の配置や作業の進め方の指示を書かないでください。
- 生産性が下がっていない作業については、所見を書かないでください。
- summary は3文以内で、下がった作業の名前、下がり幅、第1候補の理由を書いてください。
- リーダーのメモを引用するときは、メモの文言をそのまま書いてください。
【下がった作業ごとの材料】{flagged_json}
【全作業の生産性といつもの水準】{all_tasks_json}
【未割り振りの時間】{unassigned_hours}
【対象日】{date}({weekday})
「根拠を書けない候補は挙げない」と「unknown だけを返す」をセットで書きます。 どちらか一方だけだと、根拠が弱い候補を unknown と並べて返します。理由が分からないことを、そのまま日報に書ける形にしておくことが、この構成の目的の一つです。
出力形式を固定する
次の形のJSONで受け取ります。
{
"date": "2026-10-05",
"summary": "",
"flagged_tasks": [
{
"task": "picking",
"productivity": 0,
"baseline": 0,
"ratio": 0,
"reasons": [
{
"rank": 1,
"code": "volume_mix | new_staff | idle_time | inbound_delay | leader_note | unknown",
"evidence": [ { "field": "", "value": "" } ],
"text": ""
}
],
"question_to_leader": ""
}
]
}
1つ目の理由は、code を enum で絞れることです。 理由を自由文だけで書かせると、同じ物量の構成の違いが日によって違う言葉で書かれます。決まった値なら、「volume_mix が月に何日あったか」を記録から数えられます。 月末に、センター長が作業ごとの理由の内訳を見られます。
2つ目は、数字を入力と突き合わせられることです。 productivity・baseline・ratio と evidence の値を、スクリプトが前処理の値と比べます。1つでも違えば、その作業の所見を捨て、数字だけを日報に載せて「所見は担当者が記入」とします。
3つ目は、question_to_leader で確認が速くなることです。 業務課の担当者は、この1問だけを持ってリーダーのところへ行けます。「昨日は何があったか」を一から聞かずに済みます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受け渡しフォルダのCSV | スプレッドシートへの読み込み | WMSと勤怠の前日分 |
| 割り振り表・作業者の一覧 | 範囲をまとめて読む | 人時の配分、新人の比率(書き込まない) |
| Gemini API | UrlFetchApp.fetch で呼ぶ | 理由の候補と日報の文章を構造化出力で受け取る |
| Gmail | 下書きの作成、確定後の送信 | 担当者への下書き、センター長への日報 |
| 記録のシート | 範囲をまとめて書く | 当日の数字、理由の候補、確定した理由 |
Gemini API は UrlFetchApp.fetch で呼びます。 method を post、contentType を JSON にし、headers に API キーを入れます。muteHttpExceptions を true にして、失敗の応答でも例外で止めずに応答のコードを見ます。 失敗したときは、数字だけの日報を作ります。
API キーと線の値は、スクリプトのプロパティに置きます。 スクリプトのプロパティは、そのスクリプトのすべての利用者に共有されるアプリ全体の設定の置き場所で、値は文字列で保存されます。0.90 や 10分 も文字列で返るので、読み出したら数値に直してから比べます。 直し忘れると、比較が文字列の大小で行われます。
日報は、まず担当者あての下書きにします。 GmailApp の createDraft で下書きを作れ、htmlBody で表を組んだ本文を付けられます。担当者がリーダーに確かめて理由を直したら、記録のシートの「確定」の列に印を付け、次の実行でセンター長へ送ります。 センター長には、確定していない所見を送りません。
人が確認する
人が確かめるのは、下がった作業の理由の候補だけです。 下がっていない作業は数字の表だけで、所見はありません。
- 未割り振りの時間を先に見る … 多ければ、割り振り表の記入漏れをリーダーに確かめます。直すと、下がった作業が消えることがあります
- 第1候補の根拠を確かめる …
evidenceの値を見て、候補が妥当かを判断します - リーダーに1問だけ聞く …
question_to_leaderを持って行き、現場で何があったかを聞きます - 理由を確定する … AIの候補を採るか、リーダーの話に直すかを決め、
codeを確定します。直したことは記録に残します - センター長へ送る … 確定の印を付けます
1番目が、いちばん効きます。 生産性が下がって見える日の多くは、割り振り表に応援の移動が書かれていないだけです。記入漏れを直す前に理由を考えると、存在しない問題に理由を付けることになります。
目標は、120件をならして1件4分です。 下がった作業が無い日は数字の確認だけで終わり、下がった作業がある日はリーダーとのやり取りに10分ほどかかる想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVが前日の分でない | 計算を始めず、担当者に「前日分が届いていない」と送る |
| 割り振り表が空 | 勤怠だけで人時を数え、日報に「割り振りの記録なし」と明記する |
| 未割り振りの時間が多い | 所見を作らず、記入漏れの確認を担当者に頼む |
| 作業者IDが対応表に無い | その人の時間を未割り振りに入れ、一覧に出す |
| いつもの水準の記録が4週に満たない | 比較をせず、数字だけを載せる。導入から4週は所見なし |
| 稼働しなかった日 | 処理しない。基準の計算にも混ぜない |
| Gemini API が応答しない・失敗の応答 | 数字だけの日報を作り、所見の欄を空けて担当者へ |
| 数字が入力と一致しない | その作業の所見を捨てる。AIの書いた数字を日報に載せない |
| セールの日など物量が大きく外れた日 | 比較はするが、記録のシートに「外れた日」の印を付ける。基準の中央値の計算には入れたままにする |
| 1回の実行が6分を超えそう | スキャンの空白の計算を作業区分ごとに分けて、2回の実行にする |
上から3行目までが、最初の1か月の大半を占めます。 どれもAIの問題ではなく、割り振りの記録の書き方の問題です。 リーダーが移動を書く習慣がつくまでは、日報の数字そのものが揺れます。
記録を残す
- その日に読み込んだCSVのファイル名と基準日
- 作業ごとの処理量、人時、生産性、いつもの水準、未割り振りの時間
- 理由の材料(行数、単品の比率、新人の比率、空白の時間、入荷の遅れ)
- AIに渡した入力と、返ってきたJSONの全文
- 担当者が確定した理由と、AIの候補から変えたかどうか
- そのときの線(0.90、10分)
5つ目は、AIの候補がどれだけ当たっているかを見る材料です。 unknown が多い作業は、理由を読み取る材料が足りていません。入荷の記録や設備の停止の記録を足す検討の材料になります。
割り振り表は、その日の内容を記録のシートに写しておきます。 リーダーが後から割り振り表を直すと、過去の生産性の分母が変わります。写しが無いと、なぜその日にその作業が下がったと出たのかを説明できません。
04実装レベルの3段階
半自動化で、1件15分が4分になります。この段階が本記事の想定です。 集計、比較、材料の計算、文章が自動になり、人が使う時間は、未割り振りの確認とリーダーへの1問だけになります。 本格構成は、割り振りの記録を手書きから端末に変えます。 作業を移るときにハンディで作業区分を切り替えるようにすれば、割り振り表の記入漏れが無くなります。ただしWMSやハンディの設定の変更が要るので、半自動化で3か月回し、未割り振りの時間がどれだけ出るかを見てから判断してください。
05工数削減シミュレーション
導入後 120件 × 4分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 倉庫管理のシステム(WMS)とハンディ端末で作業の記録は取れているのに、作業別の生産性を毎日出す人がいない物流センター。入荷・ピッキング・梱包・出荷の人の割り振りをリーダーの経験で決めていて、どの作業でいつ生産性が下がったのかを後から説明できない場合。センター長への日報が出荷件数と残業時間だけになっている場合。
- 作業員が数名で、センター長が毎日現場に立って全員の動きを見ている倉庫。WMSに作業別の生産性の分析の機能があり、すでに使われている場合。ハンディ端末を使っておらず、作業の開始と終了の時刻が記録に残らない場合。なお、人の配置を変えるか、誰を指導するかという判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の生産性が低かった日を10日選び、作業ごとの処理量と人時、物量の構成をスプレッドシートで手計算する
- その10日について、リーダーのメモと入荷の便の遅れを表にする
- 作業者IDを外し、作業区分ごとの数字だけにして、手元のAIサービスに貼り付ける
- 「生産性が下がった作業について、表の材料から理由の候補を選び、根拠の数字を添えてください。表に無い理由は書かないでください。分からなければ分からないと書いてください」と指示する
- 出てきた候補を、リーダーが覚えている当時の理由と突き合わせる
10日分は必ずやってください。 スクリプトを書く前に、「記録から理由が読めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| リーダーの話とおおむね合う | スクリプトでの自動化に進む |
| 表に無い理由を書いた | 指示の書き方で直る。構成は有効 |
| ほとんどの日が「分からない」 | 材料が足りない。 入荷の記録やメモの書き方を見直すのが先 |
3行目が出ることは珍しくありません。 多くの倉庫で、生産性が下がった理由の記録はリーダーの頭の中にしかありません。その場合は、まず割り振り表のメモ欄を、決まった選択肢から選ぶ形にします。 1か月メモを貯めてから同じ10日分を試し直すと、unknown がどれだけ減るかで、記録の書き方が効いたかを確かめられます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 応援の移動が書かれず、人時がずれる | 未割り振りを別に数え、どの作業にも足さない |
| 稼働しなかった日が基準に混ざる | 稼働日の一覧を持ち、稼働日だけを処理する |
| 比べる相手が日によって変わる | 同じ曜日の直近4週の中央値に固定する |
| AIが比率を計算して桁を誤る | 材料は前処理で計算し、数字を入力と突き合わせる |
| 個人を名指しした所見が出る | 作業者IDを渡さず、作業区分ごとの合計だけを渡す |
| 記録に無い理由で文章を埋める | 根拠の無い候補を禁じ、unknown を返せるようにする |
| 下がっていない作業にも所見が付く | 下がった作業だけを渡す |
| 作業者IDがWMSと勤怠で違う | 作業者の一覧で対応させ、無いIDは一覧に出す |
| 担当者の個人アカウントのトリガーが止まる | 業務課の共有の管理用アカウントで作る |
| 割り振り表を後から直し、過去の数字が変わる | その日の割り振り表を記録のシートに写しておく |
| プロパティの線が文字列のまま比べられる | 読み出したら数値に直す |
| 確定前の所見がセンター長に届く | 下書きにし、確定の印が付いたものだけを送る |
上の2行が、この構成の失敗のほとんどです。 どちらも生産性の分母の問題で、分母がずれた日の生産性に、AIはもっともらしい理由を付けてしまいます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 作業者ごとの勤務時間とスキャンの記録、入社日、派遣か社員か、荷主ごとの出荷の量です。作業者の記録は、使い方によっては個人の評価に直結します。
- AIに作業者IDと氏名を渡さない … 所見に要るのは作業区分ごとの合計だけです。個人の空白の時間は、前処理で作業区分の合計にしてから渡します
- 日報を個人の評価に使わない … この日報は作業の段取りを見直すためのものです。誰の作業が遅いかを見る道具にすると、割り振りの記録が正しく書かれなくなります
- 荷主の名前と出荷の明細を渡さない … 物量の構成は、行数と比率にしてから渡します
- 人の配置をAIに決めさせない … 明日の割り振りはリーダーとセンター長が決めます。指示の文を出力の項目に置きません
- API キーをスクリプトの本文に書かない … スクリプトのプロパティに置き、編集権限を業務課の管理者に限ります
- 確定した理由の記録を消さない … どの日に何が起きたかの記録は、荷主との会議や翌年の人員の計画の材料になります。担当者が候補を直した記録も残します
誤りが起きた場合のリスクは、存在しない問題に理由を付けることと、記録に無い理由が事実として残ることの2つです。 前者は未割り振りの時間の扱いで防ぎ、後者は根拠の無い候補を禁じることで防ぎます。
10まず何から始めるか
1週目:割り振り表の書き方をそろえる
作業の移動を「誰が・何時に・どの作業からどの作業へ」の1行1件で書く形にします。リーダー全員に、応援で1時間だけ移った場合も書くことを伝えます。 メモ欄は、設備の停止・入荷の遅れ・欠勤などの選択肢から選ぶ形にします。
2週目:10日分で試す
先月の生産性が低かった10日を手で集計し、手元のAIサービスで理由の候補を出させます。リーダーの話と突き合わせ、記録に無い理由を書いていないかを最優先で見ます。
3週目:集計をスクリプトにする
Apps Script でCSVと割り振り表を読み、作業ごとの生産性といつもの水準を計算するところまで作ります。この時点ではAIを呼ばず、数字の表だけを毎朝担当者に届けます。
4週目以降: 理由の材料の計算と、Gemini API による所見を足します。担当者がAIの候補を直した件数を毎週数えます。2か月目以降: センター長への送信を自動にし、1件15分が何分になったかを実測します。確定した理由の内訳を、翌月の人の割り振りに使い始めた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から月1回までの間隔で設定でき、時刻が1時間の幅の中で選ばれること。インストール型のトリガーが作った人のアカウントで動くこと。失敗時に失敗をまとめたメールが届くこと | Google for Developers: Installable Triggers | 2026-10-06 |
| 1回の実行が6分まで、Google Workspace のアカウントでトリガーの合計の実行時間が1日6時間、URL Fetch が1日100,000回であること。上限が予告なく変わりうること | Google for Developers: Quotas for Google Services | 2026-10-06 |
fetch(url, params) の method・contentType・headers・payload。muteHttpExceptions を true にすると失敗の応答でも例外を投げずに応答を返すこと | Google for Developers: Class UrlFetchApp | 2026-10-06 |
| スクリプトのプロパティがすべての利用者に共有されるアプリ全体の設定値の置き場所であること。値が文字列で保存されること | Google for Developers: Properties Service | 2026-10-06 |
| スクリプトの中での処理が他のサービスを呼ぶより速いこと。読み書きを交互にくり返すと遅く、範囲をまとめて読み書きするのがよいこと | Google for Developers: Best Practices | 2026-10-06 |
createDraft で下書きを作れ、htmlBody・name・replyTo・cc・bcc・attachments を指定できること。https://mail.google.com/ のスコープが要ること | Google for Developers: Class GmailApp | 2026-10-06 |
response_format に mime_type を application/json とした形とスキーマを指定して JSON で応答させられること。スキーマで enum・required などが使えること。構文として正しいJSONでも値はアプリの側で確かめるべきこと。大きすぎる・深すぎるスキーマは拒否されうること | Google AI for Developers: Structured outputs | 2026-10-06 |
生産性の比べ方、下がったとみなす線、作業区分の分け方は、自社のセンターの運用に合わせて決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。WMSと勤怠のシステムからのCSVの出し方は、利用しているシステムの案内を確認してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0551)についてのご相談はこちらから。
