こんにちは、こんです🦊
今日は返品処理の現場対応を「見える化」+「自動化」するための、Python+Streamlit製ダッシュボードを構築しました。
🧪 技術テーマ:「重たいデータ処理を、使いやすくする」
これまで、ロジレスAPIから出荷データ(10万件以上)を取得し、
返品問番と突合する仕組みをPythonスクリプトで整備してきました。
ただ、CSVやJSONのやりとりでは属人化しやすく、
「誰でも見れる・使えるUI」がないと業務として定着しません。
そこで今日は、SQLiteで中間ストレージを構築し、StreamlitでUI化するところまで一気に進めました。
⚙ 技術スタックと構成
✅ ロジレス出荷データの保存形式:JSON → SQLite
ロジレスAPIからのデータ取得は、非同期(aiohttp + asyncio)で高速化
データ件数が多いため、月単位で sales_orders_shipped_2025MM.json に分割
その後、convert_json_to_sqlite.py で必要カラムだけ抽出し、SQLiteの logiless テーブルに変換
# 抽出フィールド例(1レコード)
{
"受注CD": "testOrderNo1",
"送り状番号": "testTrackingNo1",
"支払方法": "cod",
"出荷日": "2025-04-14 17:10:59",
...
}
✅ 返品問番とのJOIN:SQLiteでのインデックス付き結合
スプレッドシートから問番リストを取得し、returns テーブルとして保存
LEFT JOIN による突合処理を perform_join_and_export() にて実行
出力結果はCSV化し、同時にGoogle Sheetsへバッチ更新
SELECT r.返品問番, l.*
FROM returns r
LEFT JOIN logiless l
ON r.返品問番 = l.送り状番号;
✅ スプレッドシート連携:gspread + batchUpdate に最適化
従来の sheet.update_cell() は1件ずつAPIリクエストが発生 → すぐQuotaエラーに
今回は values_batch_update() に完全移行し、1回で数百行の更新を実現
出荷日も自動で 2025/05/12 形式に整形して記入(pandas datetime処理)
row_updates[date_col] = pd.to_datetime(date_map[tn]).strftime('%Y/%m/%d')
✅ Streamlit UI:社内用の閲覧&操作インターフェース
サイドバーで対象年月を指定(年/月選択式)
SQLiteに格納されたテーブルをプレビュー&フィルタリング可能
結果はそのままCSVとしてダウンロードもOK
generate_inbound_csv.py もStreamlitボタンから呼び出せるように統合済
💡 今日の工夫ポイント

データ取得 → SQLite変換 → UI表示 → スプレッドシート反映まで、処理を明確にステップ分離
UI上でも「Step ①~⑤」で明示 → 非エンジニアにも操作が伝わりやすい構成に
Google Sheetsへの書き戻しは、背景色付き条件付き書式と組み合わせて「注意点が目に見える」状態に
🧭 明日以降のチャレンジ予定
支払方法が「クレカ」の返品 → 顧客への1回限りの自動通知(管理画面をスクレイピングかメールで考え中)
未返信の返品問番 → 一定日数経過でキャンセル+良品移動
ロジレスAPIでの入荷予定の登録処理の自動化
社内運用フローをStreamlit + Notion + Slackで一貫化
📌 今日のまとめ
Pythonで処理を組むだけじゃ、使われない。
誰でも「見れる・触れる」状態を作って、はじめて業務になる。
非同期取得、SQLite変換、バッチ反映、そしてUI連携。
一つひとつは小さな技術の積み上げですが、現場の“次の一手”を自動で生むための確かな一歩になりました。
それでは、また次の実験で🦊
#返品対応DX #Python自動化 #SQLite活用 #Streamlit開発 #GoogleSheetsAPI #業務効率化 #バックオフィスDX #EC支援 #勉強記録