目次
🎯 目的とやりたいこと
- 自社在庫管理Excelから品番一覧を読み込み
- 3社の仕入先サイト(例:A社、B社、C社)でそれぞれ検索
- 在庫数/価格を取得
- 最終的に 横持ちで1シートに集計(
stock_price.xlsx) - サイトUIの違いはサブフローで吸収(メンテ性◎)
- 失敗した品番は別ファイルに出力(処理全体は止めずに継続)
🔄 自動処理全体フロー(概要図)
[1] 品番リスト読み取り(item_list.xlsx)
↓
[2] 1品番ごとに処理
├─ サブフロー:A社検索
├─ サブフロー:B社検索
├─ サブフロー:C社検索
↓
[3] 結果を1行にまとめ、stock_price.xlsxに追記
↓
[4] 失敗リスト(品番+理由)をerror_log.csvに出力
📁 フォルダ構成(プロジェクト構造)
StockCheckerBot/
├─ main_flow.padx
├─ modules/
│ ├─ SearchACompany.padx
│ ├─ SearchBCompany.padx
│ ├─ SearchCCompany.padx
│ └─ Utilities/
│ ├─ WaitForStableDOM.padx
│ └─ WriteErrorLog.padx
├─ data/
│ ├─ item_list.xlsx ← 品番リスト
│ ├─ stock_price.xlsx ← 結果集計(横持ち)
│ ├─ error_log.csv ← 失敗記録
├─ config.json ← セレクタ設定や時間調整など
📄 各ファイルの内容
item_list.xlsx
| 品番 |
|---|
| ABC123 |
| XYZ456 |
| LMN789 |
stock_price.xlsx(出力形式)
| 品番 | A社_在庫 | A社_価格 | B社_在庫 | B社_価格 | C社_在庫 | C社_価格 |
|---|---|---|---|---|---|---|
| ABC123 | 20 | ¥1,200 | 18 | ¥1,300 | 0 | – |
| XYZ456 | エラー | – | 5 | ¥980 | 10 | ¥1,050 |
error_log.csv
日時,品番,サイト,エラー内容
2025/09/11 10:01,ABC123,A社,在庫数のDOM取得失敗
🧠 フローの設計思想(ポイント)
| 要点 | 実装戦略 |
|---|---|
| サイト別に構造が異なる | サブフローに分離して疎結合化 |
| DOM変更や読み込み遅延に耐える | テキスト出現 → DOM存在 → ネットワーク完了 の三段待機で設計 |
| エラーで止まらない | Try-Catch+ログ+次処理継続 |
| 横持ち集計で処理後の加工不要 | フロー内で1品番に1行の横展開集計構造 |
🛠 Power Automate Desktop フロー作成手順
✅ STEP1:品番一覧の読み込み
アクション:
- 「Excelファイルからデータを読み取る(閉じた)」
- パス:
data/item_list.xlsx - 出力変数:
ItemList
🔁 STEP2:1件ずつループ処理
アクション:For Each
配列:%ItemList%
現在の項目:CurrentItem
変数名:品番 ← %CurrentItem["品番"]%
🔍 STEP3:各社サイトで検索(サブフロー呼び出し)
構成:
| サブフロー名 | 検索対象サイト | 出力変数 |
|---|---|---|
| SearchACompany.padx | A社サイト | AStock, APrice |
| SearchBCompany.padx | B社サイト | BStock, BPrice |
| SearchCCompany.padx | C社サイト | CStock, CPrice |
引数(共通):
品番:%品番%
出力(共通):
- 在庫:文字列または数値(例:20、在庫なし、–)
- 価格:文字列(例:¥1,200、–)
🧷 STEP4:堅牢な待機処理(WaitForStableDOM)
各サイト共通の共通ユーティリティとして利用可能。
待機の3段階:
- テキストが表示されるまで待機(例:「検索結果」)
- DOM要素の存在を確認(セレクタで確認)
- ページの読み込み完了 or ネットワークアイドル状態を待つ(裏技)
🧾 STEP5:stock_price.xlsxへの横持ち追記
1行にするためのデータ構成:
["ABC123", AStock, APrice, BStock, BPrice, CStock, CPrice]
アクション:
- 「Excelに行を追加」
- ファイル:
stock_price.xlsx - ヘッダー行あり、追記モード
❌ STEP6:失敗ログの出力(Try-Catch+WriteErrorLog)
Try-Catch内でサブフローを実行
- エラー発生時:
- 品番・サイト・エラーメッセージを
error_log.csvに書き込む - 処理は中断せずに次のサイトまたは品番へ継続
- 品番・サイト・エラーメッセージを
書式:
2025/09/11 10:01,XYZ456,B社,価格取得セレクタが見つかりません
⚠️ セレクタ構成例(例:SearchACompany)
| 要素 | セレクタ例 |
|---|---|
| 検索窓 | input[name="searchBox"] |
| 検索ボタン | button[aria-label="検索"] |
| 結果表示部 | div.product-list |
| 在庫表示 | div.stock:has-text("在庫") |
| 価格表示 | span.price:not(:empty) |
✨ 補足Tips
🔄 サブフローの再利用設計
- 引数を「品番」のみに統一
- 出力を「在庫/価格」にすることで、使い回ししやすい構造
📶 UI読み込みのタイムアウト対策
- すべての読み込み後に明示的な「待機3秒」などを追加
- UI非応答時は「画像検出」や「タイマーによる強制分岐」も併用可
📦 通常在庫なし商品への対応
- 「在庫:–」「価格:–」などで記録
- セレクタが見つからない場合=在庫ゼロ判定も可能
✅ テストの手順
item_list.xlsxに3〜5品番を入力- 各サイトのサブフローで1つずつテスト
- 意図的にセレクタを壊してエラーログ保存の動作確認
- 最終的に
stock_price.xlsxに行が追加されているか確認
❓ よくある質問(FAQ)
Q1. サイトのUIが変わって動かなくなったら?
A. サブフローごとに構成しているため、対象サイトのフローだけを修正すれば済みます。他の処理はそのままでOKです。
Q2. なぜ横持ちにするの?
A. 品番1件=1行でまとめることで、後続処理(在庫一覧・価格比較)が容易になるからです。
Q3. 途中で止まらないの?
A. すべての処理はTry-Catchで囲まれており、エラーは記録して処理は継続します。ログで後から原因確認も可能です。
Q4. 自動で時間指定起動したい
A. Windowsのタスクスケジューラにて、PADフローを毎朝起動可能です。
