Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
I had to work on a SharePoint Online scenario the other day where the requirement was to dump out a specific list's items to a CSV, which will be consumed by another application. This list also had People fields. Below sample can be utilized for this scenario – and can be tweaked easily to meet other business requirements.
#Sample provided As-Is – Use after sufficient testing.
#replace these details – User name, domain, Password. (Also consider using Get-Credential to enter password securely as script runs)
#Ensure there is a folder called C:\OUTPUT
$username
=
"admin@domain.onmicrosoft.com"
$password
=
"pwd"
$url
=
"https://domain.sharepoint.com"
$securePassword
=
ConvertTo-SecureString
$Password
-AsPlainText
-Force
#install the SharePoint Online client SDK
[system.reflection.assembly]::LoadWithPartialName('Microsoft.SharePoint.Client')
[system.reflection.assembly]::LoadWithPartialName('Microsoft.SharePoint.Client.Runtime')
# connect/authenticate to SharePoint Online and get ClientContext object.
$clientContext
=
New-Object
Microsoft.SharePoint.Client.ClientContext($url)
$credentials
=
New-Object
Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
$clientContext.Credentials = $credentials
if (!$clientContext.ServerObjectIsNull.Value)
{
Write-Host
"Connected to SharePoint Online site: '$Url'"
-ForegroundColor
Green
}
#The list name I have used is CSVTEST1, you will have to change to your list's name.
$web
=
$clientContext.Web
$clientContext.Load($web)
$clientContext.ExecuteQuery()
$list
=
$web.lists.GetByTitle('csvtest1')
$all_Items_caml
=
[microsoft.sharepoint.client.camlquery]::CreateAllItemsQuery()
$allitems =
$list.GetItems($all_Items_caml)
$clientContext.Load($list)
$clientContext.Load($allitems)
$clientContext.ExecuteQuery()
#Defining the data table that holds all the list data in custom fields.
$datatable
= @()
#Iterating through the list items with an AllItems query -> You will have to take care of list throttling scenarios.
#Multi values fields like names and email addresses are saved as semi colon separated strings - within the same custom field.
#These will need unpacking using custom code, where the CSV is being consumed.
#The people field in this list is called XPEOPLE, and this can hold multiple values.
foreach($listitem
in
$allitems)
{
$emails
=
''
foreach($p
in
$listitem['xpeople'])
{
$u
=
$web.GetUserById($p.LookupId)
$clientContext.Load($u)
$clientContext.ExecuteQuery()
$emails=$emails+$u.email+';'
}
$peoplenames
=
''
($listitem['xpeople']
|
select
lookupvalue).lookupValue |
%{$peoplenames=$peoplenames+$_+';'}
#Use the SPList Field names below -> Use InternalNames as seen in SchemaXML
$obj
=
new-object
-TypeName
'PSObject'
-Property @{
Title = $listitem['Title']
Name = $listitem['Name']
Phone = $listitem['Phone_No']
PeopleCount = $listitem['xpeople'].count
PeopleEmailAddresses = $emails
PeopleNames = $peoplenames
}
$datatable
+=
$obj
}
#Dumping out the datatable to CSV.
$datatable
|
Export-Csv
C:\output\test.csv
#Testing the CSV by importing into a variable - OPTIONAL.
$all
=
Import-Csv
C:\output\test.csv
$all[0].PeopleEmailAddresses