Media > AI活用ユースケース > 購買 > 仕入先から届く価格表を読み取って、購買の単価マスタとの差分を洗い出して更新する

仕入先から届く価格表を読み取って、購買の単価マスタとの差分を洗い出して更新する

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

仕入先から届く価格表(Excel・PDF)を読み取り、仕入先品番・単位・単価・適用開始日などの共通の列に抜き出します。そのうえで単価マスタと突き合わせ、変わった行だけを差分表にして、担当者が承認したものをマスタへ反映します。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Make/Power Automate/Zapier
対象業界
商社/製造
対象部門
購買
対象業務
データ入力・転記/台帳・マスタ管理
主な課題
入力作業が多い/属人化している/確認ミスが多い
AIで行う処理
抽出
主な効果
入力漏れ削減/品質標準化/工数削減
導入難易度
★★☆☆☆
実装レベル
半自動化
費用感
ノーコード連携(中)
人間の確認
条件付き
現在工数
45h/月
AI導入後
12h/月
想定削減
73%
年間削減
396h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 共有メールアドレスに届いた価格表のファイルを、担当者が開く
  2. 列の並び、単位、税の扱い、適用開始日の書き方を読み解く
  3. 自社品番との対応表を開き、仕入先品番から自社品番を探す
  4. 単価マスタの該当行を探し、新しい単価を上書きする
  5. 変わった行に色を付け、改定前の単価をメモ欄に残す
  6. 週1回、単価マスタをCSVにして購買システムへ取り込む
導入後(After)
  1. 人共有メールアドレスに届いた価格表を、専用の受付アドレスへ転送する(1通に1ファイル)
  2. 自動メールの受信をきっかけに Zapier が動き、ファイルを OpenAI API に渡す
  3. 自動OpenAI API が価格表を読み取り、決めた列の JSON で返す
  4. 自動Zapier が JSON の行を取込シートに書き込む
  5. 自動差分シートの計算式が、品番対応表と単価マスタを引いて区分を付ける(新規/単価変更/単位要確認/税区分要確認/適用日待ち/対応不明/変更なし)
  6. 人担当者が差分シートを開き、変更のある行と例外の行だけを確かめて承認する
  7. 人承認した行を単価マスタへ反映する。適用開始日が未来の行は、その日に反映する
  8. 人週1回、単価マスタをCSVにして購買システムへ取り込む(従来どおり)
各工程の詳しい説明を読む
  1. 共有メールアドレスに届いた価格表のファイルを、担当者が開く
  2. 列の並び、単位、税の扱い、適用開始日の書き方を読み解く
  3. 自社品番との対応表を開き、仕入先品番から自社品番を探す
  4. 単価マスタの該当行を探し、新しい単価を上書きする
  5. 変わった行に色を付け、改定前の単価をメモ欄に残す
  6. 週1回、単価マスタをCSVにして購買システムへ取り込む

(a)読み解きが属人化している。 2番目の工程は、仕入先ごとの癖を知っている人にしかできません。「この仕入先は入数12の箱単価」「ここは税込で書いてくる」という知識が記録されておらず、担当者が休むと改定が止まります。

(b)転記の途中でマスタが壊れる。 4番目でマスタを直接上書きするため、行を1つずれて貼り付けると、別の品目の単価が書き換わります。 気づくのは、発注書の金額がおかしいと仕入先から連絡が来たときです。

(c)変わっていない行まで全部見ている。 単価が変わるのは一部でも、それを知るには全行を突き合わせるしかありません。

(d)未来の日付の改定が早く反映される。 「10月1日から適用」の価格表を9月中に受け取り、そのままマスタを上書きすると、9月の発注が新単価で出ます。 逆に、反映を後回しにして忘れることもあります。

  1. 【人】 共有メールアドレスに届いた価格表を、専用の受付アドレスへ転送する(1通に1ファイル)
  2. 【自動】 メールの受信をきっかけに Zapier が動き、ファイルを OpenAI API に渡す
  3. 【自動】 OpenAI API が価格表を読み取り、決めた列の JSON で返す
  4. 【自動】 Zapier が JSON の行を取込シートに書き込む
  5. 【自動】 差分シートの計算式が、品番対応表と単価マスタを引いて区分を付ける(新規/単価変更/単位要確認/税区分要確認/適用日待ち/対応不明/変更なし)
  6. 【人】 担当者が差分シートを開き、変更のある行と例外の行だけを確かめて承認する
  7. 【人】 承認した行を単価マスタへ反映する。適用開始日が未来の行は、その日に反映する
  8. 【人】 週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で購買システムへ
