SharePointサイト内の各ドキュメントライブラリ内のアイテム数を一覧でcsvにエクスポートする方法

イントラネット関連のアイキャッチ画像 IT Administration

SharePointのサイト内にある各ドキュメントライブラリのアイテム数をCSV出力する方法

SharePoint Onlineを運用していると、どのドキュメントライブラリにどのくらいのファイルが格納されているかを一覧で把握したい場面があります。
GUIでライブラリごとに数えることもできますが、サイトに多数のライブラリがある場合は非効率です。
本記事では、以下の2つの方法でライブラリごとのアイテム数をCSVに出力する方法をご紹介します。

  • PnP PowerShellを使う方法(管理者向け、高機能)
  • Power Query+SharePoint RESTを使う方法(PnP/Graph権限がない場合でも可)

作業環境:
Windows 11 Pro, SharePoint Online

方法1:PnP PowerShellを使う

管理者権限がある場合に最も効率的な方法です。サイト直下のすべてのドキュメントライブラリを取得し、ライブラリ名・件数・URLをCSVにまとめます。

ステップ1:PnP PowerShellを準備する

Install-Module -Name PnP.PowerShell -Force

ステップ2:サイトに接続する

Connect-PnPOnline -Url "https://yourtenant.sharepoint.com/sites/yoursite" -UseWebLogin

ステップ3:ライブラリ一覧と件数を取得してCSV出力

# ドキュメントライブラリのみ取得(BaseTemplate=101)
$libraries = Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 -and -not $_.Hidden }

$output = foreach ($lib in $libraries) {
    [PSCustomObject]@{
        LibraryTitle = $lib.Title
        ItemCount    = $lib.ItemCount
        Url          = $lib.DefaultViewUrl
    }
}

$output | Export-Csv -Path "C:\temp\LibraryItemCount.csv" -NoTypeInformation -Encoding UTF8
Write-Host "CSV出力が完了しました:C:\temp\LibraryItemCount.csv"

CSVを開けば、各ライブラリの件数とURLが一覧化されます。

方法2:PnP/Graph権限がない場合(Power Query+REST API)

管理者権限やPnPモジュールを導入できない場合でも、ExcelのPower QueryからSharePoint REST APIを叩いて一覧を取得可能です。対象サイトに閲覧権限があれば利用できます。

ステップA:Power Queryで接続

  1. Excel → [データ] → [データの取得] → [その他のソース] → [Webから] をクリック。
  2. URLに以下を入力(テナント/サイトは置き換え):
    https://yourtenant.sharepoint.com/sites/yoursite/_api/web/lists?$filter=BaseTemplate eq 101 and Hidden eq false&$select=Title,ItemCount,DefaultViewUrl
  3. 認証方法は「組織アカウント」を選択。
  4. ナビゲーターで list を展開し、「データの変換」をクリック。

ステップB:列を整形

  1. 展開して Title, ItemCount, DefaultViewUrl を表示。
  2. 列名を LibraryTitle, ItemCount, Url に変更。
  3. 「閉じて読み込む」でシートに展開。必要に応じてCSVとして保存。

参考:そのまま使えるMコード

let
    SiteUrl    = "https://yourtenant.sharepoint.com/sites/yoursite",
    Endpoint   = SiteUrl & "/_api/web/lists?$filter=BaseTemplate eq 101 and Hidden eq false&$select=Title,ItemCount,DefaultViewUrl",
    Source     = Json.Document(Web.Contents(Endpoint)),
    Value      = Source[value]?,
    ToTable    = if Value = null then #table({}, {}) else Table.FromList(Value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Expanded   = Table.ExpandRecordColumn(ToTable, "Column1", {"Title","ItemCount","DefaultViewUrl"}, {"LibraryTitle","ItemCount","Url"}),
    Typed      = Table.TransformColumnTypes(Expanded, {{"LibraryTitle", type text}, {"ItemCount", Int64.Type}, {"Url", type text}})
in
    Typed


拡張編:サブサイトも再帰取得/容量(MB/GB)も出力する

A. (PnP)サブサイトも再帰的に取得して集計

サイト階層(親サイト配下にサブサイトがある構成)でも、全サブサイトを再帰して各サイト内のライブラリ件数をまとめてCSV化できます。
下のスクリプトは「親サイトURL」を起点に、配下のサブサイトを巡回し、サイトURL・ライブラリ名・件数・URLを一括出力します。

# 起点サイトに接続
$rootUrl = "https://yourtenant.sharepoint.com/sites/yoursite"
Connect-PnPOnline -Url $rootUrl -UseWebLogin

# 再帰的にサブサイトURLを収集するヘルパー
function Get-AllWebUrls {
    param([string]$StartUrl)

    # 起点へ接続(PnPはWeb単位でコンテキストを切替えるのが安全)
    Connect-PnPOnline -Url $StartUrl -UseWebLogin | Out-Null

    $current = Get-PnPWeb
    $list = New-Object System.Collections.Generic.List[string]
    $list.Add($current.Url)

    # サブサイト一覧を取得(環境によっては Get-PnPSubWeb -Recurse が使える場合もあります)
    $subs = Get-PnPSubWeb
    foreach ($sub in $subs) {
        $list.AddRange( (Get-AllWebUrls -StartUrl $sub.Url) )
    }
    return $list
}

