O365 - Delete Labels on Managed Metadata Terms from a CSV file using CSOM in PowerShell
The fifth post in a series of blog posts that walk through the process of performing configuration tasks against the Managed Metadata Term Store in O365 using CSOM in PowerShell. These posts will explain how to use a CSV file to provide the input values for the scripts however the logic within the scripts can be used to perform the same tasks without using a CSV file with minimal effort.
The example PowerShell script below can be used to take input values from a CSV file and then connect to terms within a term set, retrieve all of the labels for each term in the term set, check to see if any of the labels match the labels that are marked for deletion for each term in the CSV file and if they are, delete the labels from the terms within a target Term Set in SharePoint Online. I have attached a sample CSV file to this blog post.
It requires five variables to be updated - $User which is the tenant admin, $TenantURL which is the URL for the SharePoint Admin Center, $Site which is a valid URL of any SharePoint Site Collection that exists within the tenant, $GroupName which is the name of the Term Group you wish to connect to and $TermSetName which is the name of the Term Set that contains the terms on which you wish to perform label deletions.
$User = "<Tenant Admin>"
$TenantURL = "<URL of SharePoint Admin Center>"
$Site = "<URL of Site Collection that exists in the tenant>"
$GroupName = "<Term Group Name that contains the target Term Set>"
$TermSetName = "<Target Term Set Name>"
#Add references to SharePoint client assemblies and authenticate to Office 365 site - required for CSOM
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"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Taxonomy.dll"
$Password = Read-Host -Prompt "Please enter your password" -AsSecureString
try
{
#Bind to the Managed Metadata Service within the target instance of SPO
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($Site)
$Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($User,$Password)
$Context.Credentials = $Creds
$MMS = [Microsoft.SharePoint.Client.Taxonomy.TaxonomySession]::GetTaxonomySession($Context)
$Context.Load($MMS)
$Context.ExecuteQuery()
#Retrieve all of the Term Stores from the Managed Metadata Service
$TermStores = $MMS.TermStores
$Context.Load($TermStores)
$Context.ExecuteQuery()
#Bind to the Term Store you want to perform configurations against
$TermStore = $TermStores[0]
$Context.Load($TermStore)
$Context.ExecuteQuery()
#Bind to the Term Group you want to perform configurations against
$Group = $TermStore.Groups.GetByName($GroupName)
$Context.Load($Group)
$Context.ExecuteQuery()
#Bind to Term Set you want to perform configurations against
$TermSet = $Group.TermSets.GetByName($TermSetName)
$Context.Load($TermSet)
$Context.ExecuteQuery()
#Specify path to CSV input file that contains;
#The names of the Terms within the Term Set you wish to delete labels from,
#The values for the "Other Lablels" property of each Term in the Term Set that you wish to delete
$path = "<Specify path to CSV file>"
#Import and load the CSV input file into the PowerShell Session
$csv = import-csv -path $path
#Process entries in the CSV
foreach($line in $csv){
#Bind to Terms within the Term Set by using the values supplied in the "TermNames" column of the CSV file
$Terms = $TermSet.Terms.GetByName($line.TermNames)
$Context.Load($Terms)
$Context.ExecuteQuery()
#Retrieve all labels from each of the target terms that were identified in the previous step
$allTermLabels = $Terms.GetAllLabels(1033)
$context.Load($allTermLabels)
$context.ExecuteQuery()
Foreach ($TermLabel in $AllTermLabels)
{
#Check to see if any of the "Other Label" values that were returned for each Term match one of the Term Label values you want to delete.
#The Term Label values you want to delete for each Term are specified in the "TermLabel1","TermLabel2" or "TermLabel3" columns of the CSV file.
#If one of the existing "Other Label" values of a Term does match one of the labels you wish to delete then delete the label from the Term.
If ($TermLabel.value -eq $Line.TermLabel1 -or $TermLabel.value -eq $line.TermLabel2 -or $TermLabel.value -eq $line.TermLabel3)
{
Write-Host "Match Found:" $TermLabel.value -ForegroundColor Green
Write-Host "Deleting:" $TermLabel.value -ForegroundColor Green
$TermLabel
$TermLabel.DeleteObject()
$Context.ExecuteQuery()
}
}
}
}
catch
{
write-host "Caught an exception:" -ForegroundColor Red
write-host "Exception Type: $($_.Exception.GetType().FullName)" -ForegroundColor Red
write-host "Exception Message: $($_.Exception.Message)" -ForegroundColor Red
}
finally
{
write-host ""
write-host "Terms labels have been successfully deleted from the Term Set!" -ForegroundColor Green
}