Sharepoint Listの内部コードを調べる
Sharepointのカスタムリストで内部コードを調べる方法
SharepointカスタムリストをPowershellから操作する
Sharepointのカスタムリストを外部から操作しようとすると、列の指定に内部コードが必要になります。Powershellを使ったリストの更新方法を記事にしてますので参照してください。
2バイトコード列名の操作
列名に日本語(というか2バイトコード)を採用していると、日本語で指定できず内部コードが必要になります。どこかに設定が表示されないかと調べてみたんですが、Web上では表示されず「列の編集画面のField=」の値を引っ張ってくるしか無いようです。
例えば「名前」という列を作るとこうなります。
Field=%5Fx540d%5F%5Fx524d%5F
%5F自体がURL用にEncodeされたもので、「_」(アンダースコア)を変換したものです。
検索すればdecode/encodeをするWebページもあるんですが、外部に情報をわたさなくてもscript言語であれば変換できます。例えば、上記サンプルで使っているPowershellだとWindowsの.Netライブラリを読み込んで下記のようにすると変換できます。
void[reflection.assembly]::LoadWithPartialName("System.Web")
$Field =%5Fx540d%5F%5Fx543d%5F"
[System.Web.HttpUtility]::UrlDecode($Field)
これを実行すると、下記が返ってきます。
_x540d__x543d_
これはUTF8コードで下記を意味します。
x540d:名
x524d:前
つまり、2バイトコードを文字コードに変換してるわけですね。で、最長32文字らしく5文字以上だと途中で打ち切られます。
列名を変更してもこの内部コードは変わりません。
一方、デフォルトで用意されているTitle,Id,Editorといったフィールドは英語のままです。
つまり最初に列が作成された時の名前で内部コードは作られるんですね。
面倒なので、列を作る際には一度英数字で作ってその後名称を変えることをおすすめします。
Powershellを使って内部コードを調べる
2バイト項目が数個だったら良いんですが、何十個もあるようだと面倒ですよね。
Powershellを使ってリストの設定を一括で調べる方法があります。
まずはSharepointのPowershell操作の記事にあるCSOMライブラリを入手してください。
読み込み等、実行するまでの準備は上記記事に詳細を記載してありますのでそちらを御覧ください。
コードとしては以下のとおりです。
# Read CSOM
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
# SiteCollection URL
$SiteCollectionUrl = "https://tenant-name.sharepoint.com"
$SiteCollectionUrl = "https://tenant-name.sharepoint.com/sites/subsite"
#if you use on-piremise server, use below
$SiteCollectionUrl = "http://sharepoint.contoso.local/sites/subsite/"
# Account
$Account = "user01@tenant-name.onmicrosoft.com"
$SecurePassword = Read-Host -Prompt "Enter Your Password." -AsSecureString
# Create Credential
$Credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Account, $SecurePassword) #if you use on-piremise server, use below
#if you use on-piremise server, you can use below
$Credential = [System.Net.CredentialCache]::DefaultNetworkCredentials
# Create Context
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl)
$Context.Credentials = $credential
$ListName = "ListName" #you can use 2-byte code
# Create List object
$List = $null
$List = $Context.Web.Lists.GetByTitle($ListName)
次に、リストのFields設定を読み込みます。
$Context.Load($List) $Context.Load($List.Fields) $Context.ExecuteQuery()
これで、Fieldsの設定にアクセスできるようになりました。
CSVに出力しても良いんですが、内部的な列も出力されてしまうのでHidden設定になっているものは除外して出力してみます。
$List.Fields|Where-Object{$_.Hidden -eq $false}| Export-csv .\ListSetting.csv -Encoding UTF8 -NoTypeInformation
InternalName列を参照してもらうと、わざわざDecodeしなくても一覧が取得できます。
ただ、このままだと使いづらいので、日本語で表示されている列名で操作を実現する方法をご紹介します。表示される列名はTitle列に記載されています。これを変数名にしてしまうのです。
表示名が同じ列がある場合は、わかりやすいようにCSVを編集してください。その上で再度取り込んで、Set-Variableコマンドレットで設定してやります。
#import edited csv to PSCustomObject array by using import-csv cmdlet
$ListSetting =Import-Csv .\ListSetting.csv -Encoding UTF8
#set column title to variable
foreach($Column in $ListSetting){
Set-Variable -Name $Column.Title -Value $Column.InternalName
Write-Host "Variable:" $Column.Title "`t Value:"( Get-Variable -name $Column.Title).Value
}
こうすると、晴れて表示されている列名で操作できます。
続けて操作する場合はContextが移っているのでListに戻して読み込み直してください。
例えばこんな感じ
#reload List
$Context.Load($List)
$Context.ExecuteQuery()
#load ListItems
$ListItems =$null
$ListItems = $List.getItems($Query)
$Context.Load($ListItems)
$Context.ExecuteQuery()
#Now,you can use 2-byte code title by Variable
foreach($item in $ListItems)
{
Write-Host $item.Id.ToString() `t $item["Title"] `t $item[$所属].LookupValue `t $item[$名前].LookupValue `t $item[$メールアドレス].LookupValue
}
全体のコードとしてはこんな感じ
2バイトコードを使えるというカタログ値を鵜呑みにした前任者の汚いリストと格闘しています…😒
