Búsqueda de sitios web

SharePoint Online: Archivar elementos de listas grandes en otra lista mediante PowerShell


Requisito: Archive una lista grande moviendo elementos antiguos a una lista nueva para mejorar el rendimiento.

¿Cómo archivar elementos de la lista en SharePoint Online?

Cuando se trata de administrar sus listas de SharePoint Online, es posible que de vez en cuando necesite archivar elementos antiguos o no utilizados. ¿Cómo archivamos listas antiguas en SharePoint Online sin eliminarlas? Afortunadamente, este proceso se puede realizar fácilmente utilizando las funciones integradas de SharePoint. Resulta que PowerShell también puede archivar una lista en SharePoint Online. Esta guía le guiará por los pasos necesarios para archivar elementos de la lista en SharePoint Online. Aquí están los pasos:

  1. Cree una nueva lista para el archivo desde la lista de fuentes
  2. Mover elementos de la lista de origen a la lista de archivo

Para crear la lista de archivo, guarde la lista existente como una plantilla sin contenido y cree una nueva lista para archivar. También puede clonar la estructura de la lista yendo a la función Contenido del sitio >> Nuevo >> Lista >> De lista existente” en SharePoint Online.

Para mover elementos de la lista desde la lista de origen con la interfaz del navegador web, use la página "Contenido y estructura del sitio" para mover elementos de la lista en SharePoint Online. Puede acceder a él con la URL: https://tenant.sharepoint.com/_layouts/15/sitemanager.aspx, por ejemplo, https://crescent.sharepoint.com/sites/marketing/_layouts/15/sitemanager .aspx

PowerShell para archivar elementos de la lista en SharePoint Online:

Archivar elementos de lista en SharePoint Online es un proceso útil para ayudar a mantener su sitio organizado y mejorar el rendimiento. Al mover elementos más antiguos o usados con menos frecuencia a una ubicación de archivo, puede ayudar a optimizar su sitio y reducir el desorden. Veamos cómo archivar elementos de la lista en SharePoint Online usando PowerShell.

Suponiendo que tiene lista la lista de archivos, este script mueve todos los elementos de la lista creados hace más de 90 días en una lista de SharePoint Online a otra lista.


