ゴールのイメージをそろえる
今回のテーマは「SharePoint 上のフォルダに置かれたファイルを、Power Query で“ローカルフォルダと同じ感覚で自動取込・更新できるようにする実務テンプレ”」です。
やりたいことは、ざっくり言うとこうです。
SharePoint サイト(または Teams のドキュメントライブラリ)を Power Query から一覧として見る。
その中から「特定フォルダ」「特定拡張子」のファイルだけを絞り込んで、一括取込する。
ローカルでやっていた Folder.Files("C:\...") を、SharePoint 版に置き換えるイメージを持ってください。
基本の考え方とキーワード
SharePoint.Files で「サイト全体のファイル一覧」を取る
ローカルフォルダの入口が Folder.Files だったように、
SharePoint の入口は SharePoint.Files です。
イメージはこうです。
let
Source =
SharePoint.Files(
"https://xxx.sharepoint.com/sites/YourSite",
[ApiVersion = 15]
)
in
Source
Power Queryここで指定する URL は「サイトのルート URL」です。
例としては、次のような形です。
https://xxx.sharepoint.com/sites/営業部
https://xxx.sharepoint.com/sites/ProjectA
このクエリを実行すると、「そのサイト内にあるすべてのファイル」がテーブルとして返ってきます。
列には、Name(ファイル名)、Folder Path(フォルダパス)、Extension(拡張子)、Content(中身のバイナリ)などが含まれます。
ここから先は、ローカルの Folder.Files と同じノリで、「フォルダパスで絞る」「拡張子で絞る」を組み合わせていきます。
「どのフォルダか」を Folder Path で絞り込む
SharePoint.Files の結果には、Folder Path という列があります。
ここには「そのファイルがどのフォルダにあるか」がフルパスで入っています。
例えば、こんな感じです。
https://xxx.sharepoint.com/sites/YourSite/Shared Documents/売上データ/2024/
この Folder Path を条件にして、「このフォルダ配下だけ」を取り出すのが基本パターンです。
例題1:SharePoint の特定フォルダから CSV を自動一括取込
想定する状況
SharePoint サイト「営業部サイト」に、こんなフォルダ構成があるとします。
Shared Documents
売上データ
DailyCsv
sales_2024-10-01.csv
sales_2024-10-02.csv
…
この「DailyCsv」フォルダにある CSV を、ローカルフォルダと同じように一括取込したい、というケースです。
実務テンプレ M コード(SharePoint CSV 一括取込)
let
// 1) サイト全体のファイル一覧を取得
Source =
SharePoint.Files(
"https://xxx.sharepoint.com/sites/営業部",
[ApiVersion = 15]
),
// 2) 対象フォルダパスで絞り込む
// 実際のパスは、Source を一度見てコピペするのが確実
FilteredFolder =
Table.SelectRows(
Source,
each
Text.StartsWith(
[Folder Path],
"https://xxx.sharepoint.com/sites/営業部/Shared Documents/売上データ/DailyCsv/"
)
),
// 3) .csv だけに絞り込む
OnlyCsv =
Table.SelectRows(
FilteredFolder,
each Text.Lower([Extension]) = ".csv"
),
// 4) 各ファイルの Content を CSV としてテーブル化
AddedCsvTable =
Table.AddColumn(
OnlyCsv,
"CsvTable",
each
Csv.Document(
[Content],
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
),
type table
),
// 5) 代表テーブルから列名を取得
SampleTable = AddedCsvTable[CsvTable]{0},
ColNames = Table.ColumnNames(SampleTable),
// 6) CsvTable を展開して結合
Combined =
Table.ExpandTableColumn(
AddedCsvTable,
"CsvTable",
ColNames,
ColNames
)
in
Combined
Power Queryここでの重要ポイントは三つです。
SharePoint.Files で「サイト全体」を取ってから、Folder Path で「欲しいフォルダだけ」に絞る。
Extension 列で「.csv だけ」に絞る。
Content を Csv.Document に渡す流れは、ローカルとまったく同じ。
一度この型を作ってしまえば、あとは Excel の[更新]ボタンを押すだけで、
SharePoint フォルダ内の CSV が自動で最新状態に反映されます。
例題2:SharePoint の特定フォルダから Excel を自動一括取込
想定する状況
同じく「営業部サイト」に、こんなフォルダがあるとします。
Shared Documents
売上ブック
MonthlyBooks
売上_2024-08.xlsx
売上_2024-09.xlsx
売上_2024-10.xlsx
この「MonthlyBooks」フォルダにある Excel を、1枚目シートだけ読み込んで縦に結合したい、というケースです。
実務テンプレ M コード(SharePoint Excel 一括取込)
let
// 1) サイト全体のファイル一覧を取得
Source =
SharePoint.Files(
"https://xxx.sharepoint.com/sites/営業部",
[ApiVersion = 15]
),
// 2) 対象フォルダパスで絞り込む
FilteredFolder =
Table.SelectRows(
Source,
each
Text.StartsWith(
[Folder Path],
"https://xxx.sharepoint.com/sites/営業部/Shared Documents/売上ブック/MonthlyBooks/"
)
),
// 3) .xlsx だけに絞り込む
OnlyXlsx =
Table.SelectRows(
FilteredFolder,
each Text.Lower([Extension]) = ".xlsx"
),
// 4) 各ブックの 1 枚目シートをテーブル化
AddedSheetTable =
Table.AddColumn(
OnlyXlsx,
"SheetTable",
each
let
wb =
Excel.Workbook(
[Content],
true,
true
),
firstSheetRow =
Table.SelectRows(wb, each [Kind] = "Sheet"){0},
firstSheetTable = firstSheetRow[Data],
promoted =
Table.PromoteHeaders(
firstSheetTable,
[PromoteAllScalars = true]
)
in
promoted,
type table
),
// 5) 代表テーブルから列名を取得
SampleTable = AddedSheetTable[SheetTable]{0},
ColNames = Table.ColumnNames(SampleTable),
// 6) SheetTable を展開して結合
Combined =
Table.ExpandTableColumn(
AddedSheetTable,
"SheetTable",
ColNames,
ColNames
)
in
Combined
Power Queryローカルの「フォルダ内 Excel 一括取込」とほぼ同じで、違うのは入口が SharePoint.Files で、
フォルダ指定に Folder Path を使っているところだけです。
重要ポイントの深掘り
Folder Path の文字列は「一度 UI で取ってコピペ」が一番確実
初心者が一番つまずきやすいのが「正しい Folder Path の文字列って何?」というところです。
ここは、無理に手打ちしようとせず、次の手順が一番ラクです。
Power Query の UI から「データの取得 → SharePoint フォルダー」を選ぶ。
サイト URL を入れて接続し、最初に出てきた一覧テーブルをそのままシートに出すか、プレビューで見る。
そこに表示されている Folder Path の値を、そのまま M コードにコピペする。
こうしておけば、「微妙なスペース」「Shared Documents の日本語名」などでハマるリスクを減らせます。
認証(資格情報)と権限の話
SharePoint.Files を初めて使うとき、ほぼ必ず「資格情報」を聞かれます。
ここで使うのは、普段 SharePoint にアクセスしているアカウントです。
もし「アクセスが拒否されました」系のエラーが出る場合は、
Power Query の問題ではなく「SharePoint 側でそのライブラリへの閲覧権限がない」可能性が高いです。
その場合は、サイト管理者に「少なくとも読み取り権限」を付けてもらう必要があります。
また、Excel 側の「プライバシーレベル」が厳しすぎると、
他のデータソースと結合するときに警告が出ることがあります。
そのときは、オプションからプライバシーレベルを調整する、という視点も持っておいてください。
Teams の「ファイル」も中身は SharePoint
Teams の「チーム → ファイル」に置かれているファイルも、実体は SharePoint です。
URL をよく見ると、だいたいこんな感じになっています。
https://xxx.sharepoint.com/sites/チーム名/Shared Documents/General/
なので、「Teams のフォルダを自動取込したい」という場合も、
やることはまったく同じです。
Teams の「ファイル」画面で「SharePoint で開く」を押す。
ブラウザのアドレスバーに出ている URL を、SharePoint.Files のサイト URL として使う。
Folder Path で「General」や「ドキュメント」配下を絞り込む。
こうしてしまえば、「Teams に置いてある日報を全部集計する」といったことも、
ローカルフォルダと同じ感覚で自動化できます。
実務テンプレとしてのまとめ
「SharePoint フォルダ自動取込」の型は、次の流れに集約できます。
SharePoint.Files(サイト URL) でサイト内のファイル一覧をテーブルとして取得する。
Folder Path で「対象フォルダ配下だけ」に絞り込む。
Extension で「対象拡張子だけ」に絞り込む。
Content を Csv.Document や Excel.Workbook に渡して、ローカルと同じように一括取込する。
一度この型を体に入れてしまえば、
「もうローカルにコピーしてから集計」は卒業できます。
SharePoint/Teams 上の“みんなが触るフォルダ”を、そのまま集計の入口にできるようになります。