役割想定する製品代替候補
ワークフローZapierMake、Power Automate
生成AIOpenAI APIClaude 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どうやって実装するのか

Step1

処理の起点を決める

受付アドレスにメールが届いたことを起点にします。 Email by Zapier の New Inbound Email で @zapiermail のアドレスを作り、購買部の共有メールアドレスから担当者がそこへ転送します。 仕入先に受付アドレスを直接教えることはしません。価格表以外のメールが混ざり、どの仕入先からのものかも分からなくなるためです。

転送は1通に1ファイルとします。 1回の実行で1ファイルを扱うと、失敗したときにどのファイルが止まったかがすぐに分かります。

転送時に件名の先頭へ仕入先コードを付けます(例:[S-0412] 価格改定のお知らせ)。仕入先の特定は人の役目で、社名からAIに推測させません。

Step2

入力データを集める

データ中身取得元
価格表ファイルExcel(.xlsx/.xls)、CSV、PDF受付アドレスに届いたメールの添付
仕入先コード件名の先頭の [S-xxxx]転送したメールの件名
受信日時メールの受信日時Email by Zapier
品番対応表仕入先コード、仕入先品番、自社品番、入数、その仕入先の税の書き方スプレッドシート
単価マスタ自社品番、仕入先コード、現行単価、単位、適用開始日スプレッドシート

AIに渡すのは価格表ファイル・仕入先コード・受信日の3つまでです。 品番対応表と単価マスタは差分シートの計算式だけが引きます。品番対応表の「入数」と「税の書き方」の列は、担当者の頭の中にあった仕入先ごとの癖を書き出したもので、この構成の質を決めます。

Step3

データの取得方法を決める

Zapier から OpenAI API を呼ぶ部分は、Webhooks by Zapier で組みます。 2つのステップに分けます。

ステップ方式内容
① ファイルのアップロードWebhooks by Zapier の POST添付ファイルを Files API へ送り、file_id を受け取る
② 読み取りの依頼Webhooks by Zapier の Custom RequestResponses 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ファイルを通して確かめてから組み上げてください。

Step4

AIへ渡す前に整形する

  1. 件名の確認 … 先頭に [S-xxxx] の仕入先コードがなければ、処理せずに担当者へ戻します
  2. 添付の確認 … 添付が1つでなければ、処理せずに担当者へ戻します
  3. 形式の確認 … .xlsx .xls .csv .pdf 以外は処理しません。画像で届いた価格表はPDFにしてから転送します
  4. サイズの確認 … メールは添付を含めて10MB未満が条件です。超えるものは受付アドレスに届きません
  5. 行数の確認 … 表計算ファイルはシートごとに先頭1,000行までが読まれます。超える価格表はシートを分けてから転送します
  6. 重複の確認 … 同じ仕入先コードと同じファイル名の処理記録が直近にあれば、二重に取り込まないよう印を付けます

行数の確認を省くと、1,000行を超えた部分が差分シートで「価格表に無い行」に見え、廃番と区別がつかなくなります。

Step5

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円」と返した瞬間、単位の情報が消えます。

Step6

指示内容を固定する

あなたは購買部門で、仕入先から届いた価格表を転記用の表に整える担当です。
添付の価格表だけを見て、各行を指定の列に並べてください。推測で埋めないでください。

【やること】
- 価格表に載っている品目を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つ書くと止まります。

適用開始日を行に書き写させないのは、 行ごとに違う日付を書く価格表と区別するためです。どこに書かれていたかを、値の置き場所で残します。仕入先コードは出力に付け戻すためだけに渡します。

Step7

出力形式を固定する

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 という項目が入ります。この項目があれば、取込シートに書き込まずに担当者へ知らせます。

Step8

システムへ連携する

つなぎ先方式内容
受付アドレスEmail by Zapier の New Inbound Email転送された価格表のメールでZapを動かす
OpenAI APIWebhooks by Zapier(POST と Custom Request)ファイルのアップロードと読み取りの依頼
取込シートGoogle Sheets の Create Spreadsheet Row(s) with Line Item SupportJSON の行を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章)。

Step9

人が確認する

