毎週、注文Excelを開いて、取引先別に集計して、在庫と照らし合わせて、発注リストを手で作って、メールを一件一件送る——。そんな受発注の手作業を毎週繰り返している方は多いのではないでしょうか。
「受発注 自動化 python」で検索すると、「AIによる自動発注システム」「機械学習で需要予測」「フリーランスへのシステム開発依頼」といった、自分には関係なさそうな記事が上位に並びます。でも探しているのは、そういった大規模なシステムではなくて「今やっているExcelの手作業を少しでも楽にする方法」ではないでしょうか。
この記事では、AIシステムも外注も必要ありません。今使っているExcelの受発注業務を、Pythonで4ステップに分けて半自動化する実践的な手順を解説します。読み終えた後には、「まずどこから手をつけるか」が具体的に見えてくるはずです。
受発注業務のどこをPythonで自動化できるか
手作業で繰り返している5つの処理
まず、受発注業務の中でPythonが活きる処理を整理しておきましょう。
- ①注文データの集計:取引先別・製品別に注文数量をまとめる
- ②在庫との照合:在庫数と注文数を比較して発注が必要かどうか判断
- ③発注リストの作成:発注が必要な製品・数量・取引先をリストアップ
- ④発注メールの送信:取引先ごとにメールを作成して送信
- ⑤発注履歴の記録:いつ、何を、いくつ発注したかを記録・蓄積
AIシステムは不要──まずExcel操作の自動化から
「受発注自動化」と言うと、需要予測AIで発注量を算出するシステムを想像する方もいます。しかし、多くの中小製造業では、そもそも発注の判断ルール(発注点・発注量)はすでに決まっています。問題は、その判断を実行するための「データ確認・リスト作成・メール送信」という手作業に時間がかかっていることです。
ルールが決まっているなら、AIは不要です。Pythonで「決まったルールを自動実行する」だけで十分に効率化できます。
Pythonで自動化できる受発注業務4ステップ
1. 注文Excelを読み込んで取引先別・製品別に集計
まずは受注データの集計から始めます。注文日・取引先・製品コード・数量が入ったExcelがあれば、以下のコードで取引先別集計が出せます。
import pandas as pd
# 注文データを読み込む
orders = pd.read_excel("受注データ_週次.xlsx")
# 取引先別・製品別に集計
summary = orders.groupby(["取引先", "製品コード"])["注文数量"].sum().reset_index()
summary.columns = ["取引先", "製品コード", "合計注文数"]
summary.to_excel("注文集計.xlsx", index=False)
print("集計完了")
製品数が多くても、取引先が10社以上あっても、処理は数秒です。「Excelのピボットテーブルを毎週手動で作っていた」という方には、これだけでも効果を感じられます。
2. 在庫データと照合して発注リストを自動生成
集計した注文数と在庫データを照合して、「発注が必要な製品」だけを自動で抽出します。発注点(在庫がこの数を下回ったら発注する)があらかじめ決まっている場合、コードはこのような形になります。
# 在庫データを読み込む
stock = pd.read_excel("在庫データ.xlsx")
# 注文集計と在庫を製品コードで結合
merged = pd.merge(summary, stock, on="製品コード")
# 在庫 - 注文数 が発注点を下回る製品を抽出
merged["残在庫"] = merged["在庫数"] - merged["合計注文数"]
order_list = merged[merged["残在庫"] < merged["発注点"]]
order_list.to_excel("発注リスト.xlsx", index=False)
print(f"発注が必要な製品数: {len(order_list)}件")
「発注が必要な製品」だけが一覧になって出てきます。これを確認すれば、毎朝の在庫チェックの時間が大幅に短縮されます。
3. 発注メールを自動送信する(smtplib)
発注リストができたら、次は取引先への発注メールです。Pythonのsmtplibを使えば、取引先ごとにメール本文を自動生成して送信できます。
import smtplib
from email.mime.text import MIMEText
def send_order_email(to_address, supplier_name, items):
subject = f"【発注依頼】{supplier_name} 御中"
body = f"{supplier_name} 御中\n\nお世話になっております。\n以下の通り発注をお願いします。\n\n"
for _, row in items.iterrows():
body += f"製品コード: {row['製品コード']} 数量: {row['発注数量']}個\n"
body += "\nよろしくお願いいたします。"
msg = MIMEText(body, "plain", "utf-8")
msg["Subject"] = subject
msg["From"] = "自分のメールアドレス"
msg["To"] = to_address
# smtpサーバー設定(Gmail例)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login("自分のアドレス", "アプリパスワード")
server.send_message(msg)
print(f"{supplier_name} へのメール送信完了")
メールの件名・本文のフォーマットは固定ルールで決まっているなら、一度テンプレを作ってしまえば、毎週コピペする作業がなくなります。ただし、送信前に必ず内容を確認するフローは残すことをおすすめします。完全自動化より「確認後に実行」の形が実務では現実的です。
4. 発注履歴をCSVに自動記録・蓄積する
「いつ、何を、いくつ発注したか」の履歴を残しておくことで、月次の購買実績集計や取引先別の発注量分析が後からできるようになります。
from datetime import date
# 発注日を追加してCSVに追記保存
order_list["発注日"] = date.today()
order_list.to_csv("発注履歴.csv", mode="a", header=False, index=False, encoding="utf-8-sig")
print("発注履歴を記録しました")
`mode="a"` は追記モードです。これで毎週実行するたびに履歴が蓄積されていきます。
よくある失敗と対処法
失敗①:注文Excelの形式が担当者によって違う
受注データの入力を複数の担当者がやっている場合、列名や日付の書き方がバラバラになりがちです。Pythonで処理する前に、「受注データ入力フォーマット」を1枚固定してしまうのが一番の解決策です。
失敗②:メール送信でGmailのセキュリティに引っかかる
Gmailでsmtplibを使う場合、通常のパスワードでは認証エラーになります。Googleアカウントの「アプリパスワード」を発行して使う必要があります。会社のメールサーバーを使う場合は、IT担当に接続情報を確認してください。
失敗③:完全自動化しようとして確認フローをなくした
発注は金額が絡む業務です。「スクリプトが全部やってくれるから確認しなくていい」という運用は危険です。スクリプトで発注リストを作成→人間が確認→送信実行、という流れが実務では現実的です。完全自動化より、「確認が楽になる半自動化」の方が安全に運用できます。
次のステップ:さらに効率化したい人へ
受発注の自動化が動くようになったら、「日報・業務報告の自動生成」や「月次KPI集計の自動化」も同じ考え方で進められます。
日報の自動生成については、こちらの記事が参考になります。
製造業のPython活用全体像はこちらで整理しています。
まとめ
- 受発注自動化はAIシステムが不要。「発注のルールが決まっているなら、Pythonでルール通りに動かすだけ」
- 自動化できる処理は4つ:注文集計→発注リスト生成→メール送信→履歴記録
- pandasで注文Excelを読み込んで在庫と照合するだけで、毎週の確認作業が自動化できる
- メール送信は「確認後に送る」フローを残す。完全自動より「半自動化」が実務では安全
- 最初の壁は入力Excelのフォーマット不統一。Python前にデータ形式を固めること
「まず注文Excelを読み込んで集計するだけ」から始めると、受発注のPython自動化は想像より早く動き始めます。