【SharePoint Online】対象リストのコンテンツタイプ一覧を取得する【PowerShell】

こんにちは。
今回は、1つずつリストコンテンツタイプの中身を確認するのが面倒で仕方なかったので作成したスクリプトを紹介します。
このスクリプトでは、リストのすべてのコンテンツタイプの列名、必須の要否をCSVに出力します。
つまり、検証環境と同じ出力となれば単体テストは完了♪
シンプルながら、こういう手間がかかる工程を自動化するのは有意義だと思います。

処理概要

今回のスクリプトではサイトURLや接続情報などは、引数にとって処理する形にしています。
もしめんどくさければParamに規定値を設定してあげてもいいかもしれません。

実行すると、リスト名のフォルダがカレントディレクトリに作成され、その配下にコンテンツタイプごとに別れたCSVファイルが複数作成されます。

ファイルの中には、Name、Required、hiddenの列が存在します。
Name・・・列の内部名
Required・・・必須かどうか
hidden・・・非表示かどうか

リストコンテンツタイプの設定を確認するとわかりますが、
Requiredとhiddenは以下の設定値を賄っています。

スクリプト解説

はじめに、CSOMが端末にインストールされているかどうかを判定し、
必要なDLLを読み込みます。

# コンポーネント読み込み
Set-Location $PSScriptRoot 
Write-Host "Load CSOM libraries" -foregroundcolor black -backgroundcolor yellow 
if((test-path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll") -and (test-path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll")){
    Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
    Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
    Write-Host "CSOM libraries loaded successfully" -foregroundcolor black -backgroundcolor Green 
}else{
    throw('sharepointclientcomponentsが端末にインストールされていることを確認してください。')
}

もし環境にインストールされていなければ、以下からインストールをしましょう。
https://www.microsoft.com/en-us/download/details.aspx?id=42038

「#サイトのコンテキスト読み込み」セクションはCSOMを利用するときのお約束ですね。
今回はリスト内の情報を確認するので、合わせてListsもLoadしておきます。
コンテンツタイプの情報は、
$List.ContentTypes内にまとめて格納されていました。

そして最後にContentTypesを1つずつ処理していきます。

# コンテンツタイプをすべてエクスポート
$now = get-date -Format "yyyyMMddhhmmss"
CreateFolder($listTitle)
$contentTypes | %{
    $Datas = @()
    $fieldRefCollection = $_.FieldLinks
    $context.Load($fieldRefCollection)
    $context.ExecuteQuery()
    $ctName = $_.Name
    $fieldRefCollection | %{
        $Data = New-Object PSObject | Select-Object Name, Required, hidden
        $Data.Name = $_.Name
        $Data.Required = $_.Required
        $Data.hidden = $_.hidden
        $Datas += $Data
        
        $Datas | Export-Csv -Encoding UTF8 -Path "./${listTitle}/${listTitle}_${ctName}_${now}.csv" -NoTypeInformation
    }
}

コンテンツタイプのプロパティは「FieldLinks」に格納されています。
あとは読み込んだ「FieldLinks」をNew-ObjectでCSV用に整形してエクスポートするだけです。

終わりに

お客様の細かい要望を聞いてく内に、要件が様変わりしていくのを見ていると、
無性に悲しくなっていきますよね・・・
はっきりと断るPM,PLが存在しなくてはワーカーは心が死んでしまいます。

助けて・・・orz