前記事では、Chrome拡張によるCSV収集とExcelへの自動反映の仕組みを構築しました。 しかし運用を始めてすぐ、OKになった画像がExcelに反映されないという問題が判明しました。 本記事では、その根本原因の分析と、history CSV累積管理による解決を紹介します。
前記事の課題:OKが書き込まれない問題
8) 全CSV → Excel書き込みを実行してもSTATUSの「OK」件数が0件のままでした。 CSVの読み込みログには「OK CSV 69件読み込み」と表示されているにもかかわらず、Excel上のOK列は空のままです。
原因を追うため、OK CSVの file_number とEXAM CSVの file_id を突合したところ、 69件中8件しか一致しないという結果になりました。
| 件数 | 状況 | |
|---|---|---|
| OK CSV 全件 | 69件 | file_number のみ、filenameなし |
| EXAM CSV 全件 | 39件 | file_id と filename あり |
| 照合一致 | 8件 | filename解決できた分のみ |
| 照合不一致 | 61件 | filenameが解決できず書き込まれない |
さらに調査すると、一致した8件のファイル名はExcel上に存在しているにもかかわらず、 STATUSがEXAMのままでOKになっていませんでした。 つまり「照合はできているが、実際のExcel書き込みまで届いていない」という二重の問題がありました。
解決策の検討:何が根本原因か
問題の本質は「処理したタイミングの各CSVで突合しているから」です。
Adobeの審査フローは以下の通りです。
- 申請 → EXAMページに掲載(EXAM CSVに存在)
- 審査通過 → EXAMページから消える(EXAM CSVから消える)
- ポートフォリオページに掲載(OK CSVに file_number のみ存在)
つまり、OKを収集する時点ではEXAM CSVにその画像が存在しないため、 file_number → file_id → filename という変換チェーンが切れてしまいます。
根本原因のまとめ
現在のCSV = そのタイミングで見えているスナップショットにすぎず、 「以前EXAM中だった」という事実はどこにも記録されていません。 過去のEXAMデータを持ち越す仕組みが必要でした。
解決策として3つの選択肢を検討しました。
| 案 | 内容 | 採否 |
|---|---|---|
| A | ExcelのU列(EXAM FileID)とOK file_numberを直接照合 | 部分採用(即効策) |
| B | collect_ok.pyを修正してfilenameも収集する | Adobe側仕様で不可 |
| C | history CSVに収集データを累積し、突合元をhistoryに変更 | ★採用(根本解決) |
案Aはその場しのぎですが即効性があるため先に実装し、案Cで根本解決するという2段階のアプローチをとりました。
history CSV設計
history CSVは「収集のたびにデータを追記/上書きして累積していくCSV」です。
各収集スクリプト実行後に update_history.py が自動で呼ばれ、historyを更新します。
| ファイル | 上書きキー | 役割 |
|---|---|---|
| exam_history.csv | filename | 過去のEXAMデータを累積。OKになって消えた画像のFileIDも保持 |
| ok_history.csv | file_number | 承認済みfile_numberを累積 |
| ng_history.csv | file_id | 非承認file_idとNG理由を累積 |
全historyにはcollected_dateが自動付与されます。 同一キーのデータが再収集された場合は最新データで上書き、新規データは追記されます。
これにより解決される問題
5/29にEXAM収集 → exam_history に 0514 (13).jpg : FileID=2035944602 が記録される
5/30にOK収集 → ok_history に file_number=2035944602 が追加される
Excel書き込み時:U列の 2035944602 と ok_history を照合 → OK書き込み成功
手動追加データへの対応
過去バックアップからhistory CSVに手動でデータを追加した際、
pandas.errors.ParserError: Expected 5 fields, saw 6 というエラーが発生しました。
調査すると、手動追加データには collected_date 列が含まれていましたが、
ヘッダー行に collected_date が存在しないというフォーマット不一致が原因でした。
データ自体は正しく、ヘッダーとの列数が1つズレていたのです。
update_history.py を修正し、ヘッダーに collected_date がない場合でも
データ行に値があれば自動補完して読み込む処理を追加しました。
以降はhistoryファイルを手動編集しても問題なく処理されます。
更新対象の絞り込み設計
historyが大量件数になることを想定し、Excelへの書き込み対象をどう絞るか検討しました。 検討した選択肢は以下の3案です。
| 案 | 絞り込み条件 | 問題点 |
|---|---|---|
| 日付案 | collected_dateから遡り日数以内のみ | 古い申請が永遠に更新されなくなる可能性 |
| Excel処理日案 | Excelの処理日(A列)から遡り日数以内のみ | 再審査画像が対象外になる可能性 |
| STATUS案 | STATUS が 空白 または EXAM の行のみ | なし |
STATUS案を採用した理由は、日付管理が不要でシンプルかつ取りこぼしがないからです。 OKまたはNGが確定した行は更新不要なので対象外、未確定の行は常に更新対象、という直感的なルールです。
手動入力の保護も同時に実現
STATUSがOK/NGの行を更新しないルールは、手動でOK/NGを入力したデータの保護にもなります。 自動処理が手動データを上書きしてしまう心配がありません。 NGだった画像を再審査に出した場合は、手動でSTATUSを空白に戻すだけで再度更新対象になります。
update_history.py の実装
update_history.py は収集直後に自動実行される新規スクリプトです。
batメニューの各収集処理(1〜4番)完了後に必ず呼ばれます。
手動追加後にhistoryだけ更新したい場合は 4h を選択します。
処理内容
- 収集CSVを読み込み、
collected_date(実行日付)を自動付与 - historyが存在しない場合は新規作成
- 同一キーの行を削除してから新データを追記(上書き)
collected_date降順 + キー昇順でソートして保存- ヘッダーに
collected_dateがない旧フォーマットも自動補完
コマンドラインオプションで更新対象を絞ることもできます。
| コマンド | 処理対象 |
|---|---|
--mode all | exam + ok + ng 全て更新(デフォルト) |
--mode exam | exam_history のみ更新 |
--mode ok | ok_history のみ更新 |
--mode ng | ng_history のみ更新 |
完成した全体フロー
今回の実装により、審査結果の追跡フローが以下の通り完成しました。
- Chrome拡張で各審査ページのCSVを収集(1〜4番)
- 収集直後に
update_history.pyが自動実行 → history CSVに累積 - 5〜8番でhistoryからExcelに書き込み
- STATUS = 空白/EXAM の行のみ更新(OK/NGは保護)
- OK突合:ExcelのU列(EXAM FileID)× ok_historyのfile_number
- NG突合:filename → Excel B列、次にfile_id → Excel U列
| 処理前(旧) | 処理後(新) |
|---|---|
| 今回収集のCSVのみ突合 | history CSV(累積)を突合 |
| OKが0件書き込まれない | ExcelU列経由で確実に照合 |
| 日付で絞り込み(検討のみ) | STATUSで絞り込み(シンプル) |
| 手動入力が上書きされる可能性 | OK/NG確定行は保護される |
今後はスコアと審査結果を照合し、どのスコア帯でOKになりやすいか、NGの傾向は何かの分析に進む予定です。 データが蓄積されるほど傾向がつかみやすくなるため、この仕組み化が将来の分析基盤になります。
FAQ
history CSVとは何ですか?
収集のたびにデータを追記・上書きして累積していくCSVファイルです。同一キーのデータは最新で上書き、新規は追記されます。collected_date列で収集日を管理します。
なぜ収集日(collected_date)ではなくSTATUSで更新対象を絞るのですか?
日付で絞ると古い申請画像が永遠に更新されなくなる可能性があります。STATUS=空白またはEXAMで絞ることで、日付に関係なく未確定の画像だけを常に更新対象にできます。
手動でOK/NGを入力した行は上書きされませんか?
上書きされません。STATUSがOKまたはNGの行はスクリプトが一切更新しない設計です。再度更新対象にしたい場合は手動でSTATUSを空白に戻してください。