#Function to copy attachments between list items
Function Copy-SPOAttachments($SourceItem, $TargetItem)
{
    Try {
        #Get All Attachments from Source
        $Attachments = Get-PnPProperty -ClientObject $SourceItem -Property "AttachmentFiles"
        $Attachments | ForEach-Object {
        #Download the Attachment to Temp
        $File  = Get-PnPFile -Url $_.ServerRelativeUrl -FileName $_.FileName -Path $env:TEMP -AsFile -force

        #Add Attachment to Target List Item
        $FileStream = New-Object IO.FileStream(($env:TEMP+"\"+$_.FileName),[System.IO.FileMode]::Open)  
        $AttachmentInfo = New-Object -TypeName Microsoft.SharePoint.Client.AttachmentCreationInformation
        $AttachmentInfo.FileName = $_.FileName
        $AttachmentInfo.ContentStream = $FileStream
        $AttachFile = $TargetItem.AttachmentFiles.add($AttachmentInfo)
        $Context.ExecuteQuery()    
    
        #Delete the Temporary File
        Remove-Item -Path $env:TEMP\$($_.FileName) -Force
        }
    }
    Catch {
        write-host -f Red "Error Copying Attachments:" $_.Exception.Message
    }
}

#Function to Archive items from one list to another
Function Archive-SPOListItems()
{
    param
    (
        [Parameter(Mandatory=$true)] [string] $SourceListName,
        [Parameter(Mandatory=$true)] [string] $TargetListName
    )
    Try {
        #Get All Items from the Source List in batches 
        Write-Progress -Activity "Reading Source..." -Status "Getting Items from Source List. Please wait..."
        $SourceListItems = Get-PnPListItem -List $SourceListName -PageSize 500
         Write-host "Total Number of Items Found:"$SourceListItems.count

        #Filter List Items from the source - More than 90 days old!
        $TimeStamp = (Get-Date).AddDays(-90)
        $FilteredSourceListItems  = $SourceListItems | Where {$_["Created"] -Lt $TimeStamp}
        Write-Progress -Activity "Filtering List:" -Status "Filtering Items from Source List, Please wait..."
        $FilteredSourceListItemsCount= $FilteredSourceListItems.count
        Write-host "Total Number of Items After Filter:"$FilteredSourceListItemsCount

        #Get fields to Update from the Source List - Skip Read only, hidden fields, content type and attachments
        $SourceListFields = Get-PnPField -List $SourceListName | Where { (-Not ($_.ReadOnlyField)) -and (-Not ($_.Hidden)) -and ($_.InternalName -ne  "ContentType") -and ($_.InternalName -ne  "Attachments") }
    
        #Loop through each item in the source and Get column values, add them to target
        [int]$Counter = 1
        ForEach($SourceItem in $FilteredSourceListItems)
        {  
            $ItemValue = @{}
            #Map each field from source list to target list
            Foreach($SourceField in $SourceListFields)
            {
                #Check if the Field value is not Null
                If($SourceItem[$SourceField.InternalName] -ne $Null)
                {
                    #Handle Special Fields
                    $FieldType  = $SourceField.TypeAsString

                    If($FieldType -eq "User" -or $FieldType -eq "UserMulti" -or $FieldType -eq "Lookup" -or $FieldType -eq "LookupMulti") #People Picker or Lookup Field
                    {
                        $LookupIDs = $SourceItem[$SourceField.InternalName] | ForEach-Object { $_.LookupID.ToString()}
                        $ItemValue.add($SourceField.InternalName,$LookupIDs)
                    }
                    ElseIf($FieldType -eq "URL") #Hyperlink
                    {
                        $URL = $SourceItem[$SourceField.InternalName].URL
                        $Description  = $SourceItem[$SourceField.InternalName].Description
                        $ItemValue.add($SourceField.InternalName,"$URL, $Description")
                    }
                    ElseIf($FieldType -eq "TaxonomyFieldType" -or $FieldType -eq "TaxonomyFieldTypeMulti") #MMS
                    {
                        $TermGUIDs = $SourceItem[$SourceField.InternalName] | ForEach-Object { $_.TermGuid.ToString()}                    
                        $ItemValue.add($SourceField.InternalName,$TermGUIDs)
                    }
                    Else
                    {
                        #Get Source Field Value and add to Hashtable
                        $ItemValue.add($SourceField.InternalName,$SourceItem[$SourceField.InternalName])
                    }
                }
            }

            #Copy Created by, Modified by, Created, Modified Metadata values
            $ItemValue.add("Created", $SourceItem["Created"])
            $ItemValue.add("Modified", $SourceItem["Modified"])
            $ItemValue.add("Author", $SourceItem["Author"].Email)
            $ItemValue.add("Editor", $SourceItem["Editor"].Email)

            Write-Progress -Activity "Copying List Items:" -Status "Copying Item ID '$($SourceItem.Id)' from Source List ($($Counter) of $($FilteredSourceListItemsCount))" -PercentComplete (($Counter / $FilteredSourceListItemsCount) * 100)
        
            #Copy column value from source to target
            $NewItem = Add-PnPListItem -List $TargetListName -Values $ItemValue

            #Copy Attachments
            Copy-SPOAttachments -SourceItem $SourceItem -TargetItem $NewItem

            #Delete the Item in the Source List
            Remove-PnPListItem -List $SourceListName -Identity ($SourceItem.Id) -Recycle -Force

            Write-Host "Archived Item '$($SourceItem.Id)' from Source to Target List ($($Counter) of $($FilteredSourceListItemsCount))"
            $Counter++
        }
    }
    Catch {
        Write-host -f Red "Error:" $_.Exception.Message 
    }
}

#Connect to PnP Online
Connect-PnPOnline -Url "https://crescent.sharepoint.com/sites/Projects/" -Interactive
$Context = Get-PnPContext

#Call the Function to Copy List Items between Lists
Archive-SPOListItems -SourceListName "Projects" -TargetListName "ProjectsArchive"

Puede ejecutar el script bajo demanda o como parte de una tarea programada.

En resumen, archivar elementos de lista en SharePoint Online usando PowerShell es una forma rápida y eficiente de mantener su sitio organizado. Al utilizar el script proporcionado en este tutorial, puede automatizar el proceso de mover elementos más antiguos o usados con menos frecuencia a una ubicación de archivo, mejorando el rendimiento del sitio y reduciendo el desorden.

Artículos relacionados