社内から届く事務用品・消耗品の購入依頼をフォームで集め、Apps Script と AI でばらばらの品名を標準の品目にそろえ、在庫を差し引いて仕入先ごとの発注の一覧を作る
社員が Google フォームで出す事務用品・消耗品の購入依頼を、AI が1行ずつ標準の品目に振り分け、Apps Script が単位をそろえて合計し、在庫を差し引いて仕入先ごとの発注の一覧にします。品名をそろえる手作業が無くなります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- IT・SaaS/人材/士業/広告
- 対象部門
- 総務/購買
- 対象業務
- 分類・仕分け/台帳・マスタ管理
- 主な課題
- 入力作業が多い/属人化している/確認ミスが多い
- AIで行う処理
- 分類
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★☆☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 総務の担当者が、チャット・メール・紙の回覧から依頼を拾い、集計のシートに1行ずつ書き写す
- 1行ずつ品名を読み、品目の一覧から当てはまる品目を探して番号を書く
- 「1箱」「1ダース」「10本」などの単位を、品目の一覧の発注の単位に読み替える
- 品目ごとに数量を足し、倉庫の在庫表を見て、在庫で足りる分を差し引く
- 標準外の品物(特定の色のマーカー、特殊なサイズのファイルなど)は、依頼者に用途を聞いて、標準品で足りるか、標準外で買うかを決める
- 事務用品でないもの(マウス、モニターの台、椅子のクッション)は、情報システム部や総務の備品の担当に回す
- 仕入先ごとに、商品番号と数量を通販の一括注文の形に書き写して発注する
- 届いたら、部署ごとに仕分けて配る
- 人社員が Google フォームで依頼を出す(部署、品名、数量と単位、用途、急ぎかどうか)。部署の庶務担当がまとめて出してもよい
- 自動フォームの送信をきっかけに Apps Script が動き、依頼を行ごとに分けて依頼の台帳に書く
- 自動品名・規格・用途の文を OpenAI API に渡し、標準の品目の番号か、「標準外」「事務用品でない」「読み取れない」のどれかを JSON で受け取る
- 自動振り分けた品目の入り数を使って、数量を発注の単位にそろえる。そろえられないものに印を付ける
- 自動締めの火曜17時に、品目ごとに合計し、倉庫の在庫を差し引いて、仕入先ごとの発注の一覧の案を作る
- 人総務の担当者が、印の付いた行だけを見る(標準外、事務用品でない、単位の読み替えができない、AI の確信の低いもの)
- 人標準外の行は依頼者に用途を確かめ、標準品で足りるか、標準外で買うかを決める
- 人発注の一覧の案を確かめて、通販の一括注文で発注する
各工程の詳しい説明を読む
- 総務の担当者が、チャット・メール・紙の回覧から依頼を拾い、集計のシートに1行ずつ書き写す
- 1行ずつ品名を読み、品目の一覧から当てはまる品目を探して番号を書く
- 「1箱」「1ダース」「10本」などの単位を、品目の一覧の発注の単位に読み替える
- 品目ごとに数量を足し、倉庫の在庫表を見て、在庫で足りる分を差し引く
- 標準外の品物(特定の色のマーカー、特殊なサイズのファイルなど)は、依頼者に用途を聞いて、標準品で足りるか、標準外で買うかを決める
- 事務用品でないもの(マウス、モニターの台、椅子のクッション)は、情報システム部や総務の備品の担当に回す
- 仕入先ごとに、商品番号と数量を通販の一括注文の形に書き写して発注する
- 届いたら、部署ごとに仕分けて配る
(a)同じ品物が、部署ごとに違う名前で届く。 「青ペン」「ボールペン(青)」「サラサの青」「赤青2色のペン」。最初の3つが同じ品目か、4つ目が別の品目かは、品目の一覧を知っている人にしか分かりません。 担当者が休んだ週は、もう1人が一覧を何度も行き来します。
(b)単位がそろわず、数量を取り違える。 「付箋5」が5個なのか5パックなのか。10個入りのパックで発注する品目を「5」と読み違えると、50個届きます。 届いてから気づき、倉庫に余りが積み上がります。
(c)標準外の判断が担当者の頭の中にある。 「このマーカーは標準品の黒で足りる」「この部署は撮影用に特定の色が要る」。判断の理由が残らないので、翌月も同じことを依頼者に聞き直します。
- 【人】 社員が Google フォームで依頼を出す(部署、品名、数量と単位、用途、急ぎかどうか)。部署の庶務担当がまとめて出してもよい
- 【自動】 フォームの送信をきっかけに Apps Script が動き、依頼を行ごとに分けて依頼の台帳に書く
- 【自動】 品名・規格・用途の文を OpenAI API に渡し、標準の品目の番号か、「標準外」「事務用品でない」「読み取れない」のどれかを JSON で受け取る
- 【自動】 振り分けた品目の入り数を使って、数量を発注の単位にそろえる。そろえられないものに印を付ける
- 【自動】 締めの火曜17時に、品目ごとに合計し、倉庫の在庫を差し引いて、仕入先ごとの発注の一覧の案を作る
- 【人】 総務の担当者が、印の付いた行だけを見る(標準外、事務用品でない、単位の読み替えができない、AI の確信の低いもの)
- 【人】 標準外の行は依頼者に用途を確かめ、標準品で足りるか、標準外で買うかを決める
- 【人】 発注の一覧の案を確かめて、通販の一括注文で発注する
6番目で総務が見るのは、印の付いた行だけです。 標準の品目に確信を持って振り分けられ、単位もそろった行は、一覧で合計を流し見るだけにします。全行を人が読み直す設計にすると、32.0時間はほとんど減りません。
8番目の発注は、人が行います。 この構成は通販のサイトに注文を入れません。数量の取り違えが、そのまま届く物の量になる業務だからです。
02今回想定するシステム構成
社員・部署の庶務担当 │ Google フォーム(部署・品名・数量と単位・用途・急ぎ) ▼【トリガー】フォームの送信(回答をスプレッドシートに記録) Google Apps Script(送信のたび) ├──▶ 依頼を行ごとに分けて依頼の台帳へ(ロックで1件ずつ) ▼ OpenAI API ── 標準の品目の番号への振り分けを JSON で返す ▼ Google Apps Script ── 入り数で単位をそろえる。そろわない行に印 ▼【トリガー】締めの火曜 17時台(時間主導型のトリガー) Google Apps Script ── 品目ごとに合計、在庫を差し引き、仕入先ごとの発注の一覧の案 ▼ 【総務が印の付いた行と発注の一覧を確認】 ▼ 法人向けの通販に一括注文(人が行う)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make |
| 生成AI | OpenAI API(Responses API、構造化出力) | Claude API、Gemini API |
| 受付 | Google フォーム(回答をスプレッドシートに記録) | - |
| 保管 | Google スプレッドシート(依頼の台帳、品目の一覧、在庫表、言い換えの表、発注の一覧、処理ログ) | - |
新しく足すのは、フォームと Apps Script と、言い換えの表だけです。 品目の一覧と在庫表は今あるシートをそのまま使います。言い換えの表は、「サラサの青 → 品目の番号 P-0023」のように、総務が判断した読み替えを1行ずつ貯めていくシートです。
言い換えの表が、この構成を育てます。 AI に振り分けさせる前に、品名が言い換えの表にそのまま載っていれば、その番号を使います。AI を呼ぶのは、表に無い書き方の行だけです。 運用が進むほど表が増え、AI を呼ぶ行が減ります。
生成AIは OpenAI API を想定します。 構造化出力で、品目の番号を列挙の値として渡し、その中からしか選べない形で受け取れます。依頼の文には、個人の情報も機密の情報もほとんど入りません。 ただし用途の欄に案件名や顧客名が書かれることはあるので、第13章のとおり扱います。
03どうやって実装するのか
処理の起点を決める
1つ目は、フォームの送信です。 Apps Script のインストール型のトリガーには、Google フォーム側の送信のトリガーと、回答先のスプレッドシート側の送信のトリガーの2種類があります。スプレッドシート側を使い、回答の行が書かれた後で動かします。 送信のたびに振り分けまで済ませておくと、締めの時点では合計するだけになります。
2つ目は、締めの時間主導型のトリガーです。 毎週火曜の17時台に動かし、その週の依頼を品目ごとに合計して発注の一覧の案を作ります。公式のページでは、時間主導型のトリガーの時刻は少しずれることがあり、9時に設定すると9時から10時のあいだに動くとされています。締めの時刻をフォームに書くときは「17時まで」とし、トリガーは17時台に置きます。 17時を過ぎた送信は翌週に回します。
インストール型のトリガーは、作った人のアカウントで動くとされています。 総務の共用のアカウントで作ります。失敗したときは、まとめのメールがそのアカウントに届きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 購入依頼 | 依頼の番号、部署、品名、規格(色・太さ・サイズ)、数量、単位、用途、急ぎかどうか | フォームの回答のシート |
| 品目の一覧 | 品目の番号、品名、規格、発注の単位、入り数、仕入先、仕入先の商品番号、標準として扱う理由のメモ | 品目の一覧のシート |
| 言い換えの表 | 依頼に書かれた品名、品目の番号、判断した人と日付 | 言い換えの表のシート |
| 在庫表 | 品目の番号、倉庫の数量、部署へ配る最小の単位 | 在庫表のシート |
| 回付の先 | 事務用品でないものの種類と、回す先(情報システム部、備品の担当) | 回付の先のシート |
質を決めるのは、品目の一覧の「規格」と「入り数」です。 規格が無いと、黒と青、0.5と0.7が同じ品目に見えます。入り数が無いと、「付箋5」を何パックにすればよいか、Apps Script が計算できません。
フォームでは、数量と単位を別の質問にします。 単位は「本・個・冊・枚」「箱・パック」「分からない」の選択にし、品名は自由に書けるようにします。品名を選択にすると180品目から選ぶことになり、社員が面倒がってチャットに戻ります。 品名を自由に書けることが、フォームに乗ってもらう条件です。
データの取得方法を決める
フォームの回答は、送信のイベントから受け取ります。公式のページでは、スプレッドシート側の送信のイベントは、質問の名前と値をまとめた namedValues、書き込まれた範囲を表す range、シートの並びどおりの values などを持つとされています。質問の名前で値を取る namedValues を使います。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 依頼の行 | 送信のイベントの namedValues | 品名・規格・数量・単位・用途 |
| 言い換えの一致 | 言い換えの表を品名で引く | 一致すれば AI を呼ばない |
| 品目の候補 | 品目の一覧の番号・品名・規格 | AI に渡す選択肢 |
| 入り数と発注の単位 | 品目の一覧 | 単位をそろえる |
| 倉庫の数量 | 在庫表 | 発注の数量から差し引く |
部署の庶務担当がまとめて出す依頼は、1回の送信に10行以上が入ります。 フォームに「品名1・数量1・単位1」から「品名10」まで並べるか、庶務担当には品名と数量を改行で区切って書いてもらい、Apps Script で行に分けます。行に分けた時点で、依頼の番号に枝番を付けます。
同時の送信に備えて、台帳に書く部分を1件ずつにします。 公式のページでは、LockService はコードの一部への同時のアクセスを防ぐもので、getScriptLock() はどの利用者が動かしたかにかかわらず同時の実行を止めるとされています。締めの直前の火曜の午後は送信が重なるので、枝番を振って書き込むまでをロックで囲みます。 ロックは waitLock か tryLock を呼んで初めて取れるとされています。
AIへ渡す前に整形する
- 行に分ける … 1回の依頼を品名ごとの行に分け、枝番を付けます
- 表記をそろえる … 全角と半角、カタカナとひらがな、「ボールペン」のような半角カナを、比べる前にそろえます
- 言い換えの表を引く … そろえた品名が表にそのまま載っていれば、その番号を付けて AI を呼びません
- 候補を絞る … 品目の一覧から、品名に含まれる語(ペン、ノート、付箋、ファイル、電池など)で分類の近い品目を30〜50に絞ります。絞れないときは全品目を渡します
- 数量を確かめる … 数量が空、0、数字でない行は、AI に渡さず依頼者に戻します
- 依頼者の名前を外す … AI に渡すのは依頼の番号と枝番、品名、規格、用途だけです
4番目で候補を絞るのは、列挙の値の上限のためでもあります。 公式のページでは、構造化出力の列挙の値はすべての列挙を合わせて1,000まで、1つの列挙が250を超える文字列の値を持つときは合計15,000文字までとされています。180品目なら全品目を渡しても収まりますが、品目が増える会社では、候補を絞る手順が先に要ります。
AIに処理させる
させるのは、依頼の1行を読み、次の4つのどれに当たるかを決め、標準の品目なら番号を選ぶことです。
| 振り分け | 当てはまるもの | 迷ったときの扱い |
|---|---|---|
standard | 標準の品目の一覧のどれかと、品名・規格が同じもの | 規格(色・太さ)が書かれていなければ confidence を low にする |
non_standard | 事務用品・消耗品だが、一覧に同じ規格の品目が無いもの | 近い標準品があれば nearest に番号を入れる |
not_supply | パソコンの周辺機器、家具、什器など、事務用品でないもの | 回付の先の種類を route に入れる |
unreadable | 品名が短すぎる、何の品物か分からないもの | 依頼者に聞く文を question に書く |
non_standard の nearest は、置き換えの提案ではなく、総務が判断するための材料です。 「撮影用の蛍光ピンクのマーカー」に「標準品の黄色のマーカー」を近いものとして出しても、用途によっては置き換えられません。 置き換えるかどうかは、依頼者と総務が決めます。
| させないこと | 理由 |
|---|---|
| 数量と単位の計算 | 入り数を使って Apps Script が決める |
| 在庫の差し引き | 在庫表の数で Apps Script が決める |
| 標準外を買うかどうかの判断 | 総務が依頼者の用途を聞いて決める |
| 一覧に無い品目の番号を作る | 番号は列挙の値の中から選ばせる |
| 費目・勘定科目の判断 | 経理の仕分けで、この構成の対象外 |
| 仕入先や商品の推薦 | 仕入先は品目の一覧で決まっている |
2行目と4行目が、この構成の要です。 数量を AI に計算させると、「10個入りを5パック」と「5個」を取り違えたまま発注の一覧に入ります。番号を作らせると、存在しない商品番号で注文しようとして、通販のサイトで初めて気づきます。
指示内容を固定する
あなたは会社の総務部で、社員から届く事務用品・消耗品の購入依頼を、
社内の標準の品目に振り分ける立場です。
渡された依頼の1行と、品目の候補だけを見て判定してください。
推測で埋めないでください。
【振り分けの選び方】
- standard ....... 候補のどれかと品名・規格が同じ。item_id にその番号を入れる
- non_standard ... 事務用品・消耗品だが、候補に同じ規格の品目が無い。
近い品目があれば nearest にその番号を入れる
- not_supply ..... 事務用品・消耗品ではない(周辺機器、家具、什器など)。
route に回付の先の種類を入れる
- unreadable ..... 何の品物か分からない。question に依頼者への質問を1文で書く
【厳守事項】
- item_id と nearest には、候補の番号だけを入れてください。
候補に無い番号を作らないでください。
- 規格(色・太さ・サイズ・枚数)が候補と違うときは standard にしないでください。
「黒」と「青」、「0.5」と「0.7」、「A4」と「B5」は別の品目です。
- 依頼に規格が書かれていないときは、最も一般的な規格の候補を選び、
confidence を low にしてください。
- 商品名やブランド名で書かれていても、規格が同じなら standard にしてよいです。
ブランドの違いだけで non_standard にしないでください。
- 数量と単位を計算・換算しないでください。数量はこちらで扱います。
- 標準外を買うべきか、標準品で足りるかを書かないでください。
- 費目や勘定科目を書かないでください。
- reason には、判定の根拠にした依頼の語を短く写してください。
【依頼の1行】{request_line}
【品目の候補】{candidates}
【回付の先の種類】{routes}
「ブランドの違いだけで non_standard にしない」は、会社ごとに決めることです。 標準の品目をブランドで決めている会社なら、逆に書きます。どちらにするかを決めずに始めると、AI の振り分けと総務の判断が毎週ずれます。 品目の一覧の「標準として扱う理由のメモ」に、ブランドを問うかを書いておきます。
「規格が違えば standard にしない」を具体例で書くのは、AI が近いものを同じとみなしやすいからです。 色と太さとサイズは、届いてから使えないと分かる違いなので、例を3つ並べて念を押します。
出力形式を固定する
OpenAI API の構造化出力で、次の形の JSON を受け取ります。 公式のページでは、Responses API の text.format に type: "json_schema" と strict: true を指定し、すべてのオブジェクトに additionalProperties: false を付け、すべての項目を required にすることとされています。
{
"line_id": "",
"category": "standard | non_standard | not_supply | unreadable",
"item_id": "P-0023 | null",
"nearest": "P-0031 | null",
"route": "it | furniture | other | null",
"confidence": "high | low",
"question": "",
"reason": ""
}
1つ目の理由は、item_id を列挙の値で縛れることです。 候補の番号を enum に並べ、該当しないときのために null を許します。公式のページでは、任意の項目は null との組み合わせの型で表すとされています。番号が列挙の中からしか返らないので、存在しない番号が発注の一覧に入りません。
2つ目は、振り分けを規則で印に変えられることです。 AI が返すのは category と confidence までで、総務に回すかどうかは Apps Script が決めます。
| 印 | 条件 |
|---|---|
| 印なし | standard かつ confidence が high、かつ単位をそろえられた |
| 規格の確認 | standard だが confidence が low |
| 標準外 | non_standard |
| 回付 | not_supply(回付の先へ知らせ、発注の一覧には入れない) |
| 聞き直し | unreadable、または単位をそろえられない |
3つ目は、応答が拒否や途中切れで返ったときを見分けられることです。 公式のページでは、拒否のときは refusal が返り、出力の上限で切れたときは status が incomplete になるとされています。どちらのときも JSON として読まず、その行を「聞き直し」に回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フォームの回答のシート | スプレッドシート側の送信のトリガー | 依頼を受け取る |
| 依頼の台帳 | 書き込み(ロックで1件ずつ) | 行ごとの振り分け、単位をそろえた数量、印 |
| OpenAI API | UrlFetchApp.fetch | 振り分けの JSON を受け取る |
| 品目の一覧・在庫表・言い換えの表 | スプレッドシートの読み取り | 候補、入り数、在庫、言い換え |
| 発注の一覧 | 締めの時間主導型のトリガーで書くシート | 仕入先ごとの商品番号と数量 |
| 回付の先 | メール | not_supply の行を情報システム部・備品の担当へ |
発注の一覧は、仕入先の一括注文の形に合わせた列にします。 仕入先の商品番号と数量の2列があれば、多くの通販の一括注文に貼り付けられます。どの形で取り込めるかは仕入先ごとに違うので、仕入先の案内に合わせて列を決めます。 この構成は注文そのものを入れません。
OpenAI API の呼び出しは、失敗の応答でも止まらないようにします。 UrlFetchApp.fetch の muteHttpExceptions を true にすると、失敗の応答でも例外を投げないとされています。失敗した行は「聞き直し」ではなく「未判定」とし、締めの前にもう一度呼びます。 API のキーはスクリプトのプロパティに置きます。
応答は保存しない設定で呼びます。 公式のページでは、Responses API の応答は既定で少なくとも30日、アプリケーションの状態として保たれるとされています。会話を続けない1行ごとの判定なので、store を false にします。
人が確認する
総務が開くのは、印の付いた行だけです。 印なしの行は、締めの後の発注の一覧で品目ごとの合計を流し見るだけにします。
- 聞き直しを先に見る …
questionを使って依頼者にチャットで聞きます。締めの前に答えが来なければ翌週に回します - 標準外を見る … 依頼者に用途を確かめ、標準品で足りるか、標準外で買うかを決めます。標準外で買うと決めたら、品目の一覧に足すかも決めます
- 規格の確認を見る … 色や太さが書かれていない行です。多くは一般的な規格で足ります
- 発注の一覧を見る … 前週と比べて大きく増えた品目がないかを見ます
判断したら、言い換えの表に1行足します。 「サラサの青 → P-0023」「蛍光ピンクのマーカー(撮影用)→ 標準外で購入」。翌週から、同じ書き方の依頼は AI を呼ばずに振り分けられます。
目標は、480行のうち総務が開くのを1割前後に抑えることです。 最初の月は言い換えの表が空なので2〜3割に上がり、表が育つほど下がります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 数量が空・0・数字でない | AI に渡さず、依頼者に戻す |
| 単位が「分からない」・品目の発注の単位と合わない | 「聞き直し」。入り数で割り切れない数量は推測しない |
| 同じ部署から同じ品目が週に何度も来る | 合計して1行にまとめ、依頼の番号を並べて残す |
| 急ぎの依頼 | 締めを待たずに総務へ知らせる。倉庫の在庫で足りるかを先に見る |
| 在庫が発注の数量を上回る | 発注せず、倉庫から配る分として部署ごとの配布の一覧に入れる |
| OpenAI API が失敗・時間切れ | 「未判定」とし、締めの前にもう一度呼ぶ |
| 拒否・途中切れの応答 | JSON として読まず「聞き直し」 |
| 締めの後の依頼 | 翌週の締めに回す。急ぎなら総務へ |
2行目を Apps Script の推測で埋めないでください。 「付箋5」を5パックと読むか5個と読むかを機械が決めると、10倍の数が届くか、10分の1しか届きません。 分からない単位は依頼者に聞くのが最も早く終わります。
上限は、公式の表で実行時間が1回6分、トリガーの合計が Google Workspace のアカウントで1日6時間、外部への呼び出しが1日10万回です。 締めの時点の合計は表の計算だけなので、1回6分には遠く届きません。
記録を残す
- 依頼ごとの、フォームの回答の原文と受け付けた日時
- 行ごとの振り分けの結果と、AI を呼んだか、言い換えの表で決まったか
- AI に渡した候補と、返ってきた JSON の全文
- 総務が振り分けを直した記録と、言い換えの表に足した行
- 締めごとの発注の一覧の版と、実際に発注した数量
- 標準外で買った品物と、その理由
2つ目の「AI を呼んだか」は、言い換えの表が育っているかを測る数です。 締めごとに AI を呼んだ行の割合を見て、下がっていなければ、総務の判断が表に戻っていません。
最後の行は、品目の一覧を見直す材料です。 同じ標準外の品物が何か月も続けて買われるなら、標準の品目に足すほうが、毎週の判断より安く済みます。
04実装レベルの3段階
最小構成は、品目の一覧が振り分けに使えるかを確かめるための段階です。 480行には使えません。 半自動化で、1行4分が1分程度になります。 品目を探す時間と書き写しが無くなり、総務は印の付いた行と発注の一覧だけを見ます。この段階が本記事の想定です。 本格構成は、仕入先の仕組みで決まります。 一括注文の取り込みの形や、注文の仕組みとの連携の方法は仕入先ごとに違います。この構成が発注の一覧を出すところで止めているのは、注文の確定を人に残すためでもあります。
05工数削減シミュレーション
導入後 480件 × 1分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 従業員が百人から数百人で、事務用品・消耗品の購入依頼を社員から自由な書き方で受け、総務や購買の担当者が品名をそろえて法人向けの通販に毎週まとめて発注している会社。依頼がメール・チャット・紙の回覧に分かれ、同じ品物が部署ごとに違う名前で書かれる場合。Google Workspace を使っている場合。
- 依頼が月に数十行で、担当者が覚えていれば足りる会社。購買の仕組み(社内のカタログから選んで依頼する仕組み)があり、社員が品目を選ぶ形にできている場合。パソコンや家具など、1件ごとに稟議の要る物品が依頼の大半を占める場合。なお、費目や勘定科目の判断、固定資産に当たるかの判断、仕入先の選定と価格の交渉はこの構成の対象外です。
07最小構成で試す方法
- 先月のチャットとメールの依頼から、50行を選ぶ(うち10行ほどは、総務が依頼者に聞き直した行を入れる)
- 品目の一覧から、品目の番号・品名・規格の3列を書き出す
- 手元の ChatGPT の画面に、第7章のプロンプトと、品目の一覧と、50行を貼る
- 出てきた振り分けを、当時総務が付けた品目と突き合わせる
50行で見るのは、規格の違う品目を同じにしないかと、一覧に無い番号を作らないかの2つです。 数量と単位は、この段階では試しません。
| 出てきた内容 | 判断 |
|---|---|
| 当時の総務の振り分けとほぼ同じ | フォームと Apps Script の連携に進む |
| 色や太さの違う品目を同じにした | 指示の具体例を足す。構成は有効 |
| 一覧の規格が空で判定できない | 品目の一覧の規格の列を埋めるのが先 |
3行目は、AI ではなく品目の一覧の問題です。 一覧の規格が空のままでは、人が見ても同じ品目か分かりません。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 色や太さの違う品目が同じに振り分けられる | 規格の違いを具体例で禁じ、品目の一覧の規格を埋める |
| 一覧に無い番号が返る | 候補の番号を enum で縛る |
| 単位を取り違えて10倍届く | 入り数で割り切れない数量は推測せず聞き直す |
| フォームの品名を選択式にして社員が使わない | 品名は自由に書けるようにする |
| 言い換えの表が育たない | 総務が判断したら必ず1行足す、を手順に入れる |
| ブランドを問うかで判定がずれる | 品目の一覧に「ブランドを問うか」を書き、指示を合わせる |
| 締めの直前の送信が重なる | 枝番を振って書き込むまでをロックで囲む |
| 品目が増えて候補が列挙の上限に近づく | 分類の近い品目に絞ってから渡す |
| チャットやメールでの依頼が残る | 総務がチャットの依頼を受けたら、フォームに入れ直してもらう |
上の3行が、この構成の失敗のほとんどです。 どれも、届いた物が使えない、届いた量が違うという形で、発注の後に表に出ます。規格と番号と単位は、AI ではなく表と規則で守ります。
下の2行は、運用が続くかを決めます。 チャットでの依頼を総務が受け続けると、フォームに乗らない依頼が残り、集計から漏れる行が毎週出ます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 部署名、依頼者の名前、品名と数量、用途の文です。用途の欄に、案件名や顧客名が書かれることがあります。
- 外部へ渡す範囲を、振り分けに必要なものまでに限る … OpenAI API に渡すのは、依頼の番号と枝番、品名、規格、用途、品目の候補だけです。依頼者の名前と部署名は渡しません
- 用途の欄に案件名を書かないよう、フォームで伝える … 用途は「会議用」「撮影用」「来客用」のような書き方で足ります。顧客名や案件名は要りません
- 応答を保存しない設定で呼ぶ … Responses API の応答は既定で少なくとも30日保たれるとされています。
storeを false にします。 不正利用の監視のための記録は最大30日保たれうるとされていて、これは設定では消えません - API に送った内容は既定で学習に使われない … 公式のページでは、API に送ったデータは、自ら選ばない限りモデルの学習や改善に使われないとされています
- 注文を自動で入れない … 発注の一覧を出すところまでにし、通販のサイトへの注文は人が行います
誤りが起きた場合のリスクは、使えない品物が届くことと、量を取り違えて余りや不足が出ることの2つです。 前者は規格の違いを AI に禁じ、後者は数量を AI に触らせずに防ぎます。どちらも、迷ったら総務に回す形で、発注の前に止めます。
10まず何から始めるか
1週目:品目の一覧の規格と入り数を埋める
約180品目のうち、依頼の多い上位50品目から規格(色・太さ・サイズ)と発注の単位と入り数を埋めます。ブランドを問うかどうかも書きます。
2週目:50行で試す
先月の依頼から50行を選び、手元の ChatGPT の画面で振り分けさせます。規格の違う品目を同じにしていないか、一覧に無い番号を作っていないかを最優先で見ます。
3週目:フォームを作る
部署・品名・規格・数量・単位・用途・急ぎの質問を作り、単位は選択式、品名は自由に書ける形にします。締めの時刻をフォームの冒頭に書きます。
4週目:フォームから発注の一覧までをつなぐ
フォームと Apps Script をつなぎ、言い換えの表・OpenAI API の振り分け・単位の換算・発注の一覧の案までを作ります。この時点では、総務がこれまでどおりの手作業の一覧も作り、2つを比べます。
2か月目: 手作業の一覧をやめ、印の付いた行だけを見る運用に切り替えます。締めごとに AI を呼んだ行の割合を数えます。3か月目以降: チャットでの依頼を受けるのをやめ、1行4分が何分になったかを実測します。言い換えの表が育って総務が開く行が1割前後に落ち着き、発注が水曜の午前に終わるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 送信のトリガーに Google フォーム用とスプレッドシート用があること。時間主導型のトリガーの時刻がずれうること(9時の設定が9〜10時)。インストール型のトリガーが作成者のアカウントで動くこと。失敗時にまとめのメールが届くこと | Google: Installable triggers | 2026-10-15 |
スプレッドシートの送信のイベントが namedValues・range・triggerUid・values を持つこと | Google: Event objects | 2026-10-15 |
LockService がコードの一部への同時のアクセスを防ぐこと。getScriptLock() が利用者にかかわらず同時の実行を止めること。ロックが tryLock/waitLock で取れること | Google: Class LockService | 2026-10-15 |
| 実行時間が1回6分、トリガーの合計実行時間が Workspace で1日6時間、URL Fetch の呼び出しが Workspace で1日10万回であること | Google: Quotas for Google Services | 2026-10-15 |
muteHttpExceptions を true にすると失敗の応答でも例外を投げないこと | Google: Class UrlFetchApp | 2026-10-15 |
Responses API の text.format に json_schema と strict: true を指定すること。すべてのオブジェクトに additionalProperties: false、すべての項目を required にし、任意の項目は null との組み合わせで表すこと。列挙の値が合計1,000まで、250を超える文字列の列挙は合計15,000文字までであること。拒否のときに refusal が返り、出力の上限で切れると status が incomplete になること | OpenAI: Structured model outputs | 2026-10-15 |
| API に送ったデータが、自ら選ばない限り学習・改善に使われないこと。不正利用の監視の記録が最大30日保たれうること。Responses API の応答が既定で少なくとも30日保たれること | OpenAI: Data controls in the OpenAI platform | 2026-10-15 |
費目・勘定科目の判断と、固定資産に当たるかの判断は、経理の担当者に確かめてください。 本記事は、購入依頼の品名をそろえて発注の一覧を作る部分に絞って、公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1744)についてのご相談はこちらから。
