Thought I would share this as I struggled to find a complete article online how to do this. First of all, the code below is based on José Quinto’s post USING POWERSHELL TO ADD WEBPART TO SHAREPOINT PAGE VIA CSOM IN OFFICE 365. It’s a really good article on adding a content editor web part to a publishing page.
I couldn’t find any posts online on how to use the same technique to add a list view web part to a page. Eventually I figured out how to create the XML for adding a list view web part.
This is an adaptation of Jose’s function to add a web part to a page:
function AddWebPartToPage ($ctx, $sitesURL, $WebPartXml, $pageRelativeUrl, $wpZoneID, $wpZoneOrder) { try{ Write-Host "Starting the Process to add the User WebPart to the Home Page" -ForegroundColor Yellow #Adding the reference to the client libraries. Here I'm executing this for a SharePoint Server (and I'm referencing it from the SharePoint ISAPI directory, #but we could execute it from wherever we want, only need to copy the dlls and reference the path from here 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" Write-Host "Getting the page with the webpart we are going to modify" -ForegroundColor Green #Using the params, build the page url $pageUrl = $sitesURL + $pageRelativeUrl Write-Host "Getting the page with the webpart we are going to modify: " $pageUrl -ForegroundColor Green #Getting the page using the GetFileByServerRelativeURL and do the Checkout #After that, we need to call the executeQuery to do the actions in the site $page = $ctx.Web.GetFileByServerRelativeUrl($pageUrl); $page.CheckOut() $ctx.ExecuteQuery() try{ #Get the webpart manager from the page, to handle the webparts Write-Host "The page is checkout" -ForegroundColor Green $webpartManager = $page.GetLimitedWebPartManager([Microsoft.Sharepoint.Client.WebParts.PersonalizationScope]::Shared); Write-Host $WebPartXml.OuterXml #Load and execute the query to get the data in the webparts Write-Host "Getting the webparts from the page" -ForegroundColor Green $ctx.Load($webpartManager); $ctx.ExecuteQuery(); #Import the webpart $wp = $webpartManager.ImportWebPart($WebPartXml.OuterXml) #Add the webpart to the page Write-Host "Add the webpart to the Page" -ForegroundColor Green $webPartToAdd = $webpartManager.AddWebPart($wp.WebPart, $wpZoneID, $wpZoneOrder) $ctx.Load($webPartToAdd); $ctx.ExecuteQuery() } catch{ Write-Host "Errors found:`n$_" -ForegroundColor Red } finally{ #CheckIn and Publish the Page Write-Host "Checkin and Publish the Page" -ForegroundColor Green $page.CheckIn("Add the User Profile WebPart", [Microsoft.SharePoint.Client.CheckinType]::MajorCheckIn) $page.Publish("Add the User Profile WebPart") $ctx.ExecuteQuery() Write-Host "The webpart has been added" -ForegroundColor Yellow } } catch{ Write-Host "Errors found:`n$_" -ForegroundColor Red } }
And this is the XML to add a SharePoint document library called “Documents” to the page.
$WebPartXml1 = " <webParts> <webPart xmlns='http://schemas.microsoft.com/WebPart/v3'> <metaData> <type name='Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' /> <importErrorMessage>Cannot import this Web Part.</importErrorMessage> </metaData> <data> <properties> <property name='ListUrl' type='string'>Documents</property> <property name='ListName' type='string'>Documents</property> </properties> </data> </webPart> </webParts>"
The URL for a list is slightly different to a document library, the example below is the XML for an announcement list.
$WebPartXml1 = " <webParts> <webPart xmlns='http://schemas.microsoft.com/WebPart/v3'> <metaData> <type name='Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' /> <importErrorMessage>Cannot import this Web Part.</importErrorMessage> </metaData> <data> <properties> <property name='ListUrl' type='string'>Lists/Student Announcements</property> <property name='ListName' type='string'>Student Announcements</property> <property name='JSLink' type='string'>~sitecollection/Style%20Library/cdb_custom_announcements/cdb_custom_announcements.js</property> </properties> </data> </webPart> </webParts>"
I then get the client context and pass the XML and variables to the function to add it to the page
$tenantAdmin = "user@domain.com" $tenantAdminPassword = "password" $secureAdminPassword = $(convertto-securestring $tenantAdminPassword -asplaintext -force) $siteURL = "https://domain.com/sites/subsite"; $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl) $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($tenantAdmin, $secureAdminPassword) $ctx.Credentials = $credentials $relUrl = "/sites/subsite" $pageRelativeUrl1 = "/Pages/Default.aspx" $wpZoneID1 = "Top Left" $wpZoneOrder1 = 0 #Run function AddWebPartToPage $ctx $relUrl $WebPartXml1 $pageRelativeUrl1 $wpZoneID1 $wpZoneOrder1
Nice example of adding web parts to a SharePoint Online publishing page using PowerShell CSOM.
Doesn’t seem to work for Libraries for me, does for Lists, but Document Libraries a no go — exception adding the web part, perhaps steps needed to address the library view?
Hi Alex,
I’ve just tried this in my tenancy and it still seems to work ok for document libraries. Did you want to post the code and I will have a look?
Thanks,
Tony
Hello Tony,
Thank you for this script as i’ve had a hard time trying to figure out how to do this. I am running in to some problems with it though, i’m not sure if you still monitor this or not but was hoping you can help me out.
I basically took your script and plugged in the variables for my environment, however i’m running in to issues when trying to import the webpart. this is the following error I get.
“ImportWebPart” with “1” argument(s): The webpartxml argument is invalid”
Have you ran into this before? Any help would be great. Thank you
Hi James,
Thank you for your comment. I’ve not used classic pages for a long time! It might be worth taking a look at the PnP PowerShell project to see if there are any easier ways of doing this.
Thanks,
Tony