やったこと
今回はSharePoint2013のディスカッション掲示板で、「ディスカッションにだけ連番をつけたい」という要望に答えた際の備忘録です。
はじめに
SharePoint Onlineでも健在のディスカッション掲示板ですが、ディスカッションの最初の投稿(ディスカッション)と、それに対する返信(メッセージ)という2つのコンテンツタイプから形成されています。
ディスカッション掲示板の場合、アイテムのIDは、ディスカッションとメッセージいずれにも割り振られるため、ディスカッション一覧でIDを表示しても飛び飛びになります。
そこで今回の要望では、IDと異なる連番をディスカッションにだけつけてほしいとなりました。
コード
SharePoint2013での対応になります。必要なDllやonlineの場合の認証については太田さんの記事を参照してください。
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll";
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll";
$siteUrl = "<siteurl>";
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl);
$list = $ctx.get_web().get_lists().getByTitle('<ListTitle>');
$loopnum =<IDのMax>;
$counter=1;
for($i =1;$i -lt $loopnum;$i++){
$listItem = $list.GetItemById($i);
$ctx.Load($listItem);
$ctx.ExecuteQuery()
if($listItem.FieldValues.Title -ne $null){
$listItem = $list.GetItemById($i);
$listItem.set_item('fakeID','AAA-'+[string]$counter);
$listItem.update();
$ctx.Load($listItem);
$ctx.ExecuteQuery()
$counter = $counter+1;
}else{
}
Write-Output([string]$i+","+[string]$counter)
}
ポイントは、メッセージ(返信)ではタイトルが空になるということです。
通常ディスカッションはタイトルが必須になりますので、タイトルがnullかどうかで2つのアイテムを判別しました。
(ContentTypeIDでも判定できそうですが、うまく行かず。)
あとハマったのは、SharePointでの言語設定が日本語か英語かによってリスト名/列名が変わってしまうこと、列名に空白や記号が入ると、いずれの場合もリストがない、列がないエラーが出ました。
実際の実行時には英語にして、列名は一旦空白、記号をのぞいてから実行しています。
【2018/10/17追記】
列名は内部名を使えば問題なく解決できました。ここ参照
内部名の探し方はやはり太田さんの記事で。
あとは新規作成された場合の対応は、SharePoint Designerでワークフローを組んでいます。
こちらが非常に参考になりました。