Migrate SharePoint List to Another Site Without Losing Data or Formatting
Migrating a SharePoint list to another site isn’t supported directly by SharePoint, but there are several effective solutions which will help. Today, I’ll explain how to migrate SharePoint list to another site using the most appropriate ways step by step.
Let’s understand:
Why I Had to Move SharePoint List to Another Site
As a SharePoint admin, I’ve worked on multiple SharePoint Online tenant to tenant migration projects. I’ve found, there are different reasons why I’ve needed to move SharePoint lists across sites:
- Reorganising sites after a departmental restructure
- Archiving old project data to a dedicated archive site
- Moving from a classic site to a modern communication site
- Consolidating multiple lists into a central repository
Regardless of the reasons to copy SharePoint list to another site, our priority is to complete the migration with zero data loss. That’s why, first, take a look at the prerequisites to ensure a smooth transition.
Prerequisites to Migrate SharePoint List to Another Site
Every transition needs clear planning to get the expected results. So, follow the pre-migration steps:
- Make sure you have permissions for both sites, including creating one. For the same, you can use a PowerShell script to get SharePoint site permissions.
- Verify you have full control access on both source and target sites
- Check if the list uses custom columns or lookup fields
- Confirm the destination site is active and accessible to move SharePoint list to another site smoothly
- Find duplicate or irrelevant files and remove them to minimise migration time.
- Enable the list template feature if using classic experience
- Identify if attachments or version history need to be preserved
- Backup SharePoint Online to local storage
- Test the process on a sample list to avoid data loss
How to Copy SharePoint List to Another Site – Top 5 Methods
Microsoft 365 doesn’t offer any native tool to migrate SharePoint list to another site. But, don’t worry, I researched and found the five best solutions for this transition:
#1. Template Method to Move SharePoint List to Another Site
This is one of the simplest native methods, and can be used by any skill level of user by following these steps:
- Open the SharePoint account, then move to the List settings.
- Under Permissions and Management, click Save list as template
- Check Include Content if needed
- Save the .stp file
- Open the destination site, and click on the Site Settings > List templates
- Upload the .stp file
- Create a new list using this template
This is quite easy but only for content migration, as it is unable to move web parts, permissions, and metadata.
#2. Export & Import List in Excel
This is most easiest and quickest solution to migrate SharePoint list to another site, so maybe you already know about this. Users can export the list into an Excel file format and then upload it to the destination site.
Here are the detailed steps to move SharePoint list to another site:
- Open Source SharePoint Site > My Lists and open the SharePoint list to copy.
- Click on Export > Export to Excel and save it locally.
- Afterwards, open the destination Site. Click on New > List.
- Now upload the data from the downloaded Excel file.
- Finally, Save the changes.
#3. Use Power Automate to Copy SharePoint List to Another Site
Microsoft Power Automate offers the option to move one SharePoint list item to another site.
- Set up a trigger on the Source SharePoint list. Select the “When an existing item is modified” option.
- Search for the item in the destination list to get its ID and update it.
- Apply the condition to determine whether the item exists or not.
#4. Migrate SharePoint List to Another Site Via Cutting-edge Solution
Honestly speaking, the native methods like Power Automate, export/import and templates work for basic cases. Additionally, they can become time-consuming or risky when dealing with large lists and attachments.
To overcome this situation, I highly recommend to Download SharePoint Migration Tool.
Although many software programs are available online, I suggest this one due to these reasons:
- It supports migrating lists, libraries, attachments, metadata, and permissions
- Handles bulk migrations across different sites or even tenants
- Preserves version history and user mapping
- No need for manual scripting or advanced technical skills
- Easy-to-use UI that reduces the chances of error
If you still find any type of problem related to this solution, you can contact 24/7 technical support for quick assistance.
Follow the Steps to Move SharePoint List to Another Site
After taking its full version, open it and follow the steps to migrate SharePoint list to another site:
- Step 1. Choose Microsoft 365 as the Source & Destination.
- Step 2. Mark the list option, and add a Date filter if required.
- Step 3. Enter the admin credentials of both Source & Destination accounts, and validate them.
- Step 4. Add Users and then load Sites into the tool via the Fetch option.
- Step 5. Finally, hit the Start Migration button.
#5. Copy SharePoint List to Another Site Using PowerShell
PowerShell is quite a complex method, and it is recommended only for technical users. Naive users can opt for any options mentioned above. So, let’s start by running these commands as mentioned in official Microsoft PowerShell guide to migrate SharePoint list to another site:
Install-Module -Name PnP.PowerShell Connect-PnPOnline -Url https://[entertenantname].sharepoint.com/sites/[source site] -Interactive Get-PnPSiteTemplate -Out C:\Temp\Lists.xml -ListsToExtract “List Y”, “List Z” -Handlers Lists Add-PnPDataRowsToSiteTemplate -Path C:\Temp\Lists.xml -List “List Y” Add-PnPDataRowsToSiteTemplate -Path C:\Temp\Lists.xml -List “List Z” Connect-PnPOnline -Url https://[entertenantname].sharepoint.com/sites/[destination SharePoint site] -Interactive Invoke-PnPSiteTemplate -Path “C:\Temp\Lists.xml” If the SharePoint list contains some attachments, then execute the below PowerShell script. Function Copy-SPListAttachments() { param ( [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.ListItem] $SourceItem, [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.ListItem] $DestinationItem ) Try { $AllListAttachments = Get-PnPProperty -ClientObject $SourceItem -Property “AttachmentFiles” $AllListAttachments | ForEach-Object { $File = Get-PnPFile -Connection $SourceCont -Url $_.ServerRelativeUrl -FileName $_.FileName -Path $Env:TEMP -AsFile -force $FileStream = New-Object IO.FileStream(($Env:TEMP+”\”+$_.FileName),[System.IO.FileMode]::Open) $Attachment_Details = New-Object -TypeName Microsoft.SharePoint.Client.AttachmentCreationInformation $Attachment_Details.FileName = $_.FileName $Attachment_Details.ContentStream = $FileStream $AttachedFile = $DestinationItem.AttachmentFiles.Add($Attachment_Details) Invoke-PnPQuery -Connection $DestinationConn Remove-Item -Path $Env:TEMP\$($_.FileName) -Force }} Catch { write-host -f Red “Error Copying Attachments:” $_.Exception.Message } } Function Copy-SPAllListItems() { param ( [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.List] $SourceList, [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.List] $DestinationList ) Try { Write-Progress -Activity “Reading Source…” -Status “Getting Items from Source List. Please wait…” $SourceSharePointListItems = Get-PnPListItem -List $SourceList -PageSize 500 -Connection $SourceCont SourceSharePointListItemsCount= SourceSharePointListItems.count Write-host “Total Number of List Items Found are:”SourceSharePointListItemsCount $SourceListFields = Get-PnPField -List $SourceList -Connection $SourceCont | Where { (-Not ($_.ReadOnlyField)) -and (-Not ($_.Hidden)) -and ($_.InternalName -ne “ContentType”) -and ($_.InternalName -ne “Attachments”) } [int]$Count = 1 ForEach($SourceItem in $SourceSharePointListItems) { $ItemsValue = @{} Foreach($SourceField in $SourceListFields) { If($SourceItem[$SourceField.InternalName] -ne $Null) { $FieldsType = $SourceField.TypeAsString If($FieldsType -eq “User” -or $FieldsType -eq “UserMulti”) { $PeoplePickerValues = $SourceItem[$SourceField.InternalName] | ForEach-Object { $_.Email} $ItemsValue.add($SourceField.InternalName,$PeoplePickerValues) } ElseIf($FieldsType -eq “Lookup” -or $FieldsType -eq “LookupMulti”) # Lookup Field { $LookupIDs = $SourceItem[$SourceField.InternalName] | ForEach-Object { $_.LookupID.ToString()} $ItemsValue.add($SourceField.InternalName,$LookupIDs) } ElseIf($FieldsType -eq “URL”) #Hyperlink { $URL = $SourceItem[$SourceField.InternalName].URL $Description = $SourceItem[$SourceField.InternalName].Description $ItemsValue.add($SourceField.InternalName,”$URL, $Description”) } ElseIf($FieldsType -eq “TaxonomyFieldsType” -or $FieldsType -eq “TaxonomyFieldsTypeMulti”) { $TermGUIDs = $SourceItem[$SourceField.InternalName] | ForEach-Object { $_.TermGuid.ToString()} $ItemsValue.add($SourceField.InternalName,$TermGUIDs) } Else { $ItemsValue.add($SourceField.InternalName,$SourceItem[$SourceField.InternalName]) }}} #Copy Created by, Modified by, Created, Modified Metadata values $ItemsValue.add(“Created”, $SourceItem[“Created”]); $ItemsValue.add(“Modified”, $SourceItem[“Modified”]); $ItemsValue.add(“Author”, $SourceItem[“Author”].Email); $ItemsValue.add(“Editor”, $SourceItem[“Editor”].Email); Write-Progress -Activity “ List Items starts copying:” -Status “Copying Item ID ‘$($SourceItem.Id)’ from Source List ($($Count) of $($SrcListItemsCount))” -PercentComplete (($Count / $SrcListItemsCount) * 100) $NewItem = Add-PnPListItem -List $DestinationList -Values $ItemsValue Copy-SPListAttachments -SourceItem $SourceItem -DestinationItem $NewItem Write-Host “Copied Item ID from Source to Destination List:$($SourceItem.Id) ($($Count) of $($SrcListItemsCount))” $Count++ } } Catch { Write-host -f Red “Error:” $_.Exception.Message } } $Source_SiteURL = “https://[tenantnamehere].sharepoint.com/sites/[sitenamehere]” $Source_ListName = “[enter list name here]” $Destination_SiteURL = “https://[tenantnamehere].sharepoint.com/sites/[sitenamehere]” $Destination_ListName = “[enter list name here]” $SourceCont = Connect-PnPOnline -Url $Source_SiteURL -Interactive -ReturnConnection $SourceList = Get-PnPList -Identity $Source_ListName -Connection $SourceCont $DestinationConn = Connect-PnPOnline -Url $Destination_SiteURL -Interactive -ReturnConnection $DestinationList = Get-PnPList -Identity $Destination_ListName -Connection $DestinationConn Copy-SPAllListItems -SourceList $SourceList -DestinationList $DestinationList
As we see, these commands are lengthy, but copying and pasting cmdlets doesn’t take much time, just change the variables.
Author’s Verdict
Above all, the solutions are reliable to migrate SharePoint list to another site; you can opt for any. I use all of them according to the situation and migration complexity.
Mainly, I use a specified professional utility to copy document library to another SharePoint site, as I can’t take data loss risk with manual methods. So, my first preference is that, but you can use any of them, according to your requirements, to move SharePoint list to another site.
People Also Ask
Q. Will permissions transfer automatically?
No, native methods don’t migrate permissions. Use PowerShell or a migration tool to replicate them.Q. Is there a way to preserve version history during migration?
Only some PowerShell scripts or tools, like SysTools Migrator, can preserve version history.Q. Can I migrate SharePoint list to another site with attachments?
Yes, but not all methods support this. Power Automate requires extra steps; automated tools handle attachments natively.Q. Can I migrate a list from one tenant to another?
Yes, but you’ll need tools or scripts that support cross-tenant authentication.Q. When not to move SharePoint list to another site manually?
There are scenarios in which manual migration can pose issues:
- You lose metadata
- It’s error-prone and not scalable
- You can’t preserve version history or permissions