ゴールのイメージをそろえる
今回のテーマは「Web 上に公開されている CSV ファイルを、Power Query で“自動で取り込み・更新できる状態”にする実務テンプレ」です。
ローカルのフォルダではなく、URL から直接 CSV を読みに行くパターンですね。
やりたいことはシンプルで、次の二つです。
URL を指定して CSV をテーブルとして読み込む。
更新ボタンを押すだけで、常に最新の CSV 内容に置き換わるようにしておく。
ここに「日付付き URL」「パラメータ付き URL」などを足していくと、一気に“実務レベル”になります。
基本の考え方とキーワード
Web.Contents と Csv.Document の組み合わせ
ローカルファイルのときは File.Contents("C:\...") を使いましたが、
Web 上のファイルの場合は Web.Contents("https://...") を使います。
流れはこうです。
Web.Contents(URL) で「URL の中身(バイナリ)」を取得する。
そのバイナリを Csv.Document に渡して「テーブル」に変換する。
ローカルの CSV でやっていた
File.Contents → Csv.Document → Table.PromoteHeaders
の「File.Contents」が「Web.Contents」に変わるだけ、と考えるとイメージしやすいです。
例題1:固定 URL の Web 上 CSV を自動取込するテンプレ
想定する状況
例えば、こんな感じの URL で CSV が公開されているとします。
https://example.com/data/sales_latest.csv
この CSV は、毎日中身だけ更新されるが、URL 自体は変わらない。
「Excel を開いて[更新]を押すだけで、常に最新の内容を取り込みたい」というケースです。
実務テンプレ M コード(固定 URL 版)
let
// 1) CSV の URL を変数にしておく
CsvUrl = "https://example.com/data/sales_latest.csv",
// 2) Web からバイナリとして取得
SourceBinary = Web.Contents(CsvUrl),
// 3) バイナリを CSV としてテーブル化
CsvTable =
Csv.Document(
SourceBinary,
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
),
// 4) 先頭行をヘッダーに昇格
Promoted =
Table.PromoteHeaders(
CsvTable,
[PromoteAllScalars = true]
)
in
Promoted
Power Queryここでの重要ポイントは二つです。
Web.Contents の引数は「完全な URL の文字列」であること。
Csv.Document の設定(区切り文字・文字コード)は、ローカル CSV のときと同じように指定できること。
このクエリを作っておけば、Excel 側で[すべて更新]を押すたびに、
その時点の sales_latest.csv の中身がテーブルとして取り込まれます。
例題2:日付付き URL を自動生成して Web CSV を取込
想定する状況
今度は、URL に日付が含まれているパターンを考えます。
https://example.com/data/sales_2024-10-01.csvhttps://example.com/data/sales_2024-10-02.csv
毎日ファイル名が変わるが、「今日の日付のファイルを取り込みたい」というケースです。
ここでは「今日の分」を例にしますが、「特定日」「前日」なども同じ考え方で書けます。
日付から URL を組み立てるテンプレ
let
// 1) 今日の日付を取得
Today = Date.From(DateTime.LocalNow()),
// 2) 日付を "yyyy-MM-dd" 形式の文字列にする
DateText = Date.ToText(Today, "yyyy-MM-dd"),
// 3) ベース URL と組み合わせて完全な URL を作る
BaseUrl = "https://example.com/data/",
FileName = "sales_" & DateText & ".csv",
CsvUrl = BaseUrl & FileName,
// 4) Web からバイナリとして取得
SourceBinary = Web.Contents(CsvUrl),
// 5) CSV としてテーブル化
CsvTable =
Csv.Document(
SourceBinary,
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
),
// 6) ヘッダー昇格
Promoted =
Table.PromoteHeaders(
CsvTable,
[PromoteAllScalars = true]
)
in
Promoted
Power Queryここでの重要ポイントは、「URL を文字列として組み立ててから Web.Contents に渡している」ことです。
DateTime.LocalNow → Date.From で「日付だけ」にする。
Date.ToText で「URL に使える文字列」にする。
ベース URL とファイル名を & で連結して、最終的な URL を作る。
この型さえ覚えておけば、「今日」「昨日」「特定日」など、日付ロジックを差し替えるだけで応用できます。
例題3:クエリ引数(パラメータ)で日付を指定して取込
「毎回日付を変えて試したい」場合の考え方
「常に今日」ではなく、「任意の日付を指定して、その日の CSV を取り込みたい」こともあります。
このとき便利なのが「パラメータ(クエリ引数)」です。
Power Query の UI から「パラメータ」を作ってもいいですが、ここではシンプルに「別クエリで日付を定義する」イメージで書きます。
日付パラメータを使ったテンプレ
まず、「設定」用のクエリを一つ作るイメージです。
// クエリ名:設定_対象日
let
TargetDate = #date(2024, 10, 1)
in
TargetDate
Power Query次に、Web CSV 取込クエリ側でこれを参照します。
let
// 1) 対象日を別クエリから参照
TargetDate = 設定_対象日,
// 2) 日付を文字列に
DateText = Date.ToText(TargetDate, "yyyy-MM-dd"),
// 3) URL を組み立て
BaseUrl = "https://example.com/data/",
FileName = "sales_" & DateText & ".csv",
CsvUrl = BaseUrl & FileName,
// 4) Web から取得
SourceBinary = Web.Contents(CsvUrl),
// 5) CSV → テーブル
CsvTable =
Csv.Document(
SourceBinary,
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
),
Promoted =
Table.PromoteHeaders(
CsvTable,
[PromoteAllScalars = true]
)
in
Promoted
Power Queryこうしておけば、「設定_対象日」クエリの中の #date(2024, 10, 1) を書き換えるだけで、
取り込むファイルの日付を簡単に切り替えられます。
重要ポイントの深掘り
Web.Contents でよくハマるポイント(認証とプライバシーレベル)
Web.Contents を使うときに、実務でよくつまずくのが「認証」と「プライバシーレベル」です。
認証が必要なサイト(ログインが必要な社内システムなど)の場合、
最初の接続時に「資格情報」を聞かれます。ここで正しいアカウントを設定しておく必要があります。
また、Power Query の「プライバシーレベル」が厳しすぎると、
「このデータソースは他と結合できません」的な警告が出ることがあります。
その場合は、オプションでプライバシーレベルを調整するか、同じレベルに揃える必要があります。
コード側ではなく、Excel/Power BI 側の設定の話なので、
「エラー内容をよく読む」「接続の編集から資格情報を見直す」という視点も持っておくと安心です。
文字コードと区切り文字の指定はローカルと同じくらい大事
Web 上の CSV でも、文字コードや区切り文字はローカルと同じようにバラバラです。
UTF-8 なら Encoding = 65001。
Shift-JIS なら Encoding = 932。
区切りがタブなら Delimiter = "#(tab)"。
ここを間違えると、「文字化けする」「列がうまく分かれない」といったトラブルになります。
一度 UI から「データの取得 → Web」経由で取り込んでみて、
自動生成された M コードの Csv.Document の設定をコピペして使う、というのも実務的なテクニックです。
実務テンプレとしてのまとめ
「Web 上 CSV 自動取込」の型は、次の流れに集約できます。
Web.Contents(URL) でバイナリを取得する。
そのバイナリを Csv.Document でテーブルにする。
URL が日付付きなら、Date → 文字列 → URL 組み立て、という階段を踏む。
一度この型を体に入れてしまえば、
「社内システムが毎日 CSV を公開している」「オープンデータの CSV を定期的に取り込みたい」といった場面で、
“手でダウンロードしてから開く”という作業をごっそり自動化できます。
