この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Power Query MのTable.RenameColumns、Table.SelectColumns、MissingField仕様を確認し、既存サンプルも「複数候補を黙って捨てない」安全側の設計へ見直しています。検証ステータス:📘 Power Query M公式仕様確認済み・サンプル安全性レビュー済み・実データ実行は未確認
毎月のCSVで列名が変わっても止めにくくする ― Power Query Mで列名ゆれを吸収する
毎月届くCSVで 社員コード、従業員ID、社員ID のように列名だけが変わるなら、Power Query側で複数の別名を1つの標準名へ寄せると後続処理を安定させられます。
ただし、同じCSVに 社員コード と 社員ID が同時に存在した場合は話が別です。どちらが正しいかは自動で決めず、エラーで止める方を安全側とします。
目標スキーマを先に決める
今回の最終列は次の4つです。
社員ID / 名前 / 部門 / 金額
入力側では次のような別名を許します。
| 標準名 | 許容する別名 |
|---|---|
| 社員ID | 社員コード / 従業員ID / 社員ID |
| 名前 | 氏名 / 名前 / 社員名 |
| 部門 | 所属 / 部署 / 部門 |
1つだけ見つかったときに名前を寄せる
NormalizeOne = (tbl as table, candidates as list, target as text) as table =>
let
names = Table.ColumnNames(tbl),
matches = List.Select(candidates, each List.Contains(names, _)),
result =
if List.Count(matches) = 0 then
tbl
else if List.Count(matches) > 1 then
error Error.Record(
"SchemaConflict",
"候補列が複数あります。確認してください。",
[Target = target]
)
else if matches{0} = target then
tbl
else
Table.RenameColumns(tbl, {{matches{0}, target}}, MissingField.Ignore)
in
result
Table.RenameColumns は列名を変更する関数です。ここでは存在する候補が1つだけの場合に限って標準名へ変更します。
複数候補を自動採用しない理由
たとえばCSVに次の2列があったとします。
社員コード = A001 社員ID = B999
「先に見つかった方を採用」という処理なら、もう片方を気付かず落とせます。しかしこれは列名ゆれではなく、入力データの意味が曖昧な状態です。
そのため現在のサンプルは SchemaConflict として止めます。自動化では、正常系を通すだけでなく「自動判断してはいけない境界」を決めることも重要です。
不足列はnullで補う
列名を標準化した後、Table.SelectColumns と MissingField.UseNull で最終列を揃えます。
Table.SelectColumns(
Step3,
{"社員ID", "名前", "部門", "金額"},
MissingField.UseNull
)
たとえば今月だけ 金額 列がなければ、列自体を欠落させず、値が null の 金額 列を作ります。これにより後続ステップの列構成を一定にしやすくなります。
flowchart LR
A[毎月のCSV] --> B[候補列を確認]
B --> C{同義候補が複数?}
C -- はい --> D[SchemaConflictで停止]
C -- いいえ --> E[標準列名へrename]
E --> F[必要列をSelect]
F --> G[不足列はnull補完]
G --> H[一定のスキーマ]
「止めない」より「正しく止める」
列が1つ欠けた程度ならnull補完で処理継続できます。一方、どちらが正しいか分からない2列が同時に来たなら止めます。
この区別を入れると、Power Queryが単にエラーを隠す仕組みではなく、予想済みのゆれは吸収し、意味が曖昧な変化は検知する仕組みになります。
