Skip to main content

SharePoint Online - Export Term Store data

We had a requirement to export Terms from a particular Term Store Group in our SPO tenant but I couldn't find a script that goes in to Level 2 and Level 3 Terms or if there is one out there I couldn't find it.

I checked many forums and blogs and thanks to all those contributors who inspired me to come up with this script. This isn't perfect by any means and I would like to improve and clean this up a bit but I'm sharing this here so its documented where I can fix this later and also probably help someone.

The script will export the data in hierarchical form in a .csv file.

 

# Tenant url

$url="<enter your SharePoint admin url>"

# Term Group names as an array

$groups = @("") 

# location of CSV file

$FilePath="Terms.csv" 

# Variable to collect all data and export to CSV

$results = New-Object System.Collections.ArrayList

# Function to iterate through Term store

function Get-TermsAsCSV

{      

    try  

    {  

        if($groups.Length -eq 0){

            $groups = @(Get-PnPTermGroup | ForEach-Object{ $_.Name })

        }

        # Loop through the term groups

        foreach ($termGroup in $groups) {

            try {

                $termGroupName = $termGroup


                # Exporting terms from Term Group

                $termGroupObj = Get-PnPTermGroup -Identity $termGroupName -Includes TermSets, Description                   

                 foreach ($termSet in $termGroupObj.TermSets) {                    

                    # variable to store Term Store within the Term Group

                    $termSetObj = Get-PnPTermSet -Identity $termSet.Id -TermGroup $termGroupName -Includes Terms, Description, IsAvailableForTagging

                     $Data = @{

                    'Term group' = $termGroupName                    

                    'Term set Name'   = $termSetObj.Name   

                    'Term Set Description' = $termSetObj.Description 

                    'Available For Tagging' = $termSetObj.IsAvailableForTagging           

                    'Term 1'     = ''

                    'Term 2'     = ''

                    'Term 3'     = '' }                      

                    $results.add( (New-Object psobject -Property $Data) )                          

                    # Iterate through Terms within Term Store

                    foreach ($terms in $termSetObj.terms) {                                   

                    Write-Host "Term: " $terms.Name

                    $children = Get-PnPTerm -TermSet $termSetObj.Name -TermGroup $termGroupName -Identity $terms.Name -IncludeChildTerms -Includes IsAvailableForTagging, Description #-Recursive

                    $Data = @{

                    'Term group' = ''                    

                    'Term set Name'   = $termSetObj.Name

                    'Term Set Description' = $terms.Description

                    'Available For Tagging' = $terms.IsAvailableForTagging

                    'Term 1'     = $terms.Name

                    'Term 2'     = ''

                    'Term 3'     = '' } 

                    $results.add( (New-Object psobject -Property $Data) )

                     # Iterate through if child Terms exist and adding them to Array

                    if($children.Terms.Count -gt 0)

                    {

                    foreach($child in $children.Terms)

                    {                        

                    $Data = @{

                    'Term group' = ''                    

                    'Term set Name'   = $termSetObj.Name

                    'Term Set Description' = ''

                    'Available For Tagging' = $termSetObj.IsAvailableForTagging

                    'Term 1'     = $terms.Name

                    'Term 2'     = $child.Name

                    'Term 3'     = '' } 

                    $results.add( (New-Object psobject -Property $Data) )

                    # This validation prevents error if there aren't any child terms for a particular Term

                    if($child.Terms.Count -gt 0)

                       {

                       # Iterate through next level child Terms and adding them to Array

                        foreach($c in $child.Terms){                   

                        $Data = @{

                        'Term group' = ''                        

                        'Term set Name'   = $termSetObj.Name

                        'Term Set Description' = ''

                        'Available For Tagging' = $termSetObj.IsAvailableForTagging

                        'Term 1'     = $terms.Name

                        'Term 2'     = $child.Name

                        'Term 3'     = $c.Name }


                        $results.add( (New-Object psobject -Property $Data) )}

                       }                    

                    }

                    }

                  }

                }

            }

            catch {Write-Host "Error1: $($_.Exception.Message)" -ForegroundColor Red}            

        }

     }  

     catch [Exception]  

     {  

        $ErrorMessage = $_.Exception.Message         

        Write-Host "Error2: $ErrorMessage" -ForegroundColor Red          

     }  

}  

# Connect to SharePoint Online site

Connect-PnPOnline -Url $Url -Interactive


## Call the Function  

Get-TermsAsCSV


$results | Select-Object  'Term group','Term set Name', 'Term Set Description','Available For Tagging','Term 1', 'Term 2','Term 3' | Export-Csv -Path $FilePath -NoTypeInformation -Encoding UTF8

# Disconnect the session

Disconnect-PnPOnline  


Comments

Popular posts from this blog

Difference between the architectures of SSPs and SharePoint Service Application

SharePoint 2010 has some new features and components, which help to overcome difficulties such as redundancy and service-sharing that we faced while using SharePoint 2007.  Services in MOSS 2007 were implemented with the help of Shared Service Providers or SSPs. But we cannot use the services of one SSP for another SSP. So each SSP has to have its own set of services and applications, which increases redundant data in the farm.  For example, different managers in the same organization use a SharePoint site to maintain official data associated with an SSP. This SSP is associated with different services, such as Search service, BDC service, and a user profile service. A project manager in this organization requests an exclusive user profile service to maintain project data security. To provide this, we first need to create a separate SSP for the project manager and then a separate service called user profile service - project name. Next, we need to associate the SSP with ...

Users do not show up in SharePoint People Search or People Picker

I had this issue with people picker in a classic mode web application in SharePoint 2013 and this site is in 2010 mode - users in certain sub-domains would not show up in People Picker. I was aware of stsadm commands to fix this and we ran the stsadm command to hook up people picker with another domain some time back. The latest issue was that people picker was not returning users from the root domain and few sub domains. After researching on the internet I found (contrary to my thoughts) that we could use PowerShell and not just stsadm to map People Picker to domains. It is a good idea to first check what domains are added/mapped to the web application using the following commands: $wa = Get-SPWebApplication -Identity http://mywebapp.com #List the Domains $wa.PeoplePickerSettings.SearchActiveDirectoryDomains This will list the domains currently People Picker is looking up for that web application. I used the following script to map our AD forest to People Picker: ...

"Cannot impersonate user for data source" - SSRS reports

We were getting this strange error while viewing our reports in SharePoint that was deployed using BIDS 2005: An error has occurred during report processing. Cannot impersonate user for data source 'datasource' Logon failed I tried many things but nothing worked. I did some research and found many blog posts which suggested me to reapply the password on the datasource file specified in the error message and save it again. That didn't work for me. I saw some check boxes in the data source file that read "Use as Windows Credentials" and "Set Execution Context to this report" and I didn't know what they meant. I unchecked those in my data source and then when the refreshed the page the report started displaying.