人が開くのは、差分シートの「変更なし」以外の行だけです。 「変更なし」は件数だけを見ます。全行を見る設計にすると、第10章の12.0時間には収まりません。

  1. 例外の行を先に見る … 対応不明、単位要確認、税区分要確認。source_ref で価格表の該当箇所に戻り、品番対応表の側を直すのか、仕入先に問い合わせるのかを決めます
  2. 単価変更の行を確かめる … 改定前と改定後の単価、変化の幅を見ます。変化の幅が極端な行は、単位の読み違いを疑います
  3. 適用日待ちの行に日付を確かめる … 反映する日を決め、その日まで差分シートに残します
  4. 承認の列に印を付ける … 承認した人と日時を残します
  5. 承認した行を単価マスタへ反映する … 改定前の単価は履歴の列へ移します

変化の幅は必ず見てください。 10倍前後や12分の1前後に変わった行は、ほとんどが入数の読み違いです。 値上げを受け入れるかどうかは、ここでは決めません。

Step10

例外に対処する

起きること対応
件名に仕入先コードが無い処理せず、担当者へ差し戻す
添付が無い、または2つ以上処理せず、1通1ファイルで転送し直してもらう
メールが10MB以上受付アドレスに届かない。圧縮せず、シートを分けて送り直す
1,000行を超える価格表シートを分けてから転送する
価格表でない書類document_type が other。取込シートに書かず担当者へ戻す
自社品番との対応が取れない「対応不明」。品番対応表に行を足すかを人が決める
単位の違い(箱と個)「単位要確認」。入数を品番対応表に足してから再計算する
税抜・税込が分からない「税区分要確認」。仕入先に確かめ、品番対応表の「税の書き方」を埋める
適用開始日が未来「適用日待ち」。その日まで反映しない
単価が「別途見積」unit_price が null。単価マスタは書き換えず、メモだけ残す
API が応答しない取込シートに書かない。Zapの実行履歴から再実行する

大半を占めるのは単位の違いと税の扱いです。 どちらも一度品番対応表に書けば、同じ仕入先の次の価格表からは起きません。

Step11

記録を残す

  • 元の価格表ファイルと、受信日時・仕入先コード・転送した人
  • OpenAI API が返した JSON の全文
  • 取込シートの行と、差分シートで付いた区分
  • 承認した人と日時、承認しなかった行とその理由
  • 単価マスタの改定前と改定後の単価、反映した日
  • 仕入先ごとの例外の件数(対応不明・単位要確認・税区分要確認)

承認しなかった行を残すのは、同じ読み違いを繰り返さないためです。 仕入先ごとの例外の件数は、書式を相談する材料になります。税区分要確認が続く仕入先には、税の扱いを1行書いてもらうだけで解決します。

04実装レベルの3段階

最小構成:価格表を手でAIの画面に添付し、共通の列の表にさせる / 1ファイルごとの読み取り
半自動化:上記+受付アドレスを起点に Zapier で動かし、取込シートと差分シートまで自動で作る。マスタへの反映は人 / 読み取り、差分の洗い出し、例外の区分け
本格構成:上記+承認した行を Lookup Spreadsheet Row と Update Spreadsheet Row で単価マスタに書き込み、適用日待ちの行もその日に反映する / 承認後のマスタ更新まで

最小構成では件数がさばけません。 1ファイルずつ貼り付け、出てきた表を手で写すので、月60件には使えません。確かめるための段階です。 本記事の想定は半自動化です。 1件45分が12分になるのはこの段階で、残る12分の大半は差分の確認と承認です。本格構成にしても、承認の時間は減りません。 減るのは反映の手作業の1分ほどです。 本格構成に進むかは、半自動化を1か月運用してから決めてください。 Update Spreadsheet Row は1回の実行で1行だけを書き換えるアクションです。承認された行ごとに実行することになるため、書き込みの失敗や行のずれを追えるだけの記録を先に整えます。 差分シートの精度が安定し、承認しなかった行がほとんど無くなってからで遅くありません。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
60 件
1件あたり現在時間
45 分
1件あたり導入後時間
12 分
現在  60件 × 45分 ÷ 60 = 45 時間/月
導入後 60件 × 12分 ÷ 60 = 12 時間/月
月間削減時間
33h
削減率
73%
年間削減時間
396h
年間金額換算(時間単価3,000円)
119万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 仕入先が数十社あり、価格表がExcelとPDFの両方で、仕入先ごとにばらばらの書式で届く製造業・商社の購買部門。価格表を単価マスタへ転記する作業が特定の担当者に張り付き、その人がいないと改定が反映されない場合。単価マスタをスプレッドシートで持っているか、購買システムへCSVで取り込める場合。
向いていない
  1. 仕入先が数社に限られ、価格表の書式が固定されている場合。仕入先とEDIで単価をやり取りしており、転記そのものが発生しない場合。1ファイルの行数が数千行に及ぶ総合カタログを毎月受け取る場合は、分割の手間が先に立つため別の取り込み方法を検討してください。なお、値上げ要請を受け入れるかどうかの判断は、この構成の対象外です。

