SharePoint Online: Export List Version History to Excel using PowerShell

Requirement: Export all versions of SharePoint Online List Items to CSV (Excel) file.

sharepoint online export list version history to excel using powershell

PowerShell to Extract and Export List Item’s Version History to CSV File:

This article assumes you have an existing SharePoint Online list with columns given below. You may have to create and change columns according to your requirement.

#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

Function Export-VersionHistory()
{
  param
    (
        [Parameter(Mandatory=$true)] [string] $SiteURL,
        [Parameter(Mandatory=$true)] [string] $ListName,
        [Parameter(Mandatory=$true)] [string] $CSVFile
    )
    Try {

        #Delete the Output report file if exists
        if (Test-Path $CSVFile) { Remove-Item $CSVFile }

        #Get Credentials to connect
        $Cred= Get-Credential
        $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = $Credentials
        
        #Get the List
        $List = $Ctx.Web.Lists.GetByTitle($ListName)
        $Ctx.Load($List)
        $Ctx.ExecuteQuery()
        
        #Get all items
        $Query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery()
        $ListItems = $List.GetItems($Query)
        $Ctx.Load($ListItems)
        $Ctx.ExecuteQuery()

        #Array to hold result
        $VersionHistoryData = @()

        #Iterate throgh each item
        Foreach ($Item in $ListItems)
        {
            write-host "Processing Item:" $item.id -f Yellow
            
            #Get all versions of the list item
            $Versions = $Item.versions
            $ctx.Load($Versions)
            $Ctx.ExecuteQuery()

            If($Versions.count -gt 0)
            {
                #Iterate each version
                Foreach($Version in $Versions)
                {
                    #Get the Creator object of the version
                    $CreatedBy =  $Version.createdby
                    $Ctx.Load($CreatedBy)
                    $Ctx.ExecuteQuery()

                    #Send Data to object array
                    $VersionHistoryData += New-Object PSObject -Property @{
                    'Item ID' = $Item.ID
                    'Title' =  $Version.FieldValues["Title"]
                    'Version Label' = $Version.VersionLabel 
                    'Version ID' = ($Version.VersionId/512)
                    'Created On' = (Get-Date ($Version.Created) -Format "yyyy-MM-dd/HH:mm:ss")
                    'Created By' = $CreatedBy.Email
                    }
                }
            }
        }
        
        #Export the data to CSV
        $VersionHistoryData | Export-Csv $CSVFile -Append -NoTypeInformation

        write-host -f Green "Version History Exported Successfully to:" $CSVFile
     }
    Catch {
        write-host -f Red "Error Exporting version History to CSV!" $_.Exception.Message
    }
}

#Set parameter values
$SiteURL="https://crescent.sharepoint.com"
$ListName="Projects"
$CSVFile="C:\Temp\VersionHistory.csv"

#Call the function to generate version History Report
Export-VersionHistory -SiteURL $SiteURL -ListName $ListName -CSVFile $CSVFile
Important: This script works ONLY on CSOM version 16.1.6906.1200 or Later! Download the latest version of CSOM SDK from https://www.microsoft.com/en-us/download/confirmation.aspx?id=42038

This script produces a CSV file with version data such as:

  • Version Label,
  • Version ID
  • When the version was created
  • Who created the version
  • Title field value of the version (You can add any additional field too!)

For SharePoint On-Premises, use this script: How to Export SharePoint Version History to CSV using PowerShell?

PnP PowerShell to Extract Version History of All Items in a List

Let’s export all previous versions of items from a list to a CSV file using PnP PowerShell.

#Set Variables
$SiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$ListName = "Announcements"
$CSVPath = "C:\Temp\VersionHistoryRpt.csv"
 
#Connect to SharePoint Online site
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)

#Get All Fields from List
$ListFields = Get-PnPField -List $ListName | Where {!$_.Hidden}
$VersionHistoryData = @()

#Get All List Items - Exclude Folders
Get-PnPListItem -List $ListName -PageSize 500 | Where {$_.FileSystemObjectType -ne "Folder"} | ForEach-Object {
    Write-host "Getting Versioning Data of Item:"$_.ID
    $Versions = Get-PnPProperty -ClientObject $_ -Property Versions
    ForEach($Version in $Versions)
    {
        $VersionHistory =  New-Object PSObject
        $VersionHistory | Add-Member -MemberType NoteProperty -Name "Version ID" -Value ($Version.VersionId/512)
        $VersionHistory | Add-Member -MemberType NoteProperty -Name "Version Label" -Value $Version.VersionLabel
        $VersionHistory | Add-Member -MemberType NoteProperty -Name "Created On" -Value (Get-Date ($Version.Created) -Format "yyyy-MM-dd/HH:mm:ss")

        #Get Value of all other Fields
        $ListFields | ForEach-Object {
            #Get the value of Person or Lookup fields
            $FieldType = $_.GetType().Name
            If (($FieldType -eq "FieldLookup") -or ($FieldType -eq "FieldUser"))
            {
                $FieldValue = $Version[$_.InternalName].LookupValue
            }
            Else
            {
                $FieldValue = $Version[$_.InternalName]
            }
            #Append Version data
            $VersionHistory | Add-Member -MemberType NoteProperty -Name $_.InternalName -Value $FieldValue
        }
        $VersionHistoryData+=$VersionHistory
    }
}
$VersionHistoryData | Export-Csv $CSVPath -NoTypeInformation

