Lorsque votre site est basé sur un modèle de site publishing avec une arborescence complexe avec de nombreux sous-sites:
- Chaque département possède son sous-site
- Différenciation entre les régions, les pays, … (forme de treeview)
- Différence entre business et fonction
- …
On se retrouve rapidement avec un très grand nombre de sous-sites dans lesquels sont publiées des pages et news.
La seule solution pour afficher celles-ci est d’utiliser le moteur de recherche en travaillant avec les queries adaptées.
Cela devient rapidement problématique pour répondre à des questions basiques de statistiques telles que:
- Quel est le département publiant le plus de pages ?
- Quel est le nombre de pages publiées par mois ?
- Qui est le content manager le plus actif ?
- …
La seule solution alors est de passer par un export de l’ensemble des pages publiées en CSV et de travailler la présentation de ces statistiques avec Excel (ou PowerBI).
Le script suivant vous permet ce travail en adaptant simplement les requêtes et les colonnes à sortir:
[string]$SitePagesURL = "
[DateTime]$PortalPublishingDate = Get-Date
[string]$CSVFileName = "ExportAllNewsItems.csv"[string]$queryText = "ContentTypeId:0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D00DAB155038B062847A409F1E450E9E5E3* Path:https://yourtenant.sharepoint.com/intranet "
[string]$outputline = ""[int]$TempUserID = 0
# ---------------------------------------------------------------------------------------------------------------
function Load-DLLandAssemblies
{
[string]$defaultDLLPath = ""# Load assemblies to PowerShell session
$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.Online.SharePoint.Client.Tenant.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)$defaultDLLPath = "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SharePoint.Client.Search\v4.0_16.0.0.0__71e9bce111e9429c\Microsoft.SharePoint.Client.Search.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)}
function Get-SearchResults([int] $startIndex, $myclientContext)
{
try
{
$keywordQuery = New-Object Microsoft.SharePoint.Client.Search.Query.KeywordQuery($MyctxTemp)
$keywordQuery.StartRow = $startIndex #gets or sets the first row of information from the search results
$keywordQuery.QueryText = $queryText
$keywordQuery.RowLimit = 500
$keywordQuery.RowsPerPage = 500
$keywordQuery.TrimDuplicates=$false
$keywordQuery.Timeout = 10000;
$keywordQuery.SelectProperties.Add("LastModifiedTime")
$keywordQuery.SelectProperties.Add("RefinableDate00") # Date Article
$keywordQuery.SelectProperties.Add("RefinableString00") # Business & Function
$keywordQuery.SelectProperties.Add("RefinableString01") # News Type
$keywordQuery.SelectProperties.Add("RefinableString03") # Publishing Area / Country
$keywordQuery.SelectProperties.Add("CreatedBy")
$keywordQuery.SortList.Add("RefinableDate00","Desc")$searchExecutor = New-Object Microsoft.SharePoint.Client.Search.Query.SearchExecutor($MyctxTemp)
$ClientResult = $searchExecutor.ExecuteQuery($keywordQuery)
$MyctxTemp.ExecuteQuery()
#$MyctxTemp.ExecuteQueryWithIncrementalRetry(5, 30000); #5 retries, with a base delay of 30 secs.
Write-Host " - Item number into the function:", $ClientResult.Value[0].ResultRows.Count
return $ClientResult.Value[0]}
Catch [Exception] {
Write-host " >>>> ERROR MESSAGE:", $_.Exception.Message -f Red
Return $False
}}
# ---------------------------------------------------------------------------------------------------------------
Function Get-All-Intranet-News-Published-ExportCSV($MyctxTemp, $MyspoRootwebTemp)
{
[System.Data.DataTable]$resultDataTable = new-object System.Data.DataTable("SGSWORLDNEWS")
[System.Data.DataColumn]$titleCol = new-object System.Data.DataColumn("Title")
[System.Data.DataColumn]$pathCol = new-object System.Data.DataColumn("Path")
[System.Data.DataColumn]$RefinableDate00Col = new-object System.Data.DataColumn("RefinableDate00")
[System.Data.DataColumn]$RefinableString00Col = new-object System.Data.DataColumn("RefinableString00")
[System.Data.DataColumn]$RefinableString01Col = new-object System.Data.DataColumn("RefinableString01")
[System.Data.DataColumn]$RefinableString03Col = new-object System.Data.DataColumn("RefinableString03")
[System.Data.DataColumn]$CreatedByCol = new-object System.Data.DataColumn("CreatedBy")$resultDataTable.Columns.Add($titleCol)
$resultDataTable.Columns.Add($pathCol)
$resultDataTable.Columns.Add($RefinableDate00Col)
$resultDataTable.Columns.Add($RefinableString00Col)
$resultDataTable.Columns.Add($RefinableString01Col)
$resultDataTable.Columns.Add($RefinableString03Col)
$resultDataTable.Columns.Add($CreatedByCol)
[int]$currentRowIndex = 0
$resultTable = Get-SearchResults $currentRowIndex $MyctxTemp
Write-Host " >> Total Rows Include Duplicated:", $resultTable.TotalRowsIncludingDuplicates -ForegroundColor Red
if(($resultTable -ne $null) -and ($resultTable.TotalRowsIncludingDuplicates -gt 0))
{
while ($resultTable.TotalRowsIncludingDuplicates -gt $resultDataTable.Rows.Count)
{
foreach($resultRow in $resultTable.ResultRows)
{
[System.Data.DataRow]$myrow = $resultDataTable.NewRow()
$myrow["Title"] = $resultRow["Title"]
$myrow["Path"] = $resultRow["Path"]
$myrow["RefinableDate00"] = $resultRow["RefinableDate00"]
$myrow["RefinableString00"] = $resultRow["RefinableString00"]
$myrow["RefinableString01"] = $resultRow["RefinableString01"]
$myrow["RefinableString03"] = $resultRow["RefinableString03"]
$myrow["CreatedBy"] = $resultRow["CreatedBy"]
$resultDataTable.Rows.Add($myrow)
}
$currentRowIndex = $resultDataTable.Rows.Count
$resultTable = $null
$resultTable = Get-SearchResults $currentRowIndex $MyctxTemp
if (($resultTable -ne $null) -and ($resultTable.TotalRowsIncludingDuplicates -gt 0))
{
if ($resultTable.RowCount -le 0)
{
break
}
}
else
{
break
}
}
}
[string] $totalResults = $resultDataTable.Rows.Count;
Write-Host " >>>>> Table Items placed into Datatable: ", $totalResults -ForegroundColor YellowClear-Content $CSVFileName
$outputline = '"NewsTitle";"PublicationDate";"NewsURL";"BusinessFunction";"NewsType";"PublishingAreaCountry";"NewsCreator";'
Add-Content -Encoding UTF8 -Force $CSVFileName $outputlineforeach($result in $resultDataTable.Rows)
{
if($result["RefinableDate00"] -ne "")
{
$TempString = $result["RefinableDate00"].split(';')[0]
$PortalPublishingDate=[datetime]::ParseExact([string]$TempString, 'M/d/yyyy h:mm:ss tt', [CultureInfo]::InvariantCulture) #10/2/2018 10:00:00 PM
Write-Host " ---------------------------------------- "
Write-Host " ------>>> NewsPath:", $result["Path"]
Write-Host " ------>>> Title:", $result["Title"]
Write-Host " ------>>> RefinableDate00:", $result["RefinableDate00"] #$PortalPublishingDate
Write-Host " ------>>> PublicationDate:", $PortalPublishingDate
Write-Host " ------>>> BusinessFunction:", $result["RefinableString00"]
Write-Host " ------>>> NewsType:", $result["RefinableString01"]
Write-Host " ------>>> PublishingAreaCountry:", $result["RefinableString03"]
Write-Host " ------>>> NewsCreator:", $result["CreatedBy"]
Write-Host " ---------------------------------------- "#CSV file location, to store the result
$outputline = '"'+ $result["Title"] +'";"'+ $PortalPublishingDate.ToString("dd.MM.yyyy") +'";"'+ $result["Path"] +'";"'+ $result["RefinableString00"] +'";"'+ $result["RefinableString01"] +'";"'+ $result["RefinableString03"] +'";"'+ $result["CreatedBy"] +'";'
Add-Content -Encoding UTF8 -Force $CSVFileName $outputline
}
}
}# ---------------------------------------------------------------------------------------------------------------
Load-DLLandAssemblies#get and save your O365 credentials
[string]$username = "loginadmin@yourtenant.onmicrosoft.com"
[string]$PwdTXTPath = "C:\SECUREDPWD\ExportedPWD-$($username).txt"
$secureStringPwd = ConvertTo-SecureString -string (Get-Content $PwdTXTPath)
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd#connect to the web site using the stored credentials
Write-host " "
Write-host " -------------------------------------------------------------------------------------------- " -ForegroundColor green
Write-host " ---- CONNECT THE SITE --- " -ForegroundColor green
Write-host " CONNECTED SITE:", $SitePagesURL -ForegroundColor Yellow$Myctx = New-Object Microsoft.SharePoint.Client.ClientContext($SitePagesURL +"/intranet")
$Myctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($cred.UserName,$cred.Password)
$Myctx.RequestTimeout = 1000000 # milliseconds
$MyspoRootweb = $Myctx.Web
$Myctx.Load($MyspoRootweb)
$Myctx.ExecuteQuery()Write-Host " "
Write-Host " ---------------------------------------------------------"
Write-Host " >>>> # Server Version:" $Myctx.ServerVersion " # <<<<<<" -ForegroundColor Green
Write-Host " ---------------------------------------------------------"
Write-Host " "Write-host " -------------------------------------------------------- "
Write-host " -->> RootSite:", $MyspoRootweb.URL -ForegroundColor greenWrite-host " "
Get-All-Intranet-News-Published-ExportCSV $Myctx $MyspoRootweb
Ce script a été utilisé en production avec des milliers de news publiées et permet une présentation plus précise de l’activité des contributeurs au sein de la plateforme.
Fabrice Romelard
Version Anglaise:
Les sources utilisées pour la construction:
- https://blogs.msdn.microsoft.com/vesku/2014/08/26/system-update-for-sharepoint-list-items-using-app-model/
- https://techcommunity.microsoft.com/t5/SharePoint/How-to-change-Modern-page-Author-from-the-quot-Created-By-quot/m-p/220432#M20147
- https://sharepoint.stackexchange.com/questions/129926/extract-emal-from-listitem-user
- https://www.c-sharpcorner.com/article/office-365-sharepoint-online-powershell-script-to-call-search-api-and-get-th/
- https://sharepoint.stackexchange.com/questions/208462/sharepoint-search-js-returns-only-500-search-results
- http://www.thesharepointguide.com/sharepoint-search-how-to-return-all-results/
- https://www.spjeff.com/2015/04/21/datatable-in-powershell-for-crazy-fast-filters/
Commentaires
Enregistrer un commentaire