Map Term Set To Site Column On SharePoint Using CSOM PowerShell

Introduction 

In this article, you will learn how to map a SharePoint taxonomy term set to a site column using CSOM with PowerShell on SharePoint 2013/SharePoint online sites.
 
The basic idea of the article is to show how we can automate the mapping process of the term set to the site columns.
 
Steps Involved

The following prerequisites need to be executed before going for any operations using CSOM PowerShell on SharePoint sites. 

  1. Add the references, using the Add-Type command with the necessary reference paths. The necessary references are Microsoft.SharePoint.Client.dll, Microsoft.SharePoint.Client.Runtime.dll and Taxonomy dll, as shown below:
    1. Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"  
    2. Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"  
    3. Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Taxonomy.dll"  
  2. Initialize the client context object with the site URL, as shown below:
    1. $siteURL = ""  
    2. $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)  
  3. If you are trying to access the SharePoint online site, you need to set up the site credentials with the credentials parameter and load it to the client context.
    1. #Not required for on premise site - Start    
    2. $userId = "[email protected]"    
    3. $pwd = Read-Host -Prompt "Enter password" -AsSecureString    
    4. $creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userId, $pwd)    
    5. $ctx.credentials = $creds    
    6. #Not required for on premise site - End    
  4. If you are trying to access SharePoint on the premise site, the credentials parameter is not required to be set to the context but you need to run the code on the respective SharePoint Server or you need to pass the network credentials and set the context.
    1. #Credentials for on premise site - Start    
    2. $pwd = Read-Host -Prompt "Enter password" -AsSecureString    
    3. $creds = New-Object System.Net.NetworkCredential("domain\userid", $pwd)    
    4. $ctx.Credentials = $creds    
    5. #Credentials for on premise site - End    

Before executing the steps given below, the site column’s term setting will look like the image, shown below:

Now, we will see, how we can retrieve the term sets from the term store and assign it to the site column 

Retrieve Term Sets

The logic given below, retrieves the term set called "Test" from the taxonomy term store. 

  1. Get taxonomy session object by loading and executing the context.
    1. $taxStore = [Microsoft.SharePoint.Client.Taxonomy.TaxonomySession]::GetTaxonomySession($ctx)  
    2. $ctx.Load($taxStore)  
    3. $ctx.ExecuteQuery()  
  2. Get the term store by using the term store name and the term store collection object.
    1. # Retrieve Term Stores & Groups  
    2. $termStores = $taxStore.TermStores.GetByName("Managed Metadata Service")  
    3. $ctx.Load($termStores)  
    4. $ctx.ExecuteQuery()  
    5. $termStore = $termStores[0]  
    6. $Groups = $termStore.Groups  
    7. $ctx.Load($termStore)  
    8. $ctx.Load($Groups)  
    9. $ctx.ExecuteQuery()  
  3. Get the appropriate group where the term sets are available by using a group name and group collection object. From the selected group, select the term set from the term set collection and term set name.
    1. # Retrieve Term Set & Update Site Column with TermSet  
    2. $Group = $Groups.GetByName("Testing")  
    3. $termSet = $Group.TermSets.GetByName("Test")  
    4. $ctx.Load($termSet)  
    5. $ctx.ExecuteQuery()  

We got the term set. Now we will see how we can map it to site column called "Test". 

 
Mapping Term Set to Site Column 
  1. From the context, get the root Web object. Afterwards, get the fields. From the field collection, get the respective field with the field name.
    1. $web = $ctx.Site.RootWeb  
    2. $field = $web.Fields.GetByTitle("Test")  
  2. We need to cast the field object to taxonomy field by invoking the generic methods. For this, we will use MakeGenericMethod along with GetMethod. Here, we will use Taxonomy field object for casting the field object.
    1. $field = [Microsoft.SharePoint.Client.ClientContext].GetMethod("CastTo").MakeGenericMethod([Microsoft.SharePoint.Client.Taxonomy.TaxonomyField]).Invoke($ctx, $field)  
  3. Afterwards, we can assign the term set and store ID of the term set identified from the section, given above to the field by following the code snippet, given below:
    1. $field.SspId = $termStore.Id   
    2. $field.TermSetId = $termSet.Id   
  4. Update the field, load the objects and execute the query to complete processing.
    1. $field.Update()  
    2. $ctx.Load($web)  
    3. $ctx.Load($field)  
    4. $ctx.ExecuteQuery()  

 Here, we have mapped the term set to corresponding site column. The image, given below, shows the term set mapping to the site column.

The above set of the operations will help in mapping the term set of taxonomy to manage metadata site column. This will not affect the columns already created at the list level using the site column mentioned above. For updating the list level metadata columns with the same changes, we need to explicitly use an update operation, where it will push the changes from the site level to the list levels. Instead of giving $field.update() in the code, given above, we need to give $field.UpdateAndPushChanges($true). This will make changes available for list columns, already created.

Summary
 
Thus, you have learned how to map the term set from the managed metadata term store to metadata site columns.