07最小構成で試す方法

  1. 先月受け取った価格表から10ファイルを選ぶ(Excel と PDF を両方入れ、単位が箱の仕入先と税込の仕入先を1つずつ入れる)
  2. その10ファイルについて、当時の担当者がマスタに入れた値を控えておく
  3. 手元のAIサービスの画面に1ファイルずつ添付する
  4. 「この価格表の各行を、仕入先品番・品名・単位・入数・単価・税の扱い・適用開始日・最小発注数量の列で表にしてください。書かれていない値は空欄にしてください。単位の換算や税抜への換算はしないでください」と指示する
  5. 出てきた表を、当時マスタに入れた値と突き合わせる

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. 外部へ渡すのは価格表1ファイルまでにする … 単価マスタと品番対応表はAIに渡しません。どの仕入先からいくらで買っているかの一覧は外部へ出しません
  2. 価格表を誰でも開ける場所に置かない … 外部 URL での受け渡しは使いません
  3. 受付アドレスを仕入先に教えない … @zapiermail のアドレスは、届いたメールでZapが動きます。担当者の転送だけを入口にし、アドレスを社外へ出さないでください
  4. マスタへの反映は人が承認してからにする … 単価マスタの値は発注書の単価になります。読み違いの1行が、そのまま仕入先への発注金額になります
  5. 値上げの受け入れはこの構成で決めない … 差分シートは転記の結果を並べるだけです。受け入れるかどうかは、購買部の責任者が別に判断します
  6. 仕入先から受け取った条件の扱いを確かめる … 価格表に秘密保持の定めがある取引先は、外部の API で読ませてよいかを契約で確かめてから対象に入れます

誤りが起きた場合のリスクは、誤った単価での発注と、改定の反映漏れです。 前者は読み違いを単価変更に混ぜると起き、後者は適用日待ちの行の放置で起きます。区分の順番だけは設計で守ります。

10まず何から始めるか

1週目:品番対応表を作る

仕入先品番と自社品番の対応に、入数の列と「その仕入先の税の書き方」の列を足します。80社すべてを一度に埋める必要はありません。価格表を送ってくる回数の多い上位20社から埋めます。

2週目:10ファイルで試す

先月の価格表から10ファイルを選び、手元のAIサービスで共通の列の表にさせます。当時マスタに入れた値と突き合わせ、単位と税の扱いを勝手に換算していないかを最優先で見ます。

3週目:差分シートを作る

取込シートの形を決め、品番対応表と単価マスタを引く計算式で区分を付ける差分シートを作ります。2週目の10ファイルの結果を手で取込シートに貼り、区分が正しく付くかを確かめます。

4週目:受付アドレスから取込シートまでをつなぐ

Zapier で受付アドレスを作り、OpenAI API を呼んで取込シートに書き込むところまで作ります。この時点ではマスタに一切触れず、差分シートを見るだけにします。

2か月目: 承認の列を足し、承認した行を担当者が単価マスタへ反映する運用を始めます。承認しなかった行とその理由を毎週数えます。3か月目以降: 1件45分が何分になったかを実測し、承認しなかった行がほとんど無くなった時点で、本格構成に進むかを決めます。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-09-28/最終更新:2026-09-28
確認した内容情報源確認日
スキーマに沿った応答、strict: true の指定、全項目必須と null の書き方、refusalOpenAI: Structured Outputs2026-09-28
PDFと表計算ファイルの受付、シートごと先頭1,000行、50MBの上限、3つの渡し方OpenAI: File inputs2026-09-28
@zapiermail の受信用アドレス、10MB未満の条件、起動の遅れZapier: Trigger Zap workflows from new emails2026-09-28
POST でのファイル送信、Custom Request の用途と扱い、5MBの上限Zapier: Send webhooks in Zaps2026-09-28
line items を複数の行として作るアクションZapier Updates: Google Sheets の line item 対応2026-09-28
行の検索と更新、更新は1回1行Zapier: Find and update spreadsheet rows in Google Sheets2026-09-28
最大500回、1回ごとの1タスク、並行実行Zapier: Understanding Looping by Zapier2026-09-28

値上げを受け入れるかどうかの判断は、本記事の対象外です。 本記事は上の公開ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0258)についてのご相談はこちらから。

AI活用について相談する
目次