Salaudeen Rajack

Information Technology Professional with Two decades of SharePoint Experience.

20 thoughts on “SharePoint Online: Export List Version History to Excel using PowerShell

  • July 27, 2021 at 3:58 AM

    for the Sharepoint Management version, is there a way to pull all fields on the version history? I have multiple status’s and priorities that I need to measure changes to. Thanks!

    Reply
  • September 21, 2020 at 4:40 AM

    Hi Salaudeen. A fantastic script here. Just wondering, what would need to be added to include a particulars columns data from each version into the output csv?

    Reply
    • September 21, 2020 at 12:53 PM

      $Version[“FieldInternalName”] will get you the particular column’s value for the version!

      Reply
  • April 17, 2020 at 4:16 PM

    Hi there! am getting error: Add-Type : Cannot bind parameter ‘Path’ to the target. Exception setting “Path”: “Cannot find path… Any ideas on why? Thanks

    Reply
  • June 11, 2019 at 9:21 PM

    How can I limit the list by a date range? I am getting this error:
    Error Exporting version History to CSV! Exception calling “ExecuteQuery” with “0” argument(s): “The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator.”

    Reply
  • May 13, 2019 at 11:55 AM

    Script is working fine, but how to fetch last updated comments on list item ? is there any way ?

    Reply
  • November 27, 2018 at 2:47 PM

    Hi Salundeen,
    Mi name is Guille (from Spain).
    thank you for sharing your code and wisdom with all of us.

    I have a problem executing your code. Before I start, tell you what I’ve done or I am doing:
    – I have installed the latest version of the SDK (64 bits)
    – My SharePoint site is $SiteURL=”https://mycompany.sharepoint.com/sites/CursesSPO”.
    In this collection I created a list of tasks called MyTasks (whose URL is : https://mycompany.sharepoint.com/sites/CursesSPO/Lists/MyTasks
    ). Then my variable $ListName=”MyTasks”
    – I am using PowerShell ISE (as administrator). I copied your code into a .ps1 file and run it from PowerShell ISE itself.

    Well, when I execute an error appears (it is located in the first ExecuteQuery) that says:
    Error Exporting version History to CSV! Exception when calling “ExecuteQuery” with the arguments “0”: “The ‘MyTasks’ list does not exist on the site with the URL address ‘ht
    tps://mycompany.sharepoint.com/sites/CursesSPO’.”

    I can’t see why this is happening.
    Can you help me?

    Reply
  • September 19, 2018 at 9:47 AM

    Thanks, your article helped me to solve my user request!

    Reply
  • April 29, 2018 at 2:38 PM

    Thank you, You are good among men!

    Reply
  • March 21, 2018 at 10:39 PM

    Do you think this script work for SharePoint 2010/13/2016 on-premise?

    Reply
  • March 21, 2018 at 11:41 AM

    Hi Salundeen,

    thanks for this great site. I’m in my first steps with PowerShell and have a question. What do I have to change in the script, so it can run on SharePoint 2010?

    Thanks

    Reply
  • February 13, 2018 at 6:48 PM

    Thanks Salaudeen for the detailed PS script. When I run the Powershell, I am getting ,Cannot find an overload for “Load” and the argument count: “1”‘

    Reply
    • February 13, 2018 at 7:34 PM

      Make sure you have the latest client SDK installed in your machine as per the link given in the post. Also, try running this in PowerShell ISE.

      Reply
    • February 13, 2018 at 8:19 PM

      Yes, I have installed the latest client SDK (32 Bit). I wanted this PS to run as a scheduled task and I am not sure how I can achieve that. My environment is O365.

      Reply
  • January 18, 2018 at 9:50 AM

    Hi,

    Thanks for this code a life saver. However, there is an error in your code. The $SiteURL = “…” is wrong you have a html hyperlink ref in there when in your case it should be $SiteURL = “https://crescent.sharepoint.com”.

    This caught me out for a few hours lol

    Reply
    • January 18, 2018 at 12:11 PM

      Hi There, $SiteURL=”https://crescent.sharepoint.com” is what I’ve posted. Let me know if this is not what you are getting!

      Reply

Leave a Reply