Power Queryで請求CSVを自動取込&月次レポート自動更新【Excel Online+Office Scripts対応】
毎月の請求データは “フォルダーに放り込むだけ” に
請求書のCSVを毎月Excelに貼り付けていませんか?
Power Queryの「フォルダーから」コマンドを使えば、指定したフォルダー内のファイルを一括で読み込み、データの集計や整形を自動化できます。公開されている解説では「フォルダーにある表データが継続的に更新・蓄積される場合に『フォルダーから』を使うのが最適」と説明されています。ファイル種類は統一し、列構成も揃えておくと後工程の処理がシンプルになります。
この記事では、Power Queryを使ったCSVの取り込みから集計、Excel Online+Office Scripts+Power Automateによる自動更新まで、段階的に解説します。
この記事のゴール
- フォルダーに毎月の請求CSVを保存すると自動で取り込み・整形
- 取引先別・月別の売上集計を自動生成
- Excel Onlineで指定時刻に自動更新(例:毎朝6時)
1. フォルダーとファイルの準備
- OneDrive / SharePointに専用フォルダーを作成
例として「invoices」というフォルダーを作成し、そこに請求書CSVを保存します。サブフォルダーも読み込めますが、不要なファイルがあると処理が煩雑になるため、対象ファイルをまとめておくのがおすすめです。 - ファイル名と列構成の統一
例:invoice_2025-08.csv
。列名は後のMコードで型指定を行います。代表的な列を下表にまとめます。
列名 | 型 |
---|---|
請求日 | 日付 |
取引先 | テキスト |
請求番号 | テキスト |
品目 | テキスト |
数量 | 数値(整数) |
単価 | 数値 |
金額 | 数値 |
税額 | 数値 |
データがShift‑JISで保存されていると文字化けします。ExcelはデフォルトでShift‑JISを使うため、UTF‑8で保存されたCSVを開くと文字化けするのが原因です。Power Queryなら文字コードを指定できるので、後述のMコードでUTF‑8(65001)やShift‑JIS(932)を選択します。
2. Power QueryでCSVを結合して「MonthlyReport」を作成
2‑1. フォルダー内のCSVを読み込む
- Excelのデータ > データの取得 > ファイルから > フォルダーからを選択。
- 「invoices」フォルダーを選択し、[OK]を押すとファイル一覧が表示されます。
- [データの変換]をクリックし、Power Queryエディターを開きます。
2‑2. 高度なエディターでMコードを調整
自動生成されたコードを編集し、以下のようなMコードを作成します(パスや列名は環境に合わせて変更してください)。
let
// ▼ OneDrive/SharePointのローカル同期パスを指定
Source = Folder.Files("C:\Users\yourname\OneDrive\invoices"),
// ▼ CSVのみ対象(拡張子でフィルタ)
Filtered = Table.SelectRows(Source, each Text.Lower([Extension]) = ".csv"),
// ▼ CSVを読み込み(Encoding: UTF‑8=65001 / Shift_JIS=932)
AddedTable = Table.AddColumn(
Filtered,
"Data",
each Csv.Document(
File.Contents([Folder Path] & [Name]),
[Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
),
type table
),
// ▼ ヘッダー昇格と型指定(列名はご自身のCSVに合わせて置換)
Promoted = Table.TransformColumns(
Table.AddColumn(AddedTable, "Promoted", each Table.PromoteHeaders([Data], [PromoteAllScalars=true])),
{{"Promoted", each Table.TransformColumnTypes(_, {
{"請求日", type date},
{"取引先", type text},
{"請求番号", type text},
{"品目", type text},
{"数量", Int64.Type},
{"単価", type number},
{"金額", type number},
{"税額", type number}
})}}
),
// ▼ 中身だけ取り出して縦に結合
Expanded = Table.Combine(Promoted[Promoted]),
// ▼ 年月列を追加(yyyy-MM形式)
AddedYearMonth = Table.AddColumn(
Expanded,
"年月",
each Date.ToText([請求日], "yyyy-MM"),
type text
),
// ▼ 取引先×年月単位で集計
Grouped = Table.Group(
AddedYearMonth,
{"取引先", "年月"},
{
{"合計金額", each List.Sum([金額]), type number},
{"合計税額", each List.Sum([税額]), type number},
{"件数", each Table.RowCount(_), Int64.Type}
}
),
// ▼ 並べ替え
Sorted = Table.Sort(Grouped, {{"年月", Order.Ascending}, {"取引先", Order.Ascending}})
in
Sorted
このコードでは、フォルダー内のすべてのCSVファイルを読み込み、ヘッダーを昇格してデータ型を設定し、[請求日]から「年月」列を追加して取引先・年月単位で合計金額や件数を計算しています。文字コードを変更する場合はEncoding = 932
(Shift‑JIS)に変えてください。
ポイント
- ファイル種類や列構成が統一されていないと手順が煩雑になるため、保存するCSVの構造を揃えておくことが推奨されています。
- フォルダー名やパスを変更するとクエリ更新時にエラーになるため、場所を変える場合はクエリのソースも更新しましょう。
3. ピボットテーブル・グラフで月次レポートを可視化
- 挿入 > ピボットテーブルを選択し、データソースに先ほど作成した「MonthlyReport」クエリを指定します。
- 行フィールドに「年月」を配置し、その下に「取引先」を追加します。
- 値フィールドには「合計金額」と「件数」を設定します。
- 必要に応じて「合計税額」も追加しましょう。
- 挿入 > 折れ線グラフや縦棒グラフを使えば、月次の売上推移や件数推移を可視化できます。
4. Excel Online+Office Scripts+Power Automateで自動更新
4‑1. Power QueryとOffice Scriptsの役割
Microsoftによると、Power Queryは大規模な外部データソースからデータを取得・変換するのに適しており、数百のデータ接続が用意されています。一方、Office ScriptsはExcel内の書式設定やグラフ作成など、Excel中心の迅速な自動化とPower Automateとの連携に適している。本記事では、Power Queryでデータ取得・集計を行い、Office Scriptsでクエリ更新とピボットテーブル更新を自動化します。
4‑2. Office Scriptsで全クエリ・ピボットテーブルを更新
Office Scriptsでは、ブック内の全クエリを一括で更新できます。ローカルファイル上で有効な方法ですが、クラウド環境では使用できません。更新対象にしたくないクエリがある場合は、別のブックに移すか削除してください。
以下はクエリとピボットテーブルを更新するスクリプト例です。
// ファイル名: refresh_queries.ts
async function main(workbook: ExcelScript.Workbook) {
// クエリの一覧を取得して順番に更新
const queries = workbook.getQueries();
for (const q of queries) {
await q.refresh();
}
// 各シートのピボットテーブルを更新
const worksheets = workbook.getWorksheets();
for (const ws of worksheets) {
const pivots = ws.getPivotTables();
pivots.forEach(p => p.refresh());
}
}
workbook.getQueries()
はブック内のPower Queryクエリ一覧を取得するメソッドです。また、Excel ScriptにはrefreshAllDataConnections()
やrefreshAllPivotTables()
といったメソッドも用意されており、データ接続やピボットテーブル全体を一括更新できます。必要に応じて使い分けてください。
4‑3. Power Automateで定期実行
Power Automateのスケジュール済みクラウドフローを利用すると、Excel OnlineでOffice Scriptsを定期実行できます。Microsoft Learnによれば、フローは1日・1時間・1分ごとに、指定日や一定時間経過後など柔軟なタイミングで実行できる。フロー作成時はタイムゾーンと開始日時(YYYY‑MM‑DDTHH:MM:SSZ形式)を設定します。
主な手順は次のとおりです。
- Power Automateポータルにサインインし、「新しいフロー > スケジュール済みクラウドフロー」を選択。
- フロー名、開始日時、繰り返し間隔(例:1日)を入力します。
- 「+ アクションを追加」で「Excel Online (Business) – スクリプトの実行」を選択し、対象Excelファイルと先ほど作成したOffice Script(例:
refresh_queries
)を指定します。 - 必要に応じてフローの最後に「通知メール送信」や「Teamsメッセージ送信」などを追加し、更新完了をお知らせします。
フローのタイムゾーン設定はUTCが標準です。日本時間(Asia/Tokyo)で実行したい場合は、「開始時間」や「タイムゾーン」フィールドで適切なタイムゾーンを選択してください。
5. 実務で役立つTipsとよくある質問
文字コードと区切り文字
- UTF‑8のCSVが文字化けする場合は、Power Queryのインポート時にEncoding=65001を指定します。Shift‑JISならEncoding=932に変更します。
- 区切り文字がカンマ以外の場合(タブやセミコロンなど)、
Csv.Document
のDelimiter
パラメータを変更します。
データ列の追加
- この記事では年月列を追加しましたが、クォーター列や部門・案件IDなど分析に必要な列をCSVに含めておくとPower Queryでの集計が容易になります。
- ファイル名から情報を抽出することも可能です。
Source[Name]
でファイル名を取得し、例えばText.Start([Name], 7)
で「YYYY-MM」を取り出して列に追加するなど、M関数を活用しましょう。
フォルダーの階層とフィルタリング
Folder.Files
はサブフォルダーのファイルも取得します。必要に応じてTable.SelectRows
でパスやファイル名に応じたフィルタリングを行いましょう。- 取引先ごとに税率が異なる場合は、取引先×税率のマスタを別シートに用意し、Power Queryで結合して税額を再計算することもできます。
月次確定後に数値が変わるのを防ぎたい
Power Queryはソースファイルが更新されると最新データを再読み込みします。月次の数値を確定させたい場合は、月次締め後にPower AutomateなどでテーブルやCSVに書き出して値貼り付け用のシートに保存する運用が安全です。
まとめ
- Power Queryの「フォルダーから」機能を使うと、特定フォルダーに置いたCSVを一括で読み込み、データの結合・整形・集計を自動化できます。
- 文字コードや列構成を統一することで処理が安定し、UTF‑8/Shift‑JISもMコードで簡単に指定できます。
- Office ScriptsはExcelブック内のクエリやピボットテーブル更新をスクリプトで実行でき、Power Automateのスケジュールフローと組み合わせれば定時自動更新が可能です。
- Power Automateでは1日・1時間・1分単位や指定日など柔軟なスケジュール設定ができ、時刻のタイムゾーンも指定できます。
毎月の請求レポート作成にかかる時間は、これらの仕組みで大幅に短縮できます。まずはテンプレート通りに構築し、必要に応じてマスタ連携やアラート通知を組み込んで、より高度な分析に活用してみてください。