Aggiornare un campo multi utente di SharePoint con CSOM e PowerShell
Per aggiornare un campo multi utente di SharePoint Online è necessario usare il Client Side Object Model (CSOM) .
Quello che segue è un esempio in PowerShell per aggiungere un item.
Prima di tutto vanno caricati riferimenti alle DLL necessarie:
poi va letta la password dell'utente con cui collegarsi (Read-Host) e costruito l'oggetto contenente le credenziali (SharePointOnlineCredentials):
successivamente creo il contesto con le corrette credenziali e leggo il l'oggetto web:
accedo agli items (GetItems) delle lista (Lists.GetByTitle), se serve con una query CAML specifica (CamlQuery):
inserisco un nuovo item ( Microsoft.SharePoint.Client.ListItemCreationInformation ) con un campo user multiplo ( Microsoft.SharePoint.Client.FieldUserValue[] ):
l'utente, prima di essere assegnato al campo, deve esserene verifica l'esistenza tramite il metodo '$web.EnsureUser( email ).
Quello che segue è un esempio in PowerShell per aggiungere un item.
Prima di tutto vanno caricati riferimenti alle DLL necessarie:
PowerShell
#carico le DLL necessarie https://www.microsoft.com/en-us/download/details.aspx?id=42038
$csomPath="C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell"
Add-Type -Path "$csomPath\Microsoft.SharePoint.Client.dll"
Add-Type -Path "$csomPath\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "$csomPath\Microsoft.Online.SharePoint.Client.Tenant.dll"
PowerShell
# sito a cui collegarsi
$siteURL = "https://sharepoint.sgart.local/sito1"
# utente con cui collegarsi
$username = "utente@sgart-local.onmicrosoft.com"
# leggo la password dalla console
$password = Read-Host "Please enter the password for $($userName)" -AsSecureString
# imposto le credenziali di SharePoint Online
$SPOCredentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userName, $password)
successivamente creo il contesto con le corrette credenziali e leggo il l'oggetto web:
PowerShell
# creo l'oggetto con il contesto client
$context = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$context.credentials = $SPOCredentials
# accede all'oggetto web corrente e lo carico nel contesto
$web = $context.web
$context.Load($web);
Nel modello client CSOM gli oggetti caricati nel contesto non sono accessibili finchè non viene invocato il metodo ExecuteQuery() del contesto ($context).
accedo agli items (GetItems) delle lista (Lists.GetByTitle), se serve con una query CAML specifica (CamlQuery):
PowerShell
$listTitle = "ListaProva" #nome della lista
$list = $web.Lists.GetByTitle($listTitle)
$query = @"
<View>
<ViewFields>
<FieldRef Name="AnnoRiferimento" />
<FieldRef Name="Title" />
<FieldRef Name="Login1" />
<FieldRef Name="Login2" />
</ViewFields>
<Query>
<Where>
<Eq><FieldRef Name='AnnoRiferimento'/><Value Type='Number'>2018</Value></Eq>
</Where>
</Query>
<RowLimit>2000</RowLimit>
</View>
"@;
$query = new-object Microsoft.SharePoint.Client.CamlQuery
$query.ViewXml = $ViewXml
$items = $list.GetItems($query);
$context.Load($items);
inserisco un nuovo item ( Microsoft.SharePoint.Client.ListItemCreationInformation ) con un campo user multiplo ( Microsoft.SharePoint.Client.FieldUserValue[] ):
PowerShell
# array di utenti da aggiungere al campo multi utente
$usersMulti = @("user1@sgart-local.onmicrosoft.com", "user2@sgart-local.onmicrosoft.com", "user3@sgart-local.onmicrosoft.com")
$itemCreateInfo = new-object Microsoft.SharePoint.Client.ListItemCreationInformation
$newItem = $list.AddItem($itemCreateInfo)
# imposto anche altri campi
$newItem["AnnoRiferimento"] = 2018
$newItem["Title"] = "titolo"
# preparo l'oggetto per popolare il campo multi user
$loginReaders = @();
$userMulti | ForEach-Object {
$email = $_
if( [string]::IsNullOrWhiteSpace($email) -eq $false ){
# risolvo l'utente e popolo l'oggetto $r
$r = $web.EnsureUser($email)
$context.Load($r)
$context.ExecuteQuery()
$obj = new-object Microsoft.SharePoint.Client.FieldUserValue
$obj.LookupId = $r.Id
$loginReaders += $obj
}
}
# lo setto facendo il cast
$newItem["Login1"] = [Microsoft.SharePoint.Client.FieldUserValue[]]$loginReaders
# esempio con un campo singolo utente
$loginNominativo = $web.EnsureUser("user4@sgart-local.onmicrosoft.com")
$context.Load($loginNominativo)
$newItem["Login2"] = $loginNominativo
# lo aggiorno
$newItem.Update();
# lo carico nel contesto
$context.Load($newItem)
# eseguo il comando su SharePoint OnLine
$context.ExecuteQuery()
l'utente, prima di essere assegnato al campo, deve esserene verifica l'esistenza tramite il metodo '$web.EnsureUser( email ).
per funzionare è necessario che sulla macchina su cui gira lo script sia installato lo SharePoint Online Client Components SDK