毎月の発注データから仕入先別・品目別の単価の動きを集計し、前回より上がった品目を拾って、理由の確認依頼の文を購買担当に下書きする
前月の発注データを仕入先別・品目別にそろえ、前回の発注単価と合意済みの単価に並べて、上がった品目を拾います。値上げの通知や数量の違いで説明がつくかをAIが判定し、説明のつかないものだけを仕入先への確認依頼として下書きします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate/Python
- 対象業界
- 商社/建設/製造
- 対象部門
- 購買
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- データ分析に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、生産管理システムから前月の発注明細をCSVで書き出し、スプレッドシートに貼る
- 担当の仕入先の行を並べ替え、品目ごとに前回の発注単価を過去の明細から探して横に書く
- 上がっている行に色を付ける
- 色の付いた行について、値上げの通知の書類、メール、自分のメモを探し、説明がつくかを見る
- 数量が少ない月や、規格が変わった品目は、見積書を開いて単価の条件を確かめる
- 説明のつかないものを仕入先ごとにまとめ、理由を聞くメールを書く
- 返事が来たら、合意の記録に単価と理由を書く
- 人月初に、生産管理システムから前月の発注明細をCSVで書き出し、決まったフォルダに置く
- 自動毎月3日の朝、スクリプトがCSVを読み、仕入先×品目の行にそろえる
- 自動品目マスタの換算で単位をそろえ、前回の発注単価と、合意の記録の有効な単価を並べる
- 自動前回比と合意単価との差を計算し、決めた幅を超えて上がった行を拾う
- 自動拾った行と、その仕入先の値上げ通知の記録・数量の区分・規格を Gemini API に渡し、説明がつくかを判定させる
- 自動説明のつかない行を仕入先ごとにまとめ、理由の確認依頼の文を下書きさせる
- 自動判定の一覧をシートに書き、仕入先ごとの確認依頼を Gmail の下書きにする
- 人購買担当が一覧を見て、判定を確かめ、送る下書きを直して送る
- 人仕入先の返事を受けて、合意の記録に単価と理由を書く
各工程の詳しい説明を読む
- 月初に、生産管理システムから前月の発注明細をCSVで書き出し、スプレッドシートに貼る
- 担当の仕入先の行を並べ替え、品目ごとに前回の発注単価を過去の明細から探して横に書く
- 上がっている行に色を付ける
- 色の付いた行について、値上げの通知の書類、メール、自分のメモを探し、説明がつくかを見る
- 数量が少ない月や、規格が変わった品目は、見積書を開いて単価の条件を確かめる
- 説明のつかないものを仕入先ごとにまとめ、理由を聞くメールを書く
- 返事が来たら、合意の記録に単価と理由を書く
(a)前回の単価を探すところで時間が尽きる。 品目コードで過去の明細を引いても、前回の発注が半年前だったり、単位が「本」と「kg」で違ったりします。2番目の作業が全体の時間の多くを占め、4番目以降に届く前に月の半ばになります。
(b)知っている値上げと知らない値上げが混ざる。 「この仕入先は4月に5%上げると言っていた」という記憶で、仕入先の行をまとめて流すことがあります。通知の対象は鋼材だけだったのに、同じ仕入先の加工品まで上がっていた、という例を見落とします。
(c)小ロットと規格の違いを値上げと取り違える。 試作で10個だけ買った月は、単価が量産のときの倍になります。数量の区分を見ずに比べると、聞かなくてよい問い合わせを仕入先に送ることになります。 仕入先にとっても手間で、何度か続くと購買課の点検そのものが信用されなくなります。
(d)聞くかどうかが担当者で違う。 1%の上昇でも聞く担当者と、10%までは流す担当者がいます。
- 【人】 月初に、生産管理システムから前月の発注明細をCSVで書き出し、決まったフォルダに置く
- 【自動】 毎月3日の朝、スクリプトがCSVを読み、仕入先×品目の行にそろえる
- 【自動】 品目マスタの換算で単位をそろえ、前回の発注単価と、合意の記録の有効な単価を並べる
- 【自動】 前回比と合意単価との差を計算し、決めた幅を超えて上がった行を拾う
- 【自動】 拾った行と、その仕入先の値上げ通知の記録・数量の区分・規格を Gemini API に渡し、説明がつくかを判定させる
- 【自動】 説明のつかない行を仕入先ごとにまとめ、理由の確認依頼の文を下書きさせる
- 【自動】 判定の一覧をシートに書き、仕入先ごとの確認依頼を Gmail の下書きにする
- 【人】 購買担当が一覧を見て、判定を確かめ、送る下書きを直して送る
- 【人】 仕入先の返事を受けて、合意の記録に単価と理由を書く
8番目が人の仕事として残る部分です。 AIの判定で「説明がつく」とされた行も、担当者は一覧で根拠を流し見ます。送るかどうかを決めるのは担当者で、仕入先との関係を知っているのも担当者です。
4番目の「上がった」は、スクリプトの式だけで決めます。 AIに「上がったかどうか」を判断させると、単位の換算や端数の扱いで答えが毎月揺れます。引き算で分かることは引き算で決め、AIには記録との照らし合わせだけをさせます。
02今回想定するシステム構成
生産管理システム ── 前月の発注明細(CSV) ▼ 決まったフォルダに置く 【トリガー】時間主導型(毎月3日の朝) Google Apps Script ├──▶ CSVの読み込み、仕入先×品目へのそろえ、単位の換算 ├──▶ 前回の発注単価・合意単価との比較(式で計算) ▼ Gemini API(有料の枠、構造化出力) │ ① 上がった行に説明がつくかの判定(通知・数量の区分・規格) │ ② 説明のつかない行の確認依頼の下書き ▼ Google Apps Script ── 判定の一覧のシート、Gmail の下書き ▼ 【購買担当が確かめて送り、返事を合意の記録に書く】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 生成AI | Gemini API(有料の枠、構造化出力) | Claude API、OpenAI API |
| シート | Google スプレッドシート(発注明細・合意の記録・値上げ通知の記録・判定の一覧) | Microsoft 365 のブック |
| メール | Gmail(確認依頼の下書き) | Outlook |
新しく足すのは、スクリプトと Gemini API の契約、それに値上げ通知の記録のシートです。 生産管理システムには書き込みません。合意の記録も、スクリプトは読むだけです。 単価を書き換えるのは、仕入先と話した購買担当です。
土台になるのは、Google Apps Script の時間主導型のトリガーです。 毎分から毎月までの間隔で関数を動かせ、インストール型トリガーは作成した人のアカウントで実行されます。 発注明細のフォルダと合意の記録を読める購買課の担当者のアカウントで作ります。失敗したときは、失敗の概要を知らせるメールが届きます。
スクリプトの実行時間には上限があります。 1回の実行は6分まで、トリガーの合計の実行時間は Google Workspace のアカウントで1日6時間、外部へのURLの呼び出しは1日100,000回までとされています。720行すべてをAIに渡すわけではなく、渡すのは上がった行だけなので、1回の実行に収まる量です。 それでも仕入先ごとに区切り、途中で止まっても続きから再開できるようにします。
CSVは Utilities の parseCsv で2次元の配列にします。 区切り文字を指定する形もあるので、タブ区切りで書き出すシステムにも合わせられます。
Gemini API は有料の枠で使います。 規約では、有料のサービスでは送ったプロンプトと応答を製品の改善に使わないとされ、無料のサービスには機密の情報を送らないよう書かれています。 仕入先ごとの単価は、取引の条件そのものです。
構造化出力は、いまの公式の書き方に合わせます。 /v1beta/interactions に response_format を付け、mime_type を application/json、schema にJSONスキーマを入れます。判定の区分は enum で列挙します。値の正しさはアプリケーションで確かめるよう公式にも書かれているので、返ってきた単価や率はスクリプトの計算と照らします。
03どうやって実装するのか
処理の起点を決める
時間主導型のトリガーを、毎月3日の朝7時台に1つ置きます。 月末に入った発注の単価が生産管理システムで確定し、CSVが書き出されるのを待つためです。1日や2日に動かすと、月末の発注が半分しか入っていない明細を点検することになります。
CSVがフォルダに無ければ、スクリプトは何もせずに購買課へ「前月の発注明細がまだありません」とだけ知らせ、翌朝の同じ時刻にもう一度見に行きます。 置いたファイルの名前に対象の年月を入れる決まりにし、前々月のファイルを読み違えないようにします。
処理は仕入先ごとに区切ります。 1社分のそろえ・比較・判定・下書きを1まとまりにし、どの仕入先まで終わったかをスクリプト プロパティに残します。 1回の実行が5分を過ぎたら区切り、15分後に置いた続きのトリガーで残りから再開します。
月の途中でも、対象の仕入先と期間を設定のシートに書けば手で動かせるようにします。 大きな値上げの通知が届いた直後に、その仕入先だけ見たいときがあるからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 発注明細 | 発注番号、発注日、仕入先コード、品目コード、品名、規格、数量、単位、単価、通貨 | 生産管理システムのCSV |
| 品目マスタ | 品目コード、基本の単位、単位の換算(1箱=何個、1本=何kg)、数量の区分の境目 | 品目マスタのシート |
| 合意の記録 | 仕入先、品目、合意単価、数量の区分、有効開始日、合意した日、担当者 | 合意の記録のシート |
| 値上げ通知の記録 | 受け付けた日、仕入先、対象の品目または品目の群、改定の率または新単価、適用日、通知の文面、協議の状況 | 値上げ通知の記録のシート |
| 過去の発注明細 | 直近12か月分の同じ仕入先×品目の発注単価と数量 | 過去のCSVを積んだシート |
質を決めるのは、値上げ通知の記録です。 届いた通知を受け付けた日に1行書き、通知の文面をそのまま貼る欄を設けます。 「鋼材全般」「加工品のうち材料費の比率が高いもの」のように品目を名指ししない通知が多いので、AIは文面と品目の情報を照らして、対象に入るかを判定します。口頭で聞いた値上げも、聞いた担当者が1行書きます。 書かれていない値上げは、この構成からは「説明がつかない」に見えます。
AIに渡すのは、上がった行と、その仕入先の通知の記録だけです。 単価が変わっていない行や下がった行は渡しません。他の仕入先の単価も渡しません。
データの取得方法を決める
発注明細は、決まったフォルダから対象の年月の名前のファイルを探して読みます。文字コードは生産管理システムの書き出しに合わせ、読み込んだ直後に行数と金額の合計を数えて、システムの画面の数字と照らせるようにログに残します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前月の発注明細 | フォルダのCSV | 点検の対象 |
| 直近12か月の同じ仕入先×品目の単価 | 過去の明細のシート | 前回の発注単価、数量の区分ごとの前回 |
| 有効な合意単価 | 合意の記録 | 発注日の時点で有効だった単価 |
| その仕入先の通知 | 値上げ通知の記録 | 説明がつくかの照らし合わせ |
| 単位の換算と数量の区分 | 品目マスタ | 単価を同じ物差しにそろえる |
「前回」は、同じ数量の区分の中で一番新しい発注にします。 量産の100個と試作の10個を比べないためです。同じ区分の発注が12か月に無いときは「前回なし」とし、合意単価とだけ比べます。
合意単価は、発注日の時点で有効だったものを引きます。 有効開始日が発注日より後の合意は、その発注には当てはめません。4月1日から有効の新単価を、3月28日の発注に当てはめると、値上げが無かったように見えます。
Gemini API の鍵はスクリプト プロパティに置き、UrlFetchApp で呼びます。 muteHttpExceptions を true にして、失敗の状態コードでも応答を受け取り、送り直すかを決めます。 下書きは GmailApp の createDraft で作り、宛先・件名・本文と、cc に購買課の共有アドレスを入れます。
AIへ渡す前に整形する
- 行のそろえ … 同じ月に同じ仕入先×品目の発注が複数あれば、数量の区分ごとに1行にまとめ、単価が違う発注があれば別の行のまま残します
- 単位の換算 … 「箱」「本」「m」で書かれた単価を、品目マスタの換算で基本の単位あたりにそろえます。換算の無い単位は「換算不能」として比較から外し、件数を数えます
- 通貨の確認 … 外貨建ての行は、比較を外貨のまま行います。円に直してから比べると、為替の動きが値上げに見えます
- 数量の区分 … 品目マスタの境目で、各行に「小ロット」「通常」「大口」を付けます
- 前回と合意単価の引き当て … 前の節の決め方で、前回の発注単価と有効な合意単価を横に並べます
- 上昇の計算 … 前回比の率と、合意単価との差を出します。どちらかが設定の幅(既定は前回比3%以上、または合意単価より高い)を超えた行を拾います
- 規格の違いの印 … 品名や規格の文字列が前回と違う行に印を付けます
- 伏せる処理 … 通知の文面に書かれた先方の担当者の氏名と電話番号を、AIに渡す前に伏せます
3番目を軽く見ないでください。 為替が動いた月に円換算で比べると、外貨建ての仕入先がすべて値上げしたように並びます。仕入先は単価を変えていないので、聞かれても答えようがありません。
6番目の幅は、設定のシートで変えられるようにします。 3%は出発点で、拾う行が多すぎる月は品目の群ごとに幅を分けます。幅を決めるのは購買課の課長で、決めた幅と変えた日を記録します。
AIに処理させる
させるのは2つです。 1つ目は、拾った行それぞれについて、上昇に説明がつくかを決めた区分から選ぶこと。2つ目は、説明のつかない行を仕入先ごとにまとめた確認依頼の下書きです。
| 判定の区分 | 中身 | 根拠として写すもの |
|---|---|---|
notified | 値上げの通知の対象に入り、率または新単価と適用日が合う | 通知の文面の該当箇所 |
notified_mismatch | 通知はあるが、率が違う・適用日より前の発注・対象の品目か分からない | 通知の文面と食い違う点 |
lot_or_spec | 数量の区分か規格の違いで説明がつきそう | 区分や規格の文字列 |
data_issue | 単位の書き違い・桁の誤りが疑われる | 疑う理由(前回の何倍か) |
unexplained | どの記録にも当たらない | — |
notified_mismatch を分けているのが、この構成の分かれ目です。 通知が「5%」なのに8%上がっている、適用日の前の発注から上がっている、というものは、通知があるからと流すと見落とします。通知がある仕入先ほど、まとめて流されやすいからです。
data_issue も分けます。 前回の10倍の単価は、値上げではなく単位の入力の誤りであることがほとんどです。仕入先に聞く前に、社内の入力を確かめる行です。
| させないこと | 理由 |
|---|---|
| 単価の上昇の計算・やり直し | 式で出した率を変えさせない。担当者に説明できなくなる |
| 単価が妥当かどうかの評価 | 相場や原価を知らないAIの意見は根拠にならない |
| 値上げを受け入れるか断るかの判断 | 購買担当と仕入先が協議して決める |
| 通知の文面に無い理由の推測 | 「原材料の高騰によるものと思われます」と書くと、聞く前に答えを決めることになる |
| 仕入先の評価 | 確認依頼の目的と違う |
いちばん起きやすい失敗は4行目です。 説明のつかない行について、AIは「エネルギー価格の上昇の影響と考えられます」のような一般論で埋めたがります。それを書いた瞬間、聞くべき行が説明のついた行に見えます。 説明の根拠は、渡した記録の中の文字列に限ります。
指示内容を固定する
1つ目の指示(判定)は次のとおりです。
あなたは製造業の購買課で、前月の発注単価を点検する立場です。
単価が上がった行それぞれについて、渡した記録の中に説明があるかを判定してください。
上がった率と差額は、すでにスクリプトが計算しています。
【区分】
- notified .......... 値上げ通知の対象に入り、率または新単価と適用日が合う
- notified_mismatch . 通知はあるが、率・適用日・対象のどれかが合わない、または対象か分からない
- lot_or_spec ....... 数量の区分または規格が前回と違い、それで説明がつきそう
- data_issue ........ 単位の書き違い・桁の誤りが疑われる(前回の数倍以上など)
- unexplained ....... 渡した記録のどれにも当たらない
【厳守事項】
- 渡した記録(値上げ通知の記録、数量の区分、規格)だけを根拠にしてください。
- 記録に無い理由(市況、為替、エネルギー価格、人件費など)を推測で書かないでください。
- 率や差額を計算し直したり、丸めたりしないでください。出力にも含めません。
- 通知の率と実際の率が合わないときは notified にしないでください。
- 通知の適用日より前の発注は notified にしないでください。
- 迷ったら unexplained ではなく notified_mismatch を選び、どこが分からないかを書いてください。
- evidence には、判定の根拠にした文字列を記録からそのまま写してください。
- 単価が妥当か、受け入れるべきかを書かないでください。
- 入力の line_id をそのまま返し、行を増やしたり減らしたりしないでください。
【上がった行(line_id、品目、規格、数量の区分、前回単価、今回単価、上昇率、発注日)】{rows}
【この仕入先の値上げ通知の記録】{notices}
2つ目の指示(確認依頼の下書き)は次のとおりです。
あなたは製造業の購買課の担当者として、仕入先に単価の変更の理由を伺うメールを下書きします。
対象は、社内の記録で変更の理由が確認できなかった品目だけです。
【書くこと】
1. 前月の発注で、次の品目の単価が前回と異なっていたこと(品目、前回単価、今回単価、発注番号)
2. 社内の記録で、変更の理由と適用日が確認できていないこと
3. 変更の理由と適用日、今後の単価を教えていただきたいこと
4. 必要であれば、打合せの場を設けたいこと
【厳守事項】
- 数字は入力の値をそのまま書いてください。計算し直したり丸めたりしないでください。
- 値上げを断る・受け入れられないといった表現を書かないでください。
- 値上げの理由を推測で書かないでください。
- 「誤請求」「間違い」と決めつけないでください。理由を伺う文面にしてください。
- 1通に入れる品目は、渡した行だけにしてください。
【仕入先名と担当者の呼び方】{supplier}
【説明のつかなかった行】{rows}
【自社の担当者の署名】{signature}
「迷ったら notified_mismatch」と書いているのは、unexplained と notified の二択にすると、通知のある仕入先の行を notified に寄せるからです。 通知の存在を、その行の説明と取り違えないようにします。
下書きの指示で「断る表現を書かない」を入れるのは、取引の法令に関わるからです。 公正取引委員会の取適法の説明には、協議に応じない一方的な代金決定の禁止が挙げられています。この構成の確認依頼は、理由を伺い、話し合う場をつくるための文面です。
出力形式を固定する
判定は次の形で受け取ります。 category は5つの区分を enum で列挙します。
{
"supplier_code": "S0412",
"results": [
{
"line_id": "2026-09-S0412-M10233-normal",
"category": "notified_mismatch",
"evidence": "2026年10月1日出荷分より、鋼材価格を5%改定",
"unclear_point": "発注日が9月18日で、適用日より前",
"needs_contact": true
}
]
}
確認依頼の下書きは次の形で受け取ります。
{
"supplier_code": "S0412",
"subject": "",
"body": "",
"line_ids": ["2026-09-S0412-M10233-normal"]
}
1つ目の理由は、line_id で入力と出力を突き合わせられることです。 送った行と返った行の数が合わなければ、その仕入先のまとまりを送り直します。下書きの line_ids も、needs_contact が true の行と同じかを確かめます。 判定で説明がついた行が下書きに入っていたら、その下書きは作り直します。
2つ目は、evidence を通知の記録と照らせることです。 スクリプトは evidence の文字列が、渡した通知の文面に実際に含まれているかを確かめます。含まれていなければ、その判定を unexplained に戻し、担当者の確認に回します。
3つ目は、下書きの本文の数字を照らせることです。 本文から単価と発注番号を正規表現で取り出し、入力の値と1つでも違えば作り直します。
一覧のシートには、仕入先×品目ごとに次の列を並べます。
| 列 | 中身 | 書く主体 |
|---|---|---|
| 前回単価・合意単価・今回単価・上昇率 | 式で計算した値 | スクリプト |
| 判定の区分と根拠 | category、evidence、unclear_point | AI |
| 確認依頼の要否 | needs_contact | AI(担当者が変えられる) |
| 担当者の判断 | 送った/送らない/社内で確認 と理由 | 人 |
| 仕入先の返事と合意の記録への反映 | 返事の要旨、反映した日 | 人 |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 発注明細のフォルダ | 読み取りのみ | 前月のCSV |
| 品目マスタ・合意の記録・値上げ通知の記録 | 読み取りのみ | 換算、合意単価、通知 |
| Gemini API | UrlFetchApp で呼び出し | 判定と確認依頼の下書き |
| 判定の一覧のシート | 書き込み | 計算・判定・担当者の判断の欄 |
| Gmail | 下書きの作成 | 仕入先ごとの確認依頼 |
生産管理システムと合意の記録には書き込みません。 単価を直すのは、仕入先と話した担当者です。AIの判定で合意の記録が書き換わると、誰がいつ合意した単価かが分からなくなります。
確認依頼は下書きまでにします。 担当者が仕入先との関係を見て、まとめて聞くか、次の打合せで聞くかを決めます。
人が確認する
data_issueを先に見る … 社内の入力の誤りなら、発注のやり直しや検収の訂正で済みます。仕入先に聞く前に片づけますnotified_mismatchを見る … 通知の文面と食い違う点を読み、通知の読み違いか、仕入先への確認が要るかを決めますunexplainedの下書きを読む … 品目と数字を確かめ、送る相手と時期を決めますnotifiedとlot_or_specを流し見る … 根拠の文字列だけを読み、違和感のあるものだけ開きます- 送る … 仕入先ごとに、下書きを直して送ります
- 返事を記録する … 合意した単価と理由を、合意の記録と一覧のシートに書きます
4番目を省かないでください。 説明がついたとされた行の中に、通知の範囲を広く読みすぎたものが混ざります。根拠の文字列を読めば、数秒で気づけます。
目標は、720行をならして1行1分です。 開いて読むのは上がった行のうち説明のつかないものと食い違いのあるもので、残りは一覧で根拠を流し見るだけ、という想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVがフォルダに無い | 購買課に知らせ、翌朝もう一度見に行く |
| 行数や金額の合計がシステムの画面と合わない | 処理を止め、書き出しのやり直しを頼む |
| 換算の無い単位 | 比較から外し「換算不能」として数える。品目マスタに換算を足す |
| 同じ区分の前回が12か月に無い | 「前回なし」とし、合意単価とだけ比べる |
| 合意単価も前回も無い新しい品目 | 判定せず「新規品目」として一覧に載せる |
evidence が通知の文面に無い | 判定を unexplained に戻し、担当者の確認に回す |
| 下書きの数字が入力と合わない | 作り直す。2回合わなければ数字の表だけの下書きにする |
| API が失敗の状態コードを返す | 最大2回送り直し、だめならその仕入先を翌朝に回す |
| 6分に近づいた | どこまで終わったかを記録し、続きのトリガーで再開 |
5行目の新規品目は、判定の対象にしません。 比べる相手が無い単価に「上がった」も「説明がつく」もありません。新規品目は、見積の段階で合意の記録に書く運用を先に決めます。
記録を残す
- 処理した月、読み込んだCSVのファイル名と行数・金額の合計
- 仕入先×品目ごとの前回単価・合意単価・今回単価・上昇率と、そのとき使った上昇の幅
- 判定の結果(
category、evidence、unclear_point) - 作った下書きと、送ったかどうか、送った日
- 担当者が判定を変えた記録(どの行を、どの区分に変えたか)
- 仕入先の返事の要旨と、合意の記録に反映した日
担当者が判定を変えた記録が、通知の記録の書き方を直す材料になります。 notified_mismatch から notified に変えた行が多いなら、通知の記録に対象の品目の書き方が足りていません。
04実装レベルの3段階
本記事が想定するのは半自動化です。 送るのは担当者、合意の記録を書くのも担当者です。1行3分が1分になるのはこの段階です。 本格構成に進むのは、値上げ通知の記録が半年ほどたまってからにしてください。 どの返事が合意で、どれがまだ協議の途中かの見分け方は、半年分の返事と担当者の判断がそろって決められます。
05工数削減シミュレーション
導入後 720件 × 1分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 仕入先が100社を超え、材料・購入部品・副資材の発注が毎月数百行ある製造業・商社・建設業で、発注データを購買システムや生産管理システムからCSVで書き出せる場合。値上げの通知が書面・メール・口頭とばらばらに届き、どの品目の値上げが合意済みかを担当者の記憶で見分けている場合。Google Workspace を使っていて、単価の合意の記録をスプレッドシートで持てる場合。
- 仕入先が数社で、単価の改定が年に1〜2回の契約更新でまとめて決まる場合。購買システムが発注の時点で合意単価との差を止める仕組みをすでに持っている場合。市況で毎日値が動く原料を相場連動で買っており、前回比を見ても意味がない場合(相場の指標と照らす構成のほうが合います)。AIに単価の妥当性を決めさせたい場合や、仕入先への連絡を自動で送りたい場合。
07最小構成で試す方法
- 前月の発注明細から、取引の多い仕入先3社の行を選ぶ
- 前回の発注単価と合意単価を関数で横に並べ、前回比3%以上の行に印を付ける
- その3社に届いている値上げの通知を、文面のまま1つのシートに書き出す
- 印の付いた行と通知の文面を、社内で使ってよいAIサービスの画面に貼り、第7章の区分で判定させる
- 判定を担当者の記憶と突き合わせ、食い違った行を担当者と見る
3社で十分です。 ここで確かめたいのは、通知の文面から「対象に入るか」をAIが読み分けられるかです。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の記憶どおりの判定が出た | スクリプトでの自動化に進む |
| 担当者が忘れていた食い違いが見つかった | 構成は有効。notified_mismatch を担当者が読む運用にする |
通知の記録が足りず、ほとんど unexplained になる | 通知の記録が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 口頭で聞いた値上げは、どこにも書かれていないことが多いからです。通知の記録を1か月書きためてから試し直します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
通知のある仕入先の行がまとめて notified になる | 率と適用日が合わないものは notified_mismatch にさせ、evidence を文面と照合する |
| 小ロットの単価を値上げと取り違える | 数量の区分ごとに「前回」を引く |
| 為替の動きが値上げに見える | 外貨建ては外貨のまま比べる |
| 適用日の前の発注に新単価を当てはめる | 合意単価は発注日の時点で有効なものを引く |
| 単位の入力の誤りを仕入先に聞いてしまう | data_issue を分け、社内で先に確かめる |
| AIが記録に無い理由を書く | 推測を禁じ、根拠は渡した記録の文字列に限る |
| 下書きが値上げを断る文面になる | 理由を伺い、話し合う文面にする。送るのは担当者 |
| 口頭の値上げが記録に無い | 聞いた担当者が通知の記録に1行書く |
| 拾う行が多すぎて読まれない | 品目の群ごとに上昇の幅を分ける |
| 6分の上限で止まる | 仕入先ごとに区切り、続きのトリガーで再開する |
上の2行が、この構成が信用されるかどうかを決めます。 通知があるだけで流す判定が続くと、担当者は一覧を見なくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先ごとの品目・数量・単価、合意単価、値上げ通知の文面と協議の状況です。個人の情報はほとんど含みませんが、取引の条件そのものです。
- 有料の枠で使う … Gemini API の規約では、有料のサービスではプロンプトと応答を製品の改善に使わないとされ、無料のサービスには機密の情報を送らないよう書かれています。単価は仕入先との取引の条件なので、無料の枠では使いません
- 渡す範囲を絞る … AIに渡すのは、上がった行とその仕入先の通知だけです。他の仕入先の単価や、仕入先の比較を1回の呼び出しに入れません
- 通知の文面の個人の情報を伏せる … 先方の担当者の氏名や携帯電話の番号は、判定に要りません
- 協議の求めに応じる … 公正取引委員会は、下請法が改正されて取適法となり令和8年1月1日から施行されたこと、協議に応じない一方的な代金決定の禁止を示しています。仕入先から値上げの協議を求められているのに、この構成の確認依頼を返事の代わりにしないでください。 確認依頼は話し合いを始めるためのものです。どの取引がこの法律の対象になるかは、法務と確かめてください
- 判定を仕入先の評価に使わない …
unexplainedの多い仕入先は、通知の届け方が自社の記録の付け方と合っていないだけのことがあります
誤りが起きた場合のリスクは、説明のつかない値上げを見落とすことと、聞かなくてよい問い合わせを仕入先に送ることの2つです。 前者は notified_mismatch と根拠の照合で、後者は数量の区分と data_issue と担当者の確認で防ぎます。
10まず何から始めるか
1週目:値上げ通知の記録のシートを作る
受け付けた日、仕入先、対象、率または新単価、適用日、通知の文面、協議の状況の列を作ります。直近半年に届いた通知を、書面とメールから書き写します。 口頭で聞いたものは、聞いた担当者に書いてもらいます。
2週目:3社で試す
取引の多い3社の前月の行で、前回比と合意単価との差を関数で出し、通知の文面と一緒に社内で使ってよいAIサービスで判定させます。担当者の記憶と食い違った行を、担当者と一緒に見ます。
3週目:上昇の幅と区分を決める
拾う幅(前回比3%など)と、数量の区分の境目を課長と決めます。 品目マスタに単位の換算を足し、換算の無い品目を洗い出します。
4週目:スクリプトで比較までをつなぐ
毎月3日に動くトリガーを置き、全仕入先の比較と上昇の行を一覧のシートに書くところまで作ります。この時点ではAIを呼ばず、拾った行の数と中身を購買課で確かめます。
2か月目: 判定と確認依頼の下書きを足し、担当者が一覧から送り始めます。3か月目以降: 担当者が判定を変えた記録と仕入先の返事を見て、1行3分が何分になったかを実測します。値上げの知らせが届いた日に通知の記録へ書かれ、月初の点検で説明のつかない値上がりだけが残るようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 時間主導型のトリガーが毎分から毎月までの間隔で動かせること。インストール型トリガーは作成した人のアカウントで実行されること。失敗時に失敗の概要のメールが届くこと | Google: Installable triggers | 2026-10-08 |
| 1回の実行が6分まで、トリガーの合計実行時間が Workspace のアカウントで1日6時間、URLの呼び出しが1日100,000回であること | Google: Quotas for Google Services | 2026-10-08 |
UrlFetchApp の fetch、muteHttpExceptions を true にすると失敗の応答でも例外にならず応答が返ること | Google: Class UrlFetchApp | 2026-10-08 |
GmailApp の createDraft で宛先・件名・本文と、cc・htmlBody などのオプションを付けた下書きを作れること | Google: Class GmailApp | 2026-10-08 |
Utilities の parseCsv がCSVの文字列を2次元の配列にすること。区切り文字を指定する形があること | Google: Class Utilities | 2026-10-08 |
構造化出力が /v1beta/interactions の response_format(mime_type に application/json、schema)で指定できること。enum で選択肢を列挙できること。値はアプリケーションで確かめるよう書かれていること | Google: Structured outputs(Gemini API) | 2026-10-08 |
| 有料のサービスではプロンプトと応答を製品の改善に使わないこと。無料のサービスには機密や個人の情報を送らないよう書かれていること | Google: Gemini API Additional Terms of Service | 2026-10-08 |
| 下請代金支払遅延等防止法が中小受託取引適正化法(取適法)となり、令和8年1月1日から施行されること | 公正取引委員会: 中小受託取引適正化法(取適法)関係 | 2026-10-08 |
| 取適法の禁止行為として「協議に応じない一方的な代金決定の禁止」が挙げられていること | 公正取引委員会: 取適法施行に当たり事業者の皆様に御留意いただきたい事項 | 2026-10-08 |
値上げを受け入れるかどうか、どの取引が取適法の対象になるかは、購買課と法務で決めてください。 本記事は公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1005)についてのご相談はこちらから。
