Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server

Archives

SharePoint: Extraire les pages publiées dans un site de publishing en CSV

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 = "https://yourtenant.sharepoint.com"
[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 Yellow

    Clear-Content $CSVFileName
     $outputline = '"NewsTitle";"PublicationDate";"NewsURL";"BusinessFunction";"NewsType";"PublishingAreaCountry";"NewsCreator";'
    Add-Content -Encoding UTF8 -Force $CSVFileName $outputline  

    foreach($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 green

Write-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:

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 6 novembre 2018 11:04 par ROMELARD Fabrice

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Retrouvez-moi aux Microsoft experiences18 ! par Blog de Jérémy Jeanson le 11-06-2018, 22:25

- Office 365: Script PowerShell pour extraire les Teams associés à un utilisateur spécifié par Blog Technique de Romelard Fabrice le 11-06-2018, 13:37

- SharePoint: Extraire les pages publiées dans un site de publishing en CSV par Blog Technique de Romelard Fabrice le 11-06-2018, 11:04

- Office 365: Comment créer un jeu de Pages Modernes dans un Modern Site SharePoint Online en utilisant PowerShell depuis un fichier CSV par Blog Technique de Romelard Fabrice le 10-17-2018, 12:50

- Office 365: Comment Utiliser les Modern Pages dans un Site Intranet SharePoint basé sur le Publishing site par Blog Technique de Romelard Fabrice le 10-16-2018, 15:34

- Office 365: Comment changer le nom “Auteur” dans les pages modernes d'un Modern Site SharePoint Online par Blog Technique de Romelard Fabrice le 10-16-2018, 15:07

- Reprise des articles Codes-Sources de 2011 à 2013 par Blog de Jérémy Jeanson le 08-21-2018, 16:08

- Office 365: Modifier les jeux de couleur dans les Thèmes des pages classiques de SharePoint Online par Blog Technique de Romelard Fabrice le 08-08-2018, 17:27

- Office 365: Modifier les jeux de couleur dans les Thèmes des pages modernes de SharePoint Online par Blog Technique de Romelard Fabrice le 07-04-2018, 13:26

- Office 365: Script PowerShell pour fixer le Quota Warning de toutes les collections d’un tenant par Blog Technique de Romelard Fabrice le 07-03-2018, 14:16