Power Query 実務テンプレ | データ取込・更新系:SharePointフォルダ自動取込

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「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 上の“みんなが触るフォルダ”を、そのまま集計の入口にできるようになります。

タイトルとURLをコピーしました