$allWebs = Get-AllWebUrls -StartUrl $rootUrl | Select-Object -Unique

# すべてのWebを巡回してライブラリ件数を収集
$rows = foreach ($webUrl in $allWebs) {
    Connect-PnPOnline -Url $webUrl -UseWebLogin | Out-Null
    $libs = Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 -and -not $_.Hidden }
    foreach ($lib in $libs) {
        [PSCustomObject]@{
            SiteUrl      = $webUrl
            LibraryTitle = $lib.Title
            ItemCount    = $lib.ItemCount
            Url          = $lib.DefaultViewUrl
        }
    }
}

$csv = "C:\temp\AllSites_LibraryItemCount.csv"
$rows | Export-Csv -Path $csv -NoTypeInformation -Encoding UTF8
Write-Host "CSV出力:$csv"

注:サブサイトが多数ある環境では処理時間がかかります。実行前に対象範囲を把握し、必要に応じて特定のURL配下のみを対象にしてください。

B. (PnP)容量(MB/GB)も出力する(慎重運用)

ライブラリの合計サイズはAPIで即時に取得できない場合があり、ライブラリ内のファイルサイズを合計するのが確実です。
ただし、大規模ライブラリでは負荷が高くなるため、対象を限定しての実行を推奨します(夜間などに計画実行)。

# 1ライブラリの総サイズ(バイト)を見積もるヘルパー:大規模は時間がかかります
function Get-LibrarySizeBytes {
    param(
        [Parameter(Mandatory)][string]$LibraryTitle
    )
    # ページングでアイテムを取得(ファイルのみ)
    # 大量の場合は -PageSize を小さめにするなど調整
    $sum = 0
    $items = Get-PnPListItem -List $LibraryTitle -PageSize 5000 -Fields "File_x0020_Size","FSObjType" -ScriptBlock `
        { Param($items) $items }

    foreach ($it in $items) {
        # FSObjType=0 がファイル、1がフォルダ
        if ($it["FSObjType"] -eq 0) {
            $size = [int64]($it["File_x0020_Size"])
            $sum += $size
        }
    }
    return $sum
}

# サイト直下でサイズも併せて出力
$siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite"
Connect-PnPOnline -Url $siteUrl -UseWebLogin

$libraries = Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 -and -not $_.Hidden }

$rows = foreach ($lib in $libraries) {
    $bytes = Get-LibrarySizeBytes -LibraryTitle $lib.Title
    [PSCustomObject]@{
        LibraryTitle = $lib.Title
        ItemCount    = $lib.ItemCount
        SizeBytes    = $bytes
        SizeMB       = [math]::Round($bytes/1MB,2)
        SizeGB       = [math]::Round($bytes/1GB,2)
        Url          = $lib.DefaultViewUrl
    }
}

$csv = "C:\temp\LibraryItemCount_Size.csv"
$rows | Export-Csv -Path $csv -NoTypeInformation -Encoding UTF8
Write-Host "CSV出力:$csv"
  • メリット:実測に近い容量が得られる(アクセス権がある範囲)。
  • デメリット:アイテムが多いと時間がかかる/API負荷が上がる。
  • 対策:対象ライブラリを事前に絞る、夜間バッチで実行、ページサイズを調整。

C. 複数サイトを一括処理する(PnP+サイト一覧CSV)

複数のサイトURLをCSVに並べておき、順に処理することで一括レポートが作れます。

# sites.csv :列名 = SiteUrl
# https://yourtenant.sharepoint.com/sites/hr
# https://yourtenant.sharepoint.com/sites/finance
# ...

$sites = Import-Csv "C:\temp\sites.csv"

$all = foreach ($s in $sites) {
    try {
        Connect-PnPOnline -Url $s.SiteUrl -UseWebLogin | Out-Null
        $libs = Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 -and -not $_.Hidden }
        foreach ($lib in $libs) {
            [PSCustomObject]@{
                SiteUrl      = $s.SiteUrl
                LibraryTitle = $lib.Title
                ItemCount    = $lib.ItemCount
                Url          = $lib.DefaultViewUrl
            }
        }
    } catch {
        [PSCustomObject]@{ SiteUrl=$s.SiteUrl; LibraryTitle="(接続エラー)"; ItemCount=$null; Url=$null }
    }
}

$csv = "C:\temp\MultiSite_LibraryItemCount.csv"
$all | Export-Csv -Path $csv -NoTypeInformation -Encoding UTF8
Write-Host "CSV出力:$csv"

D. Power Query 版の注意(容量取得)

Power Query+REST 方式では、アイテム数は容易に取得できますが、ライブラリの容量(MB/GB)は標準RESTのみでは取得が難しいため、本記事では「件数のみ」を対象としています。容量が必要な場合は、PnPまたは管理センター系のレポートをご検討ください。

まとめ

本記事では、SharePoint Onlineのドキュメントライブラリごとのアイテム数をCSV出力する方法を2通り紹介し、拡張としてサブサイト再帰処理容量出力の手順も示しました。

PnP PowerShell:管理者向け。サイト階層全体の収集、容量算出、複数サイト一括処理など拡張性が高い。
Power Query+REST:一般ユーザー向け。閲覧権限があれば追加モジュールなしで実行可能(件数取得に最適)。

目的と環境に応じて使い分けることで、運用の見える化と整理が効率よく進みます。

コメント

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