仕入先から届く価格表を読み取って、購買の単価マスタとの差分を洗い出して更新する
仕入先から届く価格表(Excel・PDF)を読み取り、仕入先品番・単位・単価・適用開始日などの共通の列に抜き出します。そのうえで単価マスタと突き合わせ、変わった行だけを差分表にして、担当者が承認したものをマスタへ反映します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/Power Automate/Zapier
- 対象業界
- 商社/製造
- 対象部門
- 購買
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/属人化している/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 共有メールアドレスに届いた価格表のファイルを、担当者が開く
- 列の並び、単位、税の扱い、適用開始日の書き方を読み解く
- 自社品番との対応表を開き、仕入先品番から自社品番を探す
- 単価マスタの該当行を探し、新しい単価を上書きする
- 変わった行に色を付け、改定前の単価をメモ欄に残す
- 週1回、単価マスタをCSVにして購買システムへ取り込む
- 人共有メールアドレスに届いた価格表を、専用の受付アドレスへ転送する(1通に1ファイル)
- 自動メールの受信をきっかけに Zapier が動き、ファイルを OpenAI API に渡す
- 自動OpenAI API が価格表を読み取り、決めた列の JSON で返す
- 自動Zapier が JSON の行を取込シートに書き込む
- 自動差分シートの計算式が、品番対応表と単価マスタを引いて区分を付ける(新規/単価変更/単位要確認/税区分要確認/適用日待ち/対応不明/変更なし)
- 人担当者が差分シートを開き、変更のある行と例外の行だけを確かめて承認する
- 人承認した行を単価マスタへ反映する。適用開始日が未来の行は、その日に反映する
- 人週1回、単価マスタをCSVにして購買システムへ取り込む(従来どおり)
各工程の詳しい説明を読む
- 共有メールアドレスに届いた価格表のファイルを、担当者が開く
- 列の並び、単位、税の扱い、適用開始日の書き方を読み解く
- 自社品番との対応表を開き、仕入先品番から自社品番を探す
- 単価マスタの該当行を探し、新しい単価を上書きする
- 変わった行に色を付け、改定前の単価をメモ欄に残す
- 週1回、単価マスタをCSVにして購買システムへ取り込む
(a)読み解きが属人化している。 2番目の工程は、仕入先ごとの癖を知っている人にしかできません。「この仕入先は入数12の箱単価」「ここは税込で書いてくる」という知識が記録されておらず、担当者が休むと改定が止まります。
(b)転記の途中でマスタが壊れる。 4番目でマスタを直接上書きするため、行を1つずれて貼り付けると、別の品目の単価が書き換わります。 気づくのは、発注書の金額がおかしいと仕入先から連絡が来たときです。
(c)変わっていない行まで全部見ている。 単価が変わるのは一部でも、それを知るには全行を突き合わせるしかありません。
(d)未来の日付の改定が早く反映される。 「10月1日から適用」の価格表を9月中に受け取り、そのままマスタを上書きすると、9月の発注が新単価で出ます。 逆に、反映を後回しにして忘れることもあります。
- 【人】 共有メールアドレスに届いた価格表を、専用の受付アドレスへ転送する(1通に1ファイル)
- 【自動】 メールの受信をきっかけに Zapier が動き、ファイルを OpenAI API に渡す
- 【自動】 OpenAI API が価格表を読み取り、決めた列の JSON で返す
- 【自動】 Zapier が JSON の行を取込シートに書き込む
- 【自動】 差分シートの計算式が、品番対応表と単価マスタを引いて区分を付ける(新規/単価変更/単位要確認/税区分要確認/適用日待ち/対応不明/変更なし)
- 【人】 担当者が差分シートを開き、変更のある行と例外の行だけを確かめて承認する
- 【人】 承認した行を単価マスタへ反映する。適用開始日が未来の行は、その日に反映する
- 【人】 週1回、単価マスタをCSVにして購買システムへ取り込む(従来どおり)
6番目が、この設計の分かれ目です。 「変更なし」は件数だけを確かめ、変わった行と例外の行だけに時間を使います。
7番目を人の手に残すのは、半自動化の段階だからです。 書き込みの自動化は、差分表の精度を1か月見てから決めます(第9章)。
02今回想定するシステム構成
仕入先の価格表(Excel・PDF) │ 担当者が受付アドレスへ転送(1通に1ファイル) ▼【トリガー】Email by Zapier の New Inbound Email Zapier ├──▶ 添付ファイルを OpenAI の Files API へアップロード(file_id を受け取る) ▼ OpenAI API(Responses API + Structured Outputs) │ 価格表を読み、共通の列の JSON を返す ▼ Zapier ── JSON の行を展開して取込シートに書き込む ▼ Google スプレッドシート ├── 取込シート(AIが抜き出した行) ├── 品番対応表(仕入先品番 → 自社品番、入数) ├── 単価マスタ(現行の単価) └── 差分シート(計算式で区分を付ける) ▼ 【人が差分シートで承認】 ▼ 単価マスタへ反映 ──▶ 週1回CSVで購買システムへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | Zapier | Make、Power Automate |
| 生成AI | OpenAI API | Claude API、Gemini API |
Google スプレッドシートと購買システムは既存のものです。 新しく作るのは、取込シート・品番対応表・差分シートの3枚です。
Zapier を選ぶのは、メールの受信から表への書き込みまでをノーコードでつなげるからです。 Email by Zapier の New Inbound Email では @zapiermail の受信用アドレスを自分で決めて Zapを動かせます。メールは添付を含めて10MB未満が条件で、起動の時期は保証されず遅れることがあるとされていますが、価格表の反映は数分を争う業務ではありません。
OpenAI API は、Excel も PDF もそのまま受け取れます。 Responses API のファイル入力は、PDF のほか .xlsx .xls .csv などの表計算ファイルを受け付けます(Chat Completions は PDF のみ)。PDF は、画像を扱えるモデルではテキストとページの画像の両方が取り出されてモデルに渡されます。 罫線で区切られた価格表や、表が画像になっているPDFでも読み取れるのはこのためです。
表計算ファイルはシートごとに先頭1,000行までを解析し、要約と見出しの情報を付けて渡すとされています。ファイルは1つ50MB未満、1回の合計も50MBまでです。
出力の形を固定するのが Structured Outputs です。 与えた JSON Schema に必ず沿った応答を生成するとされ、必須のキーの欠落や列挙にない値を防げます。
03どうやって実装するのか
処理の起点を決める
受付アドレスにメールが届いたことを起点にします。 Email by Zapier の New Inbound Email で @zapiermail のアドレスを作り、購買部の共有メールアドレスから担当者がそこへ転送します。 仕入先に受付アドレスを直接教えることはしません。価格表以外のメールが混ざり、どの仕入先からのものかも分からなくなるためです。
転送は1通に1ファイルとします。 1回の実行で1ファイルを扱うと、失敗したときにどのファイルが止まったかがすぐに分かります。
転送時に件名の先頭へ仕入先コードを付けます(例:[S-0412] 価格改定のお知らせ)。仕入先の特定は人の役目で、社名からAIに推測させません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 価格表ファイル | Excel(.xlsx/.xls)、CSV、PDF | 受付アドレスに届いたメールの添付 |
| 仕入先コード | 件名の先頭の [S-xxxx] | 転送したメールの件名 |
| 受信日時 | メールの受信日時 | Email by Zapier |
| 品番対応表 | 仕入先コード、仕入先品番、自社品番、入数、その仕入先の税の書き方 | スプレッドシート |
| 単価マスタ | 自社品番、仕入先コード、現行単価、単位、適用開始日 | スプレッドシート |
AIに渡すのは価格表ファイル・仕入先コード・受信日の3つまでです。 品番対応表と単価マスタは差分シートの計算式だけが引きます。品番対応表の「入数」と「税の書き方」の列は、担当者の頭の中にあった仕入先ごとの癖を書き出したもので、この構成の質を決めます。
データの取得方法を決める
Zapier から OpenAI API を呼ぶ部分は、Webhooks by Zapier で組みます。 2つのステップに分けます。
| ステップ | 方式 | 内容 |
|---|---|---|
| ① ファイルのアップロード | Webhooks by Zapier の POST | 添付ファイルを Files API へ送り、file_id を受け取る |
| ② 読み取りの依頼 | Webhooks by Zapier の Custom Request | Responses API に file_id・指示文・JSON Schema を送る |
①が POST なのは、ファイルの送信には POST または PUT を使うと案内されているためです。②が Custom Request なのは、入れ子の JSON 配列(JSON Schema)を送るためです。 入力は整形されずにそのまま送られるので、保存前に書式を検証します。
API へのファイルの渡し方は file_id・Base64 の埋め込み・外部 URL の3つです。file_id を選ぶのは、Webhooks の送信内容の上限が5MBで、Base64 では数MBの価格表で上限に近づくからです。 外部 URL は価格表を公開の場所に置くことになるため使いません。
添付ファイルの受け渡しと、応答から JSON を取り出す部分の細かな設定は、利用環境に応じた個別実装が必要です。 1ファイルを通して確かめてから組み上げてください。
AIへ渡す前に整形する
- 件名の確認 … 先頭に
[S-xxxx]の仕入先コードがなければ、処理せずに担当者へ戻します - 添付の確認 … 添付が1つでなければ、処理せずに担当者へ戻します
- 形式の確認 …
.xlsx.xls.csv.pdf以外は処理しません。画像で届いた価格表はPDFにしてから転送します - サイズの確認 … メールは添付を含めて10MB未満が条件です。超えるものは受付アドレスに届きません
- 行数の確認 … 表計算ファイルはシートごとに先頭1,000行までが読まれます。超える価格表はシートを分けてから転送します
- 重複の確認 … 同じ仕入先コードと同じファイル名の処理記録が直近にあれば、二重に取り込まないよう印を付けます
行数の確認を省くと、1,000行を超えた部分が差分シートで「価格表に無い行」に見え、廃番と区別がつかなくなります。
AIに処理させる
させるのは、価格表の各行を決めた列に並べ、原文の書き方を残すことだけです。
| 抜き出す列 | 内容 | 判断できないときの扱い |
|---|---|---|
| 仕入先品番 | 価格表に書かれた品番をそのまま | 品番欄が無ければ null |
| 品名 | 価格表の品名をそのまま | 空なら null |
| 単位(原文) | 「個」「箱」「ケース」「m」など書かれたとおり | 書かれていなければ null |
| 入数(原文) | 「12入」「1箱10個」など書かれている場合だけ | 書かれていなければ null |
| 単価 | 数値として | 「別途見積」「オープン」なら null にして原文を残す |
| 通貨 | JPY/USD など | 記載が無ければ unknown |
| 税の扱い | 税抜/税込 | 記載が無ければ unknown |
| 適用開始日 | 年月日 | 記載が無ければ null |
| 最小発注数量 | 数値として | 記載が無ければ null |
| 出典の位置 | シート名と行番号、またはページ番号 | 必ず入れる |
右端の列がいちばん大事な決まりです。 税の扱いを「たぶん税抜」で埋めると、単価が1割違うだけの正常な行に見えます。
| させないこと | 理由 |
|---|---|
| 自社品番を当てること | 品番対応表の計算式で引く。似た品番を推測させない |
| 単位の換算 | 入数で割る計算は差分シートで行う。AIに割らせると元の値が消える |
| 税抜への換算 | 税区分が不明な行を、換算で正常に見せない |
| 単価が変わったかの判定 | 現行単価を知らせない。比較は計算式で行う |
| 値上げの妥当性の判断 | この構成の対象外(UC-0057 の範囲) |
単位の換算がいちばん起きやすい失敗です。 「1箱1,200円(12個入)」を「1個100円」と返した瞬間、単位の情報が消えます。
指示内容を固定する
あなたは購買部門で、仕入先から届いた価格表を転記用の表に整える担当です。
添付の価格表だけを見て、各行を指定の列に並べてください。推測で埋めないでください。
【やること】
- 価格表に載っている品目を1行ずつ rows に入れてください。
見出し行、小計行、注記だけの行は入れないでください。
- 各行について、次の値を書かれたとおりに入れてください。
supplier_item_code(仕入先品番)、item_name(品名)、
unit_raw(単位の原文)、pack_raw(入数の原文)、
unit_price(単価の数値)、currency、tax_basis、
effective_from(適用開始日)、min_order_qty(最小発注数量)
- source_ref には、シート名と行番号、またはページ番号を必ず入れてください。
【厳守事項】
- 記載がない値は null にしてください。tax_basis と currency は unknown にしてください。
他の行や一般的な慣習から補わないでください。
- 単位を換算しないでください。「1箱1,200円(12個入)」は
unit_raw を「箱」、pack_raw を「12個入」、unit_price を 1200 とし、
1個あたりの単価に直さないでください。
- 税込と書かれた単価を税抜に直さないでください。
- 「別途見積」「オープン価格」「応相談」など数値でない単価は、
unit_price を null にし、price_note に原文を写してください。
- 適用開始日が表の上部に1か所だけ書かれている場合は、
document の effective_from に入れ、各行の effective_from は null にしてください。
- 品番の表記(ハイフン、全角半角、先頭の0)を直さず、書かれたとおりに写してください。
- 単価が前回から変わったかどうかは判断しないでください。
- 価格表でない書類(見積依頼、請求書、案内状など)と判断した場合は、
rows を空にして document_type にその種類を書いてください。
【仕入先コード】{supplier_code}
【受信日】{received_date}
「単位を換算しない」は具体例まで書きます。 禁じるだけでは「比べやすいように」と割ります。例を1つ書くと止まります。
適用開始日を行に書き写させないのは、 行ごとに違う日付を書く価格表と区別するためです。どこに書かれていたかを、値の置き場所で残します。仕入先コードは出力に付け戻すためだけに渡します。
出力形式を固定する
Structured Outputs の strict: true で、次の JSON Schema に沿って受け取ります。 Responses API では text.format に type: "json_schema" と strict: true を指定します。
{
"type": "object",
"properties": {
"document_type": { "type": "string", "enum": ["price_list", "quotation", "other"] },
"supplier_code": { "type": "string" },
"effective_from": { "type": ["string", "null"] },
"tax_basis": { "type": "string", "enum": ["excluded", "included", "unknown"] },
"currency": { "type": "string", "enum": ["JPY", "USD", "EUR", "CNY", "unknown"] },
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"supplier_item_code": { "type": ["string", "null"] },
"item_name": { "type": ["string", "null"] },
"unit_raw": { "type": ["string", "null"] },
"pack_raw": { "type": ["string", "null"] },
"unit_price": { "type": ["number", "null"] },
"price_note": { "type": ["string", "null"] },
"currency": { "type": "string", "enum": ["JPY", "USD", "EUR", "CNY", "unknown"] },
"tax_basis": { "type": "string", "enum": ["excluded", "included", "unknown"] },
"effective_from": { "type": ["string", "null"] },
"min_order_qty": { "type": ["number", "null"] },
"source_ref": { "type": "string" }
},
"required": ["supplier_item_code", "item_name", "unit_raw", "pack_raw",
"unit_price", "price_note", "currency", "tax_basis",
"effective_from", "min_order_qty", "source_ref"],
"additionalProperties": false
}
}
},
"required": ["document_type", "supplier_code", "effective_from",
"tax_basis", "currency", "rows"],
"additionalProperties": false
}
Structured Outputs では、全項目を required にし、additionalProperties を false にし、値が無いことを許す項目は ["string", "null"] と書きます。
1つ目の理由は、「空」と「読み落とし」を分けられることです。 キーが抜けることはなく、null は「書かれていなかった」という意味だけになります。
2つ目は、税の扱いと通貨を文書と行の両方に持てることです。 差分シートでは行の値が unknown なら文書の値を使います。
3つ目は、source_ref で確認が速くなることです。 差分シートの行から、価格表のどのシートの何行目かにすぐ戻れます。
安全上の理由でモデルが応答を断った場合は、応答に refusal という項目が入ります。この項目があれば、取込シートに書き込まずに担当者へ知らせます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付アドレス | Email by Zapier の New Inbound Email | 転送された価格表のメールでZapを動かす |
| OpenAI API | Webhooks by Zapier(POST と Custom Request) | ファイルのアップロードと読み取りの依頼 |
| 取込シート | Google Sheets の Create Spreadsheet Row(s) with Line Item Support | JSON の行を1行ずつ書き込む |
| 差分シート | スプレッドシートの計算式 | 品番対応表と単価マスタを引いて区分を付ける |
| 購買システム | 既存のCSV取込 | 週1回、単価マスタを取り込む(従来どおり) |
取込シートへは、line items を1行にまとめず複数の行として作るアクションで書き込みます。 価格表の1品目が取込シートの1行になります。
Looping by Zapier を使わないのは意図してのことです。 ループは最大500回、後続の各アクションは1回ごとに1タスクを使い、各回は並行して実行されます。 数百行を1行ずつ処理すると、タスクが膨らみ、途中で止まったときに追いにくくなります。
差分の計算は、スプレッドシートの計算式に置きます。
| 区分 | 付ける条件 |
|---|---|
| 対応不明 | 品番対応表で自社品番が引けない |
| 単位要確認 | 単位の原文が品番対応表の単位と違い、入数でも換算できない |
| 税区分要確認 | 行と文書の税の扱いがどちらも unknown、または品番対応表の「税の書き方」と食い違う |
| 適用日待ち | 適用開始日が今日より後 |
| 単価変更 | 入数で1個あたりに直した単価が、現行単価と違う |
| 新規 | 自社品番は引けるが、単価マスタにその仕入先の行が無い |
| 変更なし | 上のどれにも当たらない |
上から順に判定します。 単位や税が怪しい行を単価変更より先に拾うのは、見た目は単価の変更だからです。 マスタにあって価格表に無い行は別欄に並べ、廃番かは人が確かめます。
単価マスタへの書き込みは、この段階では人が行います。 本格構成では、Google Sheets の Lookup Spreadsheet Row で自社品番の行を探し、Update Spreadsheet Row で単価を書き換える形が考えられます(第9章)。
人が確認する
人が開くのは、差分シートの「変更なし」以外の行だけです。 「変更なし」は件数だけを見ます。全行を見る設計にすると、第10章の12.0時間には収まりません。
- 例外の行を先に見る … 対応不明、単位要確認、税区分要確認。
source_refで価格表の該当箇所に戻り、品番対応表の側を直すのか、仕入先に問い合わせるのかを決めます - 単価変更の行を確かめる … 改定前と改定後の単価、変化の幅を見ます。変化の幅が極端な行は、単位の読み違いを疑います
- 適用日待ちの行に日付を確かめる … 反映する日を決め、その日まで差分シートに残します
- 承認の列に印を付ける … 承認した人と日時を残します
- 承認した行を単価マスタへ反映する … 改定前の単価は履歴の列へ移します
変化の幅は必ず見てください。 10倍前後や12分の1前後に変わった行は、ほとんどが入数の読み違いです。 値上げを受け入れるかどうかは、ここでは決めません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 件名に仕入先コードが無い | 処理せず、担当者へ差し戻す |
| 添付が無い、または2つ以上 | 処理せず、1通1ファイルで転送し直してもらう |
| メールが10MB以上 | 受付アドレスに届かない。圧縮せず、シートを分けて送り直す |
| 1,000行を超える価格表 | シートを分けてから転送する |
| 価格表でない書類 | document_type が other。取込シートに書かず担当者へ戻す |
| 自社品番との対応が取れない | 「対応不明」。品番対応表に行を足すかを人が決める |
| 単位の違い(箱と個) | 「単位要確認」。入数を品番対応表に足してから再計算する |
| 税抜・税込が分からない | 「税区分要確認」。仕入先に確かめ、品番対応表の「税の書き方」を埋める |
| 適用開始日が未来 | 「適用日待ち」。その日まで反映しない |
| 単価が「別途見積」 | unit_price が null。単価マスタは書き換えず、メモだけ残す |
| API が応答しない | 取込シートに書かない。Zapの実行履歴から再実行する |
大半を占めるのは単位の違いと税の扱いです。 どちらも一度品番対応表に書けば、同じ仕入先の次の価格表からは起きません。
記録を残す
- 元の価格表ファイルと、受信日時・仕入先コード・転送した人
- OpenAI API が返した JSON の全文
- 取込シートの行と、差分シートで付いた区分
- 承認した人と日時、承認しなかった行とその理由
- 単価マスタの改定前と改定後の単価、反映した日
- 仕入先ごとの例外の件数(対応不明・単位要確認・税区分要確認)
承認しなかった行を残すのは、同じ読み違いを繰り返さないためです。 仕入先ごとの例外の件数は、書式を相談する材料になります。税区分要確認が続く仕入先には、税の扱いを1行書いてもらうだけで解決します。
04実装レベルの3段階
最小構成では件数がさばけません。 1ファイルずつ貼り付け、出てきた表を手で写すので、月60件には使えません。確かめるための段階です。 本記事の想定は半自動化です。 1件45分が12分になるのはこの段階で、残る12分の大半は差分の確認と承認です。本格構成にしても、承認の時間は減りません。 減るのは反映の手作業の1分ほどです。 本格構成に進むかは、半自動化を1か月運用してから決めてください。 Update Spreadsheet Row は1回の実行で1行だけを書き換えるアクションです。承認された行ごとに実行することになるため、書き込みの失敗や行のずれを追えるだけの記録を先に整えます。 差分シートの精度が安定し、承認しなかった行がほとんど無くなってからで遅くありません。
05工数削減シミュレーション
導入後 60件 × 12分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 仕入先が数十社あり、価格表がExcelとPDFの両方で、仕入先ごとにばらばらの書式で届く製造業・商社の購買部門。価格表を単価マスタへ転記する作業が特定の担当者に張り付き、その人がいないと改定が反映されない場合。単価マスタをスプレッドシートで持っているか、購買システムへCSVで取り込める場合。
- 仕入先が数社に限られ、価格表の書式が固定されている場合。仕入先とEDIで単価をやり取りしており、転記そのものが発生しない場合。1ファイルの行数が数千行に及ぶ総合カタログを毎月受け取る場合は、分割の手間が先に立つため別の取り込み方法を検討してください。なお、値上げ要請を受け入れるかどうかの判断は、この構成の対象外です。
07最小構成で試す方法
- 先月受け取った価格表から10ファイルを選ぶ(Excel と PDF を両方入れ、単位が箱の仕入先と税込の仕入先を1つずつ入れる)
- その10ファイルについて、当時の担当者がマスタに入れた値を控えておく
- 手元のAIサービスの画面に1ファイルずつ添付する
- 「この価格表の各行を、仕入先品番・品名・単位・入数・単価・税の扱い・適用開始日・最小発注数量の列で表にしてください。書かれていない値は空欄にしてください。単位の換算や税抜への換算はしないでください」と指示する
- 出てきた表を、当時マスタに入れた値と突き合わせる
10ファイルは必ずやってください。 Zapier を組む前に、「読み取りで列がそろうのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の値と同じ列がそろった | Zapier とスプレッドシートの連携に進む |
| 箱の単価を1個あたりに直した | 指示の書き方で直る。構成は有効 |
| 税の扱いを勝手に埋めた | 指示と型(unknown)で止める。構成は有効 |
| PDFの表の行がずれた | 表の作りが原因。そのPDFの仕入先に Excel で送ってもらえないか相談する |
PDFの行ずれは珍しくありません。 罫線の無い表や1行に2品目を並べた表で起きます。仕入先に Excel をもらうほうが早く確実です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 箱の単価を1個あたりに直して返す | 換算を禁じ、具体例を指示に書く。 換算は差分シートで行う |
| 税の扱いを「たぶん税抜」で埋める | 型を unknown を含む列挙にし、指示にも明記する |
| 表の上部の適用開始日を全行に写す | 文書と行の2か所に置き場所を分ける |
| 品番のハイフンや先頭の0を直す | 書かれたとおりに写させ、照合側で表記をそろえる |
| 1,000行を超えた部分が読まれない | シートごとの上限。転送前に分ける |
| 10MB以上のメールが届かない | 受付アドレスの上限。シートを分けて送る |
| Custom Request の JSON が崩れる | 整形されずに送られる。保存前に JSON の書式を検証する |
| 行ごとのループでタスクが膨らむ | 行を展開して書き込むアクションを使い、ループを避ける |
| 単価変更に単位の読み違いが混ざる | 単位と税の区分を単価変更より先に判定する |
| 品番対応表に入数が無い | 単位要確認が増えすぎる。枚数の多い仕入先から埋める |
| 仕入先名から仕入先を推測させる | 件名の仕入先コードで人が特定する |
| 未来日の価格表をすぐ反映する | 適用日待ちの区分を作り、その日まで反映しない |
失敗のほとんどは、表の先頭の換算・税・日付の3つです。 どれもAIが親切に「整えてしまう」ことから起きます。整える作業は計算式の側に置き、AIには書かれたとおりに写させる分担を守れるかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先ごとの品番と単価、最小発注数量、適用開始日です。仕入先との取引条件そのもので、他の仕入先や競合に知られると交渉に響きます。
- 外部へ渡すのは価格表1ファイルまでにする … 単価マスタと品番対応表はAIに渡しません。どの仕入先からいくらで買っているかの一覧は外部へ出しません
- 価格表を誰でも開ける場所に置かない … 外部 URL での受け渡しは使いません
- 受付アドレスを仕入先に教えない … @zapiermail のアドレスは、届いたメールでZapが動きます。担当者の転送だけを入口にし、アドレスを社外へ出さないでください
- マスタへの反映は人が承認してからにする … 単価マスタの値は発注書の単価になります。読み違いの1行が、そのまま仕入先への発注金額になります
- 値上げの受け入れはこの構成で決めない … 差分シートは転記の結果を並べるだけです。受け入れるかどうかは、購買部の責任者が別に判断します
- 仕入先から受け取った条件の扱いを確かめる … 価格表に秘密保持の定めがある取引先は、外部の API で読ませてよいかを契約で確かめてから対象に入れます
誤りが起きた場合のリスクは、誤った単価での発注と、改定の反映漏れです。 前者は読み違いを単価変更に混ぜると起き、後者は適用日待ちの行の放置で起きます。区分の順番だけは設計で守ります。
10まず何から始めるか
1週目:品番対応表を作る
仕入先品番と自社品番の対応に、入数の列と「その仕入先の税の書き方」の列を足します。80社すべてを一度に埋める必要はありません。価格表を送ってくる回数の多い上位20社から埋めます。
2週目:10ファイルで試す
先月の価格表から10ファイルを選び、手元のAIサービスで共通の列の表にさせます。当時マスタに入れた値と突き合わせ、単位と税の扱いを勝手に換算していないかを最優先で見ます。
3週目:差分シートを作る
取込シートの形を決め、品番対応表と単価マスタを引く計算式で区分を付ける差分シートを作ります。2週目の10ファイルの結果を手で取込シートに貼り、区分が正しく付くかを確かめます。
4週目:受付アドレスから取込シートまでをつなぐ
Zapier で受付アドレスを作り、OpenAI API を呼んで取込シートに書き込むところまで作ります。この時点ではマスタに一切触れず、差分シートを見るだけにします。
2か月目: 承認の列を足し、承認した行を担当者が単価マスタへ反映する運用を始めます。承認しなかった行とその理由を毎週数えます。3か月目以降: 1件45分が何分になったかを実測し、承認しなかった行がほとんど無くなった時点で、本格構成に進むかを決めます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
スキーマに沿った応答、strict: true の指定、全項目必須と null の書き方、refusal | OpenAI: Structured Outputs | 2026-09-28 |
| PDFと表計算ファイルの受付、シートごと先頭1,000行、50MBの上限、3つの渡し方 | OpenAI: File inputs | 2026-09-28 |
| @zapiermail の受信用アドレス、10MB未満の条件、起動の遅れ | Zapier: Trigger Zap workflows from new emails | 2026-09-28 |
| POST でのファイル送信、Custom Request の用途と扱い、5MBの上限 | Zapier: Send webhooks in Zaps | 2026-09-28 |
| line items を複数の行として作るアクション | Zapier Updates: Google Sheets の line item 対応 | 2026-09-28 |
| 行の検索と更新、更新は1回1行 | Zapier: Find and update spreadsheet rows in Google Sheets | 2026-09-28 |
| 最大500回、1回ごとの1タスク、並行実行 | Zapier: Understanding Looping by Zapier | 2026-09-28 |
値上げを受け入れるかどうかの判断は、本記事の対象外です。 本記事は上の公開ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0258)についてのご相談はこちらから。
