SharepointリストをPowershellで更新する
SharepointのカスタムリストをPowershellでUpdateする方法
目次
以前ドキュメントライブラリの操作で使用したクライアント サイド オブジェクト モデル (以下、CSOM) のリモート実行モジュールを使います。
ドキュメントライブラリについての操作は下記をご覧ください
CSOMの入手
使用しているSharepointサーバに応じたCSOMモジュールを入手します。
SharePoint Online
Nuget 版
タイトル : Microsoft.SharePointOnline.CSOM
URL : https://www.nuget.org/packages/Microsoft.SharePointOnline.CSOM/
Microsoft Download 版
タイトル : SharePoint Online Client Components SDK
URL : https://www.microsoft.com/en-us/download/details.aspx?id=42038
SharePoint Server 2016
タイトル : SharePoint Server 2016 Client Components SDK
URL : https://www.microsoft.com/en-us/download/details.aspx?id=51679
SharePoint Server 2013
タイトル : SharePoint Server 2013 Client Components SDK
URL : https://www.microsoft.com/en-us/download/details.aspx?id=35585
SharePoint Server 2010
タイトル : SharePoint Foundation 2010 Client Object Model Redistributable
URL : http://www.microsoft.com/download/en/details.aspx?id=21786
リスト操作の準備
CSOMモジュールの読み込み
まずは、CSOMモジュールを読み込みます。結果が返ってくるので|Out-Nullで非表示にしてますが、表示しても一向に構いません。
1 2 3 |
# Read CSOM [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null |
サイトコレクションの読み込み
まずURLを指定します。OnlineにしろOn-Premiseにしろ、下記のいずれかで指定できると思います。
1 2 3 4 |
# SiteCollection URL $SiteCollectionUrl = "https://tenant-name.sharepoint.com" # $SiteCollectionUrl = "https://tenant-name.sharepoint.com/sites/subsite" # $SiteCollectionUrl = "http://sharepoint.contoso.local/sites/subusite/" |
認証情報の作成
Sharepoint Onlineの場合は認証情報を作成する必要があります。
1 2 3 4 5 6 |
# Account $Account = "user@contoso.com" $SecurePassword = Read-Host -Prompt "Enter Your Password." -AsSecureString # Create Credential $Credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Account, $SecurePassword) |
On-Premiseのサーバの場合には、統合認証が使えるので下記でもいけるはず。
1 2 |
# if you use on-premise server,you can use below $Credential = [System.Net.CredentialCache]::DefaultNetworkCredentials |
Contextの作成
Contextを作って、認証情報を付与します。
1 2 3 |
# Create Context $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteCollectionUrl) $Context.Credentials = $credential |
リストの名前を指定してリストを読み込む
1 2 3 4 5 6 |
$ListName = "ListName" #you can use 2-byte code # Create List object $List = $Context.Web.Lists.GetByTitle($ListName) $Context.Load($List) $Context.ExecuteQuery() |
サンプルでは”ListName”としていますが、2バイトコード指定ができるので日本語でもOKです。
リストの情報を表示してみましょう。
1 2 3 |
Write-Host "list Title : " $List.Title Write-Host "list BaseType : " $List.BaseType Write-Host "list Created : " $List.Created |
リストのアイテムを読み込む
CamlQueryを準備してアイテムを読み込みます。xmlが無指定で良ければ全件読み込みます。
1 2 3 4 5 6 |
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery $Query.ViewXml = "" $ListItems = $List.getItems($Query) $Context.Load($ListItems) $Context.ExecuteQuery() |
これで$ListItemsにリストアイテムの配列が格納されます。
何件確認されているか見てみましょう。
1 |
$ListItems.Count |
これで更新対象のリストが準備できました。
リストのアイテムに対して更新をする
$ListItemsはリストアイテムの配列なので、個々のアイテムを取り出して操作をする必要があります。
$ListItems.getById(1)で取り出せるはずなんですが、筆者の環境ではうまく行かなかったので(T_T)、
foreach文を使うことにします。
まずは試しに内容を表示させてみましょう。
1 2 3 4 |
foreach($item in $ListItems) { Write-Host $item.Id.ToString() `t $item["Title"] `t $item["User"].LookupValue $item["Mail"].LookupValue `t $item["URL"].Description `t $item["URL"].URL } |
ユーザー毎の名前(User)、Mail、個人別サイト(URL)が格納されたリストを想定します。
$item[“Title”]はitemメソッドを使って、$item.item(‘Title’)と表記することも出来ます。
テキスト項目を更新する
テキストの項目であれば、代入するだけで更新できます。
1 2 3 |
#Text Field $item["Title"] ="Test" $item.Update() |
このUpdateメソッドは手元のオブジェクトを更新するだけなので、サーバに反映するには$Context.ExecuteQuery()メソッドを実行する必要があります。複数行をまとめてExecuteQueryするとコケることがあるので、1アイテムごとにやった方が良さそうです。
選択式の項目もテキスト項目と同じ要領で更新できます。
URL項目を更新する
[ハイパーリンクまたは画像]列はFieldUrlValue型に格納されています。新しいオブジェクト作って、プロパティを設定、FieldUrlValue型にCastしてから格納してすると更新できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
#URLValue $Mail = $item["Mail"].LookupValue $CN = $Mail.Split("@")[0] $Url = "http://mysite.sharepoint.contoso.local/personal/" + $CN $Description =$CN $field = New-Object Microsoft.SharePoint.Client.FieldUrlValue $field.Description = $Description $field.URL = $Url if($null -eq $item["URL"] ){ $item["URL"] =[Microsoft.SharePoint.Client.FieldUrlValue]$field } |
ユーザー項目を更新する
[ユーザーまたはグループ]列はFieldUserValue型に格納されています。Idで管理されていますが、URLと同じ様にFieldUserValue型にCastしてから格納します。
1 2 3 4 5 |
#UserValue $EditorValue = New-Object Microsoft.SharePoint.Client.FieldUserValue $EditorValue.LookupId = $item["User"].LookupId $EditorValueCollection = [Microsoft.SharePoint.Client.FieldUserValue[]] $EditorValue $item["Editor"] = $EditorValueCollection |
更新&片付け
一通り更新が終わったらExecuteQueryしてDisposeしてオブジェクトを開放しましょう。
1 2 3 4 |
$Context.ExecuteQuery() # Dispose Context $Context.Dispose() |
“SharepointリストをPowershellで更新する” に対して4件のコメントがあります。