Here's what it does:
- Compliments you on how good you look today.
- Asks you for a list of information it needs to run.
- Url of the Site that has the list, that has the field/column you want to convert to a term set
- Name of the list that has the field/column that has the values you want to convert to a term set
- Name of your existing term store (The name of the service application)
- Name of existing term group the new term set should get created in
- Name you want the new term set to be called
- Name of the Managed Metadata column the script will create and populate the value of in the list.
- Creates a TaxonomySession, gets a handle on the Termstore and group, and then creates the termset.
- Creates the new TaxonomyField (Managed Metadata Column) on the list
- Iterates through the list items, grabs the value from the field you want to convert to a termset, creates the term, then populates the MM column.
- Outputs errors
static void Main(string[] args)
{
Console.WriteLine("Looking good today, is that a new shirt? Paste in URL of web that hast the customers list we need to use to pupulate the termset please.");
string sUrl = Console.ReadLine();
Console.WriteLine("What is the name of list with the column we are converting to a term set?");
string sListName = Console.ReadLine();
Console.WriteLine("What is the name of the column we are converting?");
string sOriginalFieldName = Console.ReadLine();
Console.WriteLine("What is the name of your termstore? (name of MM service app)");
string sTermStore = Console.ReadLine();
Console.WriteLine("Which existing term group do you want the term set in? (i'll ask for termset name next)");
string sGroupName = Console.ReadLine();
Console.WriteLine("What do you want the term set to be called?");
string sSetName = Console.ReadLine();
Console.WriteLine("What do you want the new taxonomy column named in the source list?");
string sColumnName = Console.ReadLine();
Console.WriteLine();
//Cache errors to show later
List errors = new List();
//Get the site object for the TaxonomySession constructor
using (SPSite oSPsite = new SPSite(sUrl))
{
TaxonomySession ts = new TaxonomySession(oSPsite);
//Get the termstore and group
TermStore termStore = ts.TermStores[sTermStore];
Group group = termStore.Groups[sGroupName];
//Create the termset and a test term to be sure we're good permissions wise...
TermSet termSet = group.CreateTermSet(sSetName);
Term termToDelete = termSet.CreateTerm("temp1", 1033);
termStore.CommitAll();
Console.WriteLine("OK term set is created, adding column to list now.");
//Now get a handle on the list and add the taxonomy field
using (SPWeb web = oSPsite.OpenWeb())
{
web.AllowUnsafeUpdates = true;
SPList list = web.Lists[sListName];
bool fieldExists = list.Fields.ContainsField(sColumnName);
if (!fieldExists)
{
TaxonomyField field = list.Fields.CreateNewField("TaxonomyFieldType", sColumnName) as TaxonomyField;
field.SspId = termSet.TermStore.Id;
field.TermSetId = termSet.Id;
field.TargetTemplate = string.Empty;
field.AllowMultipleValues = false; //if you switch this to true, you'd have to change to TaxonomyFieldValueCollection
field.CreateValuesInEditForm = true;
field.Open = true;
field.AnchorId = Guid.Empty;
list.Fields.Add(field);
list.Update();
web.Update();
//get a new handle on the list since the schema changed.
list = web.Lists[sListName];
}
//now get a handle on it from the list context for edit later
TaxonomyField taxonomyField = list.Fields[sColumnName] as TaxonomyField;
foreach (SPListItem item in list.Items)
{
//get the field value from the list, then create the term with the name
string sCustomer = item[sOriginalFieldName].ToString();
Console.WriteLine("Creating term for {0}.", sCustomer);
//surrond with try/catch incase you have duplicates (the code will let you know at the end)
try
{
Term termCustomer = termSet.CreateTerm(sCustomer, 1033);
termStore.CommitAll();
//now that ther term exists in the term store, set the value of the new taxonomy field in the listitem
TaxonomyFieldValue taxonomyFieldValue = new TaxonomyFieldValue(taxonomyField);
taxonomyFieldValue.TermGuid = termCustomer.Id.ToString();
taxonomyFieldValue.Label = termCustomer.Name;
item[sColumnName] = taxonomyFieldValue;
item.SystemUpdate();
list.Update();
}
catch (TermStoreOperationException ex)
{
errors.Add("Error with " + sCustomer + " - Msg:" + ex.Message);
}
catch (Exception x)
{
errors.Add("Error with " + sCustomer + " - err:" + x.Message);
}
}
web.Update();
web.AllowUnsafeUpdates = false;
}//dispose web
}//dispose site
Console.WriteLine("Done. Hit Enter to see list of errors we ran into.");
Console.ReadLine();
foreach (string er in errors)
{
Console.WriteLine(er);
}
Console.WriteLine("that's it, hit enter to end program.");
Console.ReadLine();
}