SharePoint Online + webparts, encabezados y campos de taxonomía.

En este tutorial, aprenderemos a automatizar la creación de una página en SharePoint Online. Este proceso incluirá la adición de campos de taxonomía, webparts y un encabezado personalizado. Para lograr esto, utilizaremos un script de PowerShell y el módulo PnP PowerShell.

Configurar variables

A continuación, definiremos algunas variables que serán necesarias para establecer una conexión con SharePoint y para definir la ruta de nuestra imagen de encabezado.

  • TenantId: ID del directorio (tenant).
  • AppId: ID de la aplicación (cliente).
  • ClientSecret: Secreto del cliente.
$TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$AppId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$ClientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

Conexión a SharePoint

Utilizamos Connect-PnPOnline para conectarnos a nuestro sitio de SharePoint Online. Para este ejemplo, estamos utilizando una identidad administrada para la autenticación.

Connect-PnPOnline -Url $siteurl -ManagedIdentity

Definir más variables

Especificamos la ubicación de la imagen de encabezado y la URL de origen de donde copiaremos esta imagen.

$pageRelativeImage="SiteAssets/ZerogapBanner.jpg"
$source_url_header="/sites/ZerogapSite/SiteAssets/Zerogap/ZerogapBanner.jpg"

Verificar si la página ya existe

Antes de crear la página, comprobamos si ya existe utilizando Get-PnPPage.

$full_url_path=$siteurl + "/sitepages/" + $page_name + ".aspx"

$FileExists=$null
$FileExists = Get-PnPPage -identity $page_name -ErrorAction SilentlyContinue

Creación de la página y adición de componentes

Si la página no existe, procedemos a:

  1. Agregar un campo de taxonomía a la lista «SitePages».
  2. Crear la nueva página.
  3. Añadir un webpart a la página.
  4. Copiar la imagen de encabezado al directorio de destino y establecerla como encabezado de la página.
  5. Deshabilitar los comentarios de la página.
  6. Establecer al propietario del contenido.
If($FileExists)
{
    Write-output "Nothing to do for this site:"
    write-output  $siteurl
}

Si la página no existe, continuamos con el resto de nuestro proceso:

Else {
    Add-PnPTaxonomyField -List "SitePages" -DisplayName "Archive" -InternalName "Tracking" -TaxonomyItemId 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    Add-PnPPage  -Name  $page_name
    $page_file=$page_name + ".aspx"

    Add-PnPPageWebPart -Page $page_file -Component "Zerogap Tracking"

    $PageHeaderImage = $relative_site + "/" + $pageRelativeImage
    $target_url=$relative_site + "/SiteAssets"
    $target_url=$target_url.replace('//','/')
    $DocumentLibrary = $null
    $DocumentLibrary = Get-PnPList -Identity "SiteAssets"

    if ($DocumentLibrary -eq $null) {
        $Web = Get-PnPWeb
        $Zerogap = $Web.Lists.EnsureSiteAssetsLibrary()
        $Zerogap = Invoke-PnPQuery
    }

    Copy-PnPFile -SourceUrl $source_url_header -TargetUrl $target_url -Force

    Set-PnPPage -Identity $page_file -CommentsEnabled:$false

    $page=Get-PnPClientSidePage -Identity $page_file
    $page.SetCustomPageHeader($PageHeaderImage)
    $page.Save()
    $Page.Publish()

    Set-PnPPage -Identity $page_file -Publish

    $values=@{"Editor"="admin@Zerogap.com"; "Author"="admin@Zerogap.com"}

    $id = Get-PnPPage -Identity $page_name | Select -ExpandProperty PageId
    $Zerogap = Set-PnPListItem -List "Site Pages" -Identity $id -Values
    $values -UpdateType UpdateOverwriteVersion
    Set-PnPPage -Identity $page_file -Publish
}

Desconectar la sesión

Finalmente, una vez que hemos terminado de realizar nuestras operaciones, nos desconectamos del sitio de SharePoint.

Disconnect-PnPOnline

Código completo

A continuación, se muestra el código completo del script, el cual se puede usar para automatizar la creación de una página en SharePoint Online con todos los elementos antes mencionados.

Param
(
  [Parameter (Mandatory = $true)]  
  [string] $siteurl,
  [Parameter (Mandatory = $true)]
  [string] $page_name,
  [Parameter (Mandatory = $true)]
  [string] $relative_site
)

$TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$AppId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$ClientSecret = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

Connect-PnPOnline -Url $siteurl -ManagedIdentity

$pageRelativeImage="SiteAssets/ZerogapBanner.jpg"
$source_url_header="/sites/ZerogapSite/SiteAssets/Zerogap/ZerogapBanner.jpg"

$full_url_path=$siteurl + "/sitepages/" + $page_name + ".aspx"

$FileExists=$null
$FileExists = Get-PnPPage -identity $page_name -ErrorAction SilentlyContinue

If($FileExists)
{
    Write-output "Nothing to do for this site:"
    write-output  $siteurl
}
Else {
    Add-PnPTaxonomyField -List "SitePages" -DisplayName "Archive" -InternalName "Tracking" -TaxonomyItemId 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    Add-PnPPage  -Name  $page_name
    $page_file=$page_name + ".aspx"

    Add-PnPPageWebPart -Page $page_file -Component "Zerogap Tracking"

    $PageHeaderImage = $relative_site + "/" + $pageRelativeImage
    $target_url=$relative_site + "/SiteAssets"
    $target_url=$target_url.replace('//','/')
    $DocumentLibrary = $null
    $DocumentLibrary = Get-PnPList -Identity "SiteAssets"

    if ($DocumentLibrary -eq $null) {
        $Web = Get-PnPWeb
        $Zerogap = $Web.Lists.EnsureSiteAssetsLibrary()
        $Zerogap = Invoke-PnPQuery
    }

    Copy-PnPFile -SourceUrl $source_url_header -TargetUrl $target_url -Force

    Set-PnPPage -Identity $page_file -CommentsEnabled:$false

    $page=Get-PnPClientSidePage -Identity $page_file
    $page.SetCustomPageHeader($PageHeaderImage)
    $page.Save()
    $Page.Publish()

    Set-PnPPage -Identity $page_file -Publish

    $values=@{"Editor"="admin@Zerogap.com"; "Author"="admin@Zerogap.com"}

    $id = Get-PnPPage -Identity $page_name | Select -ExpandProperty PageId
    $Zerogap = Set-PnPListItem -List "Site Pages" -Identity $id -Values $values -UpdateType UpdateOverwriteVersion

    Set-PnPPage -Identity $page_file -Publish
}

Disconnect-PnPOnline

Este script debe ser ejecutado por un usuario con permisos adecuados en SharePoint y con el módulo PnP PowerShell ya instalado. Recuerda reemplazar los valores de las variables TenantId, AppId, ClientSecret, y la identificación del campo de taxonomía con la información correspondiente a tu entorno de SharePoint Online.

Maximiliano Díaz Doglia

AI Platform Engineer & Full-Stack Developer
Building Enterprise Integrations & Automations