チュートリアル: SharePoint サイトのバージョン使用状況レポートを生成して分析する
サイト上のバージョン ストレージを理解することで、organizationの復旧目標を達成し、ストレージ コストを管理するために、バージョン履歴の設定をより適切に最適化できます。
このチュートリアルでは、バージョン ストレージ使用状況レポートを生成し、それを分析してサイトのバージョン ストレージフットプリントをより深く理解する方法について説明します。 レポートを使用して、異なるバージョン制限の適用や既存のバージョンのトリミングの 'what-if' 分析を実行 することもできます。
このチュートリアルでは、次の方法について説明します。
- サイトまたはライブラリのバージョン ストレージ使用状況レポート ファイルを生成します。
- レポート生成の進行状況を確認します。
- レポート ファイルについて説明します。
- Excel または PowerShell を使用してバージョン ストレージの使用を分析します。
後のチュートリアルでは、生成された CSV レポートで影響分析を実行する方法を確認します。
開始する前に
- バージョン ストレージの使用状況を理解する SharePoint サイト、OneDrive アカウント、またはドキュメント ライブラリを特定します。
- レポートを保存する SharePoint ドキュメント ライブラリ内の場所を選択します。
- 最新の SharePoint Online 管理シェルをダウンロードします。
注:
- レポート ファイルは、指定されたレポートの場所内に生成されます。
- レポートの場所は、SharePoint ドキュメント ライブラリ自体内にある必要があります。
- ドキュメント ライブラリにレポートと同じ名前のファイルを指定することはできません。
サイトまたはライブラリのバージョン使用状況レポートを生成する
New-SPOSiteFileVersionExpirationReportJob
コマンドを実行するか、New-SPOListFileVersionBatchDeleteJob
コマンドを実行してライブラリで、サイトで使用されている現在のバージョンのストレージに関するレポートを生成できます。
次の例では、ジョブがキューに入り、レポートの場所 https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv
サイト スコープのレポートを生成します。
New-SPOSiteFileVersionExpirationReportJob -Identity https://contoso.sharepoint.com/sites/site1 -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
次の例では、ジョブをキューに入れた後、レポートの場所 ( https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv
) にライブラリスコープのレポートを生成します。
New-SPOListFileVersionExpirationReportJob -Site https://contoso.sharepoint.com/sites/site1 -List "Documents" -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
レポート生成の進行状況を確認する
Get-SPOListFileVersionExpirationReportJobProgress
コマンドを使用して、レポート生成要求の進行状況を追跡します。
次の例は、サイトスコープのレポートが完全に設定され、分析する準備ができている場合にチェックする方法を示しています。
Get-SPOSiteFileVersionExpirationReportJobProgress -Identity https://contoso.sharepoint.com/sites/site1 -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
次の例は、ライブラリスコープのレポートが完全に設定され、分析する準備ができている場合にチェックする方法を示しています。
Get-SPOListFileVersionExpirationReportJobProgress -Site https://contoso.sharepoint.com/sites/site1 -List "Documents" -ReportUrl "https://contoso.sharepoint.com/sites/sites1/reports/MyReports/VersionReport.csv"
コマンドレットは JSON 形式で応答を返します。 返された json 応答には、status という名前のキーがあります。 次の予期される値の 1 つについては、次の表を参照してください。
JSON 状態応答 | 説明 |
---|---|
"completed" | ジョブが正常に完了し、レポートが完全に設定されました。 |
"in_progress" | アクティブなジョブがあります。 レポートが部分的に設定されます。 |
"no_report_found" | 指定したファイルを設定するアクティブなジョブはありません。 |
"failed" | エラー メッセージが原因で、レポートを生成するジョブが失敗しました。 エラーからのエラー メッセージの "error_message" を確認します。 |
バージョン レポート ファイルについて
生成されたレポートは CSV 形式で、各行はファイル バージョンに対応します。 ファイル バージョンの有効期限レポートとその列の内訳の例を次に示します。
最初の行は、ファイル バージョン識別子、バージョン メタデータ情報、および有効期限タイムスタンプを含む列識別子を含むヘッダーです。 コンパクト列は、2 つの連続する行の値が同じ場合に値を繰り返さない修正後 .Compact
で示されます。 他の行はファイル バージョンを表し、各行は 1 つのバージョンを表します。
このレポートに表示される最初のファイル バージョンを見てみましょう。
ファイル バージョン識別子:
WebId
、DocId
、MajorVersion
、MinorVersion
SharePoint サイト内の各バージョンを一意に識別します。バージョン メタデータ識別子:
WebUrl
はhttps://contoso.sharepoint.com
のバージョンを示し、FileUrl
は、このバージョンのファイルが DocLib/MyDocument.docx にあることを示します。 つまり、DocLib
というドキュメント ライブラリ内にあり、ファイルはDocLib
のルート フォルダーにあり、MyDocument.docx という名前です。Size
は、バージョンが 92,246 バイトのストレージを使用することを示します。次の 2 つの列 (
ModifiedBy_UserId
とModifiedBy_DisplayName
は、ユーザー Michelle Harris (ユーザー ID 6) がこのバージョンを作成したことを示しています。LastModifiedDate
は、バージョンのコンテンツが 2023 年 3 月 13 日の 22:36:09 UTC に最後に変更されたことを示します。SnapshotDate
は、バージョンが 2023 年 3 月 20 日 16:56:51 UTC の履歴バージョンになったことを示します。IsSnapshotDateEstimated
は、SnapshotDate
が実際のスナップショット日付であることを示しています。有効期限スケジュール識別子:
CurrentExpirationDate
は、このバージョンが現在期限切れにならないように設定されていることを示します。AutomaticPolicyExpirationDate
は、自動的に期限切れポリシーの下で、このバージョンも期限切れにならないように設定されていることを示しています。TargetExpirationDate
は、トリミングのためにこのスケジュールに従う場合、このバージョンを期限切れにならないように設定することを示します。
注:
このレポートには、保持保留ライブラリに格納されているファイル バージョンも含まれます。
3 番目のバージョンを見てみましょう。
これらの列はコンパクトな列であるため、 WebId
と DocId
の値は空です。 コンパクトな 修正後、値を持つ必要があることを意味します。 その行の上の最後の空きがない場合は、WebId
が4c7a58c1-01f2-4fa3-a730-44081a44f689
として、18c3e09c-b5be-48e7-a754-7a2ce53e0999
としてDocId
されます。
また、 TargetExpirationDate
は 2023 年 4 月 19 日 18:08:53 UTC に設定されていることがわかります。 これは、このスケジュールに基づいてトリミングする場合、このバージョンの有効期限をその時刻に設定することを意味します。
注:
すべての日付時刻は、ラウンドトリップ形式で表されます。 詳細については、「Standard日付と時刻の書式指定文字列 - .NET |Microsoft Learn
サイトのバージョン ストレージを分析する
分析を開始する前に、レポート ファイルの TargetExpirationDate
列を、期限切れにするバージョンなど、必要な日付に更新する必要があります。 ここでも、バージョンの過去の日付を選択すると、そのバージョンは "既に期限切れになっていたバージョン" として扱われ、トリミングを開始するとすぐに削除されます。
csv ファイルを編集することで、 TargetExpirationDate
の日付を手動で更新できます。 ただし、手動で更新するには行が多すぎる可能性があります。 列を一括更新するには、Excel 数式を使用するか、「 チュートリアル: What-If 分析を実行する」で提供した PowerShell スクリプトのいずれかを使用することもできます。 具体的には、トリミング モードを選択し、対応するスクリプトを実行して、そのトリミング モードに基づいて TargetExpirationDate
が入力された更新された csv ファイルを取得し、そこから続行できます。
オプション 1: Excel を使用してレポートを分析する
AnalyzeReportFile_Template.xlsx共有 Excel ブック を 開きます。 その中に次のワークシートがあります。
- 構成: このワークシートを使用して、さまざまなレポート ビューを生成する日付範囲を設定します。
- データセット: このワークシートは、レポート ファイルからインポートされた生のデータセットです。 このデータセットから、さまざまなレポートの概要ビューが作成されます。
-
プリセット レポート: サイトに保存されているバージョンに選択した設定を適用した場合の影響を把握するために使用できるプリセット ビューの一覧を次に示します。
- 概要: 新しい設定で、このサイトのバージョン ストレージの現在の状態と削除されたバージョンの配布を分析します。
- 影響を受けるユーザー: 新しい設定で影響を受けるバージョンのユーザーを確認します。
- バージョン数: 現在のスケジュールで使用できるバージョンの数と、新しいスケジュールで使用できるバージョンの数を示すテーブルとグラフ。
- バージョン サイズ分析: 現在のスケジュールで削除されるバージョンのサイズと、新しいスケジュールで使用できるバージョンの数を比較します。
- ファイル レベル分析: 新しい設定でファイル レベルのバージョンの削除を確認します。
次の手順に従ってブックを設定します。
[ 構成 ] ワークシートで、 セル B3 の What-If レポート ファイルへの完全なパスを入力します。
[ 使用可能なバージョン数 ] ワークシートまたは [ バージョンのサイズ] [期限切れのワークシート] でグラフの日付範囲を変更する場合は、セル B6、B7、B10、および/または B11 の対応する値を変更します。 これは省略可能です。
Excel の上部にある [ データ ] タブを選択し、リボンで [ すべて更新 ] ボタンを選択します。
[ ファイル レベル分析 ] ワークシートで、[ バージョン数 ] 列と [ 削除後の残りのバージョン数 ] 列を自動入力します。
[ 影響を受けるユーザー ] ワークシートで、[ バージョンの数が削除されます ] 列を自動入力します。
これで、すべてのワークシートが最新の状態になります。 関心のある情報をチェックできます。
オプション 2: PowerShell を使用してレポートを分析する
- スクリプトをAnalyzeReportFile.ps1 という名前のファイルとして保存します 。
# save this file as AnalyzeReportFile.ps1
Param(
[Parameter(Mandatory=$true)][string] $ReportLocalFilePath,
[Parameter(Mandatory=$false)][int]$ShowFilesWithFewerThanNVersions=10,
[Parameter(Mandatory=$false)][DateTime]$TimelineStartDate=[DateTime]::Now,
[Parameter(Mandatory=$false)][int]$TimelineStepDays=10,
[Parameter(Mandatory=$false)][int]$TimelineNumSteps=10
)
function Import-Dataset($DatasetFilePath)
{
$Dataset = Import-CSV $DatasetFilePath
$Columns = $Dataset `
| Get-Member -MemberType 'NoteProperty' `
| Select-Object -ExpandProperty Name
$CompactColumns = $Columns | Where-Object { $_ -Match ".Compact" }
$Timer = [Diagnostics.Stopwatch]::StartNew()
for ($RowIndex = 0; $RowIndex -lt $Dataset.Count; $RowIndex++)
{
if ($RowIndex -gt 0)
{
$PrevRow = $Dataset[$RowIndex-1]
}
$Row = $Dataset[$RowIndex]
foreach ($ColName in $Columns)
{
if ([string]::IsNullOrEmpty($Row.$ColName))
{
if (($ColName -in $CompactColumns) -and ($RowIndex -gt 0))
{
$Row.$ColName = $PrevRow.$ColName
}
else
{
$Row.$ColName = $null
}
}
}
$Row."WebId.Compact" = [Guid]$Row."WebId.Compact"
$Row."DocId.Compact" = [Guid]$Row."DocId.Compact"
$Row."MajorVersion" = [Int32]$Row."MajorVersion"
$Row."MinorVersion" = [Int32]$Row."MinorVersion"
$Row."WebUrl.Compact" = [String]$Row."WebUrl.Compact"
$Row."FileUrl.Compact" = [String]$Row."FileUrl.Compact"
$Row."Size" = [Int64]$Row."Size"
$Row."ModifiedBy_UserId.Compact" = [String]$Row."ModifiedBy_UserId.Compact"
$Row."ModifiedBy_DisplayName.Compact" = [String]$Row."ModifiedBy_DisplayName.Compact"
$Row."LastModifiedDate" = [DateTime]$Row."LastModifiedDate"
$Row."SnapshotDate" = [DateTime]$Row."SnapshotDate"
$Row."IsSnapshotDateEstimated" = [bool]$Row."IsSnapshotDateEstimated"
$Row."CurrentExpirationDate" = [System.Nullable[DateTime]]$Row."CurrentExpirationDate"
$Row."AutomaticPolicyExpirationDate" = [System.Nullable[DateTime]]$Row."AutomaticPolicyExpirationDate"
$Row."TargetExpirationDate" = [System.Nullable[DateTime]]$Row."TargetExpirationDate"
$Percent = [Math]::Ceiling(100 * $RowIndex / $Dataset.Count)
Write-Progress `
-Activity "Reading dataset" `
-Status "$Percent% Complete ($($RowIndex + 1) / $($Dataset.Count) rows):" `
-PercentComplete $Percent `
-SecondsRemaining $(($Dataset.Count - ($RowIndex + 1)) / (($RowIndex + 1) / $Timer.Elapsed.Totalseconds))
}
$Timer.Stop()
return $Dataset
}
function Get-NumVersionExpiresByDate($Dataset, $ColName, $DateCutoff)
{
$VersionsExpired = $Dataset | Where-Object { ($null -ne $_.$ColName) -and ($_.$ColName -le $DateCutoff) }
$IsTodayStr = ""
If ((Get-Date).Date -eq ($DateCutoff).Date)
{
$IsTodayStr = "*"
}
return [PSCustomObject]@{
Today = $IsTodayStr
Date = $DateCutoff
NumberOfVersionsAvailable = $Dataset.Count - $VersionsExpired.Count
NumberOfVersionsExpired = $VersionsExpired.Count
SizeOfVersionsExpiredInBytes = ($VersionsExpired | Measure-Object Size -Sum).Sum
}
}
function Get-FilesWithFewerThanNVersions($Dataset, $NumVersions)
{
$AvailableVersionsByFile = $Dataset `
| Where-Object { ($null -eq $_.TargetExpirationDate) -or ($_.TargetExpirationDate -gt [DateTime]::Now) } `
| Group-Object -Property WebId.Compact, DocId.Compact
$AvailableFilesWithNotEnoughVersions = @{}
# Files with some versions left but not enough
$AvailableVersionsByFile `
| Where-Object Count -lt $NumVersions `
| ForEach-Object { $AvailableFilesWithNotEnoughVersions[$_.Name] = $_.Count }
# Files with 0 versions left
$Dataset `
| Group-Object -Property WebId.Compact, DocId.Compact `
| Where-Object { $AvailableVersionsByFile.Name -notcontains $_.Name } `
| ForEach-Object { $AvailableFilesWithNotEnoughVersions[$_.Name] = 0 }
# Stitch all of the data together
return $Dataset `
| Group-Object -Property WebId.Compact, DocId.Compact `
| Where-Object Count -ge $NumVersions `
| Where-Object { $AvailableFilesWithNotEnoughVersions.Contains($_.Name) } `
| ForEach-Object `
{
$fileUrl = $_.Group[0]."WebUrl.Compact" + "/" + $_.Group[0]."FileUrl.Compact"
$numberOfVersionsAvailableBeforeTrim = $_.Count
$numberOfVersionsAvailableAfterTrim = $AvailableFilesWithNotEnoughVersions[$_.Name]
$numberOfVersionsTrimmed = $numberOfVersionsAvailableBeforeTrim - $numberOfVersionsAvailableAfterTrim
[PSObject]::new() |
Add-Member -PassThru -NotePropertyMembers ([Ordered]@{
FileUrl = $fileUrl
NumberOfVersionsAvailableBeforeTrim = $numberOfVersionsAvailableBeforeTrim
NumberOfVersionsAvailableAfterTrim = $numberOfVersionsAvailableAfterTrim
NumberOfVersionsTrimmed = $numberOfVersionsTrimmed
})
} `
| Sort-Object -Property NumberOfVersionsAvailableAfterTrim
}
function Get-MostImpactedUsers($Dataset)
{
$VersionsExpired = $Dataset | Where-Object { ($null -ne $_.TargetExpirationDate) -and ($_.TargetExpirationDate -le [DateTime]::Now) }
return $VersionsExpired `
| Group-Object -Property ModifiedBy_UserId.Compact `
| Select-Object `
@{ L = "UserId"; E = { $_.Group[0]."ModifiedBy_UserId.Compact" } }, `
@{ L = "UserDisplayName"; E = { $_.Group[0]."ModifiedBy_DisplayName.Compact" } },
@{ L = "NumberOfVersionsTrimmed"; E = { $_.Count } } `
| Sort-Object -Property NumberOfVersionsTrimmed -Descending
}
$Dataset = Import-Dataset -DatasetFilePath $ReportLocalFilePath
$CurrentExpirationSummaryTable = @()
$TargetExpirationSummaryTable = @()
$Timer = [Diagnostics.Stopwatch]::StartNew()
for ($Step = 0; $Step -lt $TimelineNumSteps; $Step++)
{
$DateCutOff = $TimelineStartDate.AddDays($TimelineStepDays * $Step)
$CurrentExpirationSummaryTable += `
Get-NumVersionExpiresByDate -Dataset $Dataset -ColName CurrentExpirationDate -DateCutoff $DateCutOff
$TargetExpirationSummaryTable += `
Get-NumVersionExpiresByDate -Dataset $Dataset -ColName TargetExpirationDate -DateCutoff $DateCutOff
}
$Timer.Stop()
Write-Host "===========================" -ForegroundColor Yellow
Write-Host "Current Expiration Schedule" -ForegroundColor Yellow
Write-Host "===========================" -ForegroundColor Yellow
$CurrentExpirationSummaryTable | Format-Table -Autosize | Out-String | Write-Host
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds / 2)" -ForegroundColor Green
Write-Host
Write-Host "==========================" -ForegroundColor Yellow
Write-Host "Target Expiration Schedule" -ForegroundColor Yellow
Write-Host "==========================" -ForegroundColor Yellow
$TargetExpirationSummaryTable | Format-Table -Autosize | Out-String | Write-Host
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds / 2)" -ForegroundColor Green
Write-Host
Write-Host "================================" -ForegroundColor Yellow
Write-Host "Files with Fewer Than $ShowFilesWithFewerThanNVersions Versions" -ForegroundColor Yellow
Write-Host "================================" -ForegroundColor Yellow
$Timer = [Diagnostics.Stopwatch]::StartNew()
Get-FilesWithFewerThanNVersions -Dataset $Dataset -NumVersions $ShowFilesWithFewerThanNVersions | Format-Table -Autosize | Out-String | Write-Host
$Timer.Stop()
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds)" -ForegroundColor Green
Write-Host
Write-Host "==============" -ForegroundColor Yellow
Write-Host "Users Impacted" -ForegroundColor Yellow
Write-Host "==============" -ForegroundColor Yellow
$Timer = [Diagnostics.Stopwatch]::StartNew()
Get-MostImpactedUsers -Dataset $Dataset | Format-Table -Autosize | Out-String | Write-Host
$Timer.Stop()
Write-Host "Total elapsed seconds: $($Timer.Elapsed.TotalSeconds)" -ForegroundColor Green
Write-Host
- PowerShell を開き、次のコマンドを実行し、プレースホルダーの値を適切な値に置き換えます。
注:
PowerShell 7 を使用してコマンドを実行します。 PowerShell 7 は、次の手順に従ってインストールできます。 Windows への PowerShell のインストール - PowerShell |Microsoft Learn。
. “<path to AnalyzeReportFile.ps1>” –ReportLocalFilePath “<path to the file version expiration What-If report .csv file>”
- 出力には、次の 4 つのテーブルが表示されます。
現在の有効期限スケジュール: この表には、バージョンの時系列の概要が含まれています。 次の列があります。
- 日付: 最初の列は日付を表します。
- NumberOfVersionsAvailable: 現在のスケジュールの下でその日付で使用可能なバージョンの数。
- NumberOfVersionsExpired: 現在のスケジュールの下でその日付に期限切れになったバージョンの数。
- SizeOfVersionsExpiredMB: 現在のスケジュールの下でその日付に期限切れになったバージョンのサイズ。
ターゲットの有効期限スケジュール: このテーブルは現在の有効期限スケジュールと同じですが、代わりに更新されたスケジュールが反映されます。 このテーブルは、ファイル バージョンの有効期限レポートの TargetExpirationDate 列を変更して、さまざまな有効期限シナリオをテストする場合にのみ役立ちます。
バージョンが 10 未満のファイル: URL の一覧と、直ちに削除された後 (ただし、即時削除の前に 10 を超えた) バージョン数が 10 未満のファイルの削除前後のバージョンの数。
影響を受けるユーザー: バージョンが直ちに削除されるユーザー。
必要に応じて、パラメーターを調整できます。
-
TimelineStartDate
: 上記の表 1 および表 2 の開始日。 -
TimelineStepDays
: 上記の表 1 と表 2 の行間の日数。 -
TimelineNumSteps
: 上記の表 1 と表 2 で計算する行数。 -
ShowFilesWithFewerThanNVersions
: 上記の表 3 のバージョン数のしきい値。