<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PowerShell on Uwe Braig</title><link>https://blog.uwe-braig.de/tags/powershell/</link><description>Recent content in PowerShell on Uwe Braig</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.uwe-braig.de/tags/powershell/index.xml" rel="self" type="application/rss+xml"/><item><title>SfMetadataToolkit: Bulk manage Picklist Values, Labels and Translations in Salesforce with Excel</title><link>https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><guid>https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/</guid><description>&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-setup-picklist-value-sets.png" alt="" width="1504" height="407" loading="lazy"&gt;
 &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2 id="the-configuration-challenge"&gt;The Configuration Challenge
&lt;/h2&gt;&lt;p&gt;Creating, updating and translating picklist values in Salesforce can be a time-consuming exercise. In this article, I will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review how this is done manually via the Salesforce Setup UI.&lt;/li&gt;
&lt;li&gt;Briefly examine the metadata XML file that can be extracted and deployed via the Salesforce Command Line Interface (CLI).&lt;/li&gt;
&lt;li&gt;Demonstrate how an Excel-based data dictionary can be used as input for the SfMetadataToolkit to generate deployment-ready metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="via-the-salesforce-setup-ui"&gt;Via The Salesforce Setup UI
&lt;/h3&gt;&lt;p&gt;This requires multiple steps in the Setup UI. A typical sequence to add and translate values looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the Global Value Set / Picklist Value Set:
&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;New&lt;/code&gt; to add new picklist values. This is the only step in the sequence where a bulk-operation is possible by copying and pasting multiple values in one go.&lt;/li&gt;
&lt;li&gt;If you want the Master Label to differ from the API value, then go through all values one by one and click &lt;code&gt;Edit&lt;/code&gt; to update Label and/or API Name.&lt;/li&gt;
&lt;li&gt;If you want to reorder the values to a specific sequence, click &lt;code&gt;Reorder&lt;/code&gt; to move individual values up and down, one click at a time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If you then want to translate the labels, you have to go to a different setup screen: Navigate to the Translation Workbench:
&lt;ul&gt;
&lt;li&gt;Select the first language.&lt;/li&gt;
&lt;li&gt;Navigate to Setup Component &amp;lsquo;Global Value Set&amp;rsquo;.&lt;/li&gt;
&lt;li&gt;Select the value set and wait to see the current translations.&lt;/li&gt;
&lt;li&gt;Click through all translations to add/update.&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If you need this for another language, repeat the Translation Workbench process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obviously, this is not an efficient approach for more than some one-off changes.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-manual-setup-global-value-set.png" alt="" width="625" height="535" loading="lazy"&gt;
 &lt;figcaption&gt;An example for a picklist value set as shown in the Salesforce Setup UI&lt;/figcaption&gt;
&lt;/figure&gt;&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-manual-setup-picklist-edit.png" alt="" width="564" height="287" loading="lazy"&gt;
 &lt;figcaption&gt;An example for a picklist edit operation in the Salesforce Setup UI&lt;/figcaption&gt;
&lt;/figure&gt;&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-manual-setup-translate.png" alt="" width="799" height="277" loading="lazy"&gt;
 &lt;figcaption&gt;An example for a picklist translation in the translation workbench&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h3 id="via-the-salesforce-command-line-interface-cli"&gt;Via the Salesforce Command Line Interface (CLI)
&lt;/h3&gt;&lt;p&gt;With the Salesforce Command Line Interface (CLI, also known as SFDX), you get direct access to the raw XML version of the metadata, in this case a Picklist Value Set, in your local file system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieve the files via &lt;code&gt;sf project retrieve&lt;/code&gt; command(s), e.g. as given below.&lt;/li&gt;
&lt;li&gt;Edit the XML file(s) as needed.&lt;/li&gt;
&lt;li&gt;(Re-)Deploy with the corresponding counterpart &lt;code&gt;sf project deploy start ...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sf project retrieve start -m GlobalValueSet:MyPicklistValueSet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sf project retrieve start -m GlobalValueSetTranslation:MyPicklistValueSet-en
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sf project retrieve start -m GlobalValueSetTranslation:MyPicklistValueSet-de
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-cli-retrieved-source.png" alt="" width="1217" height="135" loading="lazy"&gt;
 &lt;figcaption&gt;Example output for the preceding retrieve command&lt;/figcaption&gt;
&lt;/figure&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;GlobalValueSet&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://soap.sforce.com/2006/04/metadata&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;fullName&amp;gt;&lt;/span&gt;A&lt;span class="nt"&gt;&amp;lt;/fullName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;default&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/default&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;A - Master Label&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;/customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;fullName&amp;gt;&lt;/span&gt;B&lt;span class="nt"&gt;&amp;lt;/fullName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;default&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/default&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;B - Master Label&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;/customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;fullName&amp;gt;&lt;/span&gt;C&lt;span class="nt"&gt;&amp;lt;/fullName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;default&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/default&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;C - Master Label&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;/customValue&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;masterLabel&amp;gt;&lt;/span&gt;My Picklist Value Set&lt;span class="nt"&gt;&amp;lt;/masterLabel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nt"&gt;&amp;lt;sorted&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/sorted&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/GlobalValueSet&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;GlobalValueSetTranslation&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://soap.sforce.com/2006/04/metadata&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;masterLabel&amp;gt;&lt;/span&gt;A - Master Label&lt;span class="nt"&gt;&amp;lt;/masterLabel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;translation&amp;gt;&lt;/span&gt;A - German Translation&lt;span class="nt"&gt;&amp;lt;/translation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;masterLabel&amp;gt;&lt;/span&gt;B - Master Label&lt;span class="nt"&gt;&amp;lt;/masterLabel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;translation&amp;gt;&lt;/span&gt;B - German Translation&lt;span class="nt"&gt;&amp;lt;/translation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;masterLabel&amp;gt;&lt;/span&gt;C - Master Label&lt;span class="nt"&gt;&amp;lt;/masterLabel&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;translation&amp;gt;&lt;/span&gt;C - German Translation&lt;span class="nt"&gt;&amp;lt;/translation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/valueTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/GlobalValueSetTranslation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Obviously, this isn&amp;rsquo;t an efficient approach either because you now have to deal with XML syntax and its associated pitfalls.&lt;/p&gt;
&lt;h2 id="introducing-sfmetadatatoolkit"&gt;Introducing SfMetadataToolkit
&lt;/h2&gt;&lt;p&gt;This approach at a glance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fill your picklist values, labels and translations into an Excel (or a corresponding .csv) template.&lt;/li&gt;
&lt;li&gt;Run the toolkit&amp;rsquo;s importer and builder commands to create the corresponding metadata XML files&lt;/li&gt;
&lt;li&gt;Optionally, run the diff tool of your choice (e.g. git diff) to see changes.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Salesforce CLI&lt;/code&gt; to deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full benefit is realized if you use the spreadsheet as a Data Dictionary holding the source of truth: The Data Dictionary is the documentation that is always up to date because the metadata is automatically derived from it.&lt;/p&gt;
&lt;h3 id="build-metadata-from-the-excel-based-template"&gt;Build Metadata From The Excel-based Template
&lt;/h3&gt;&lt;p&gt;Fill in the worksheet &lt;code&gt;_GlobalValueSets&lt;/code&gt; to declare the Global Picklist Value Sets to be created:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-xls-template-global-value-sets.png" alt="" width="864" height="151" loading="lazy"&gt;
 &lt;figcaption&gt;Worksheet ‘_GlobalValueSets’ of the Excel template&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Fill in the worksheet &lt;code&gt;_PicklistValues&lt;/code&gt; and for each Picklist Value Set, define the order, values, labels and translations as needed:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-xls-template-picklist-values.png" alt="" width="1135" height="215" loading="lazy"&gt;
 &lt;figcaption&gt;Worksheet ‘_PicklistValues’ of the Excel template&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Run the following toolkit commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PowerShell" data-lang="PowerShell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$Metadata&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Import-SfMetadataModel&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;EXAMPLE-DataDictionary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;xlsx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Build-SfGlobalValueSetMetadata&lt;/span&gt; &lt;span class="nv"&gt;$Metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Build-SfGlobalValueSetTranslationMetadata&lt;/span&gt; &lt;span class="nv"&gt;$Metadata&lt;/span&gt; &lt;span class="n"&gt;-LanguageCodes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="build-metadata-from-the-csv-template"&gt;Build Metadata From The CSV Template
&lt;/h3&gt;&lt;p&gt;The toolkit also accepts CSV files as long as those are structured the same way. So, if you prefer sources other than Excel, here is the way to go.&lt;/p&gt;
&lt;p&gt;Prepare the file &lt;code&gt;_GlobalValueSets.csv&lt;/code&gt;:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-csv-template-global-value-sets.png" alt="" width="1360" height="98" loading="lazy"&gt;
 &lt;figcaption&gt;Example file _GlobalValueSets.csv&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Prepare the file &lt;code&gt;_PicklistValues.csv&lt;/code&gt;:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-csv-template-picklist-values.png" alt="" width="1502" height="149" loading="lazy"&gt;
 &lt;figcaption&gt;Example file _PicklistValues.csv&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Put all relevant CSV files together into one directory and run the following toolkit commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PowerShell" data-lang="PowerShell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$Metadata&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Import-SfMetadataModel&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="nb"&gt;csv-example&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Build-SfGlobalValueSetMetadata&lt;/span&gt; &lt;span class="nv"&gt;$Metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Build-SfGlobalValueSetTranslationMetadata&lt;/span&gt; &lt;span class="nv"&gt;$Metadata&lt;/span&gt; &lt;span class="n"&gt;-LanguageCodes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;de&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="examine-and-diff-the-result-files-as-needed"&gt;Examine and Diff the Result Files as Needed
&lt;/h3&gt;&lt;p&gt;The resulting files in the force-app folder look like this:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-force-app-folder.png" alt="" width="398" height="265" loading="lazy"&gt;
 &lt;figcaption&gt;Resulting force-app folder as shown in Visual Studio Code&lt;/figcaption&gt;
&lt;/figure&gt;&lt;p&gt;Deploy&amp;hellip;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sf project deploy start -m GlobalValueSet GlobalValueSetTranslation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;hellip;and enjoy:&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-deployed-value-sets.png" alt="" width="637" height="261" loading="lazy"&gt;
 &lt;figcaption&gt;The deployed picklist value sets as per Salesforce Setup UI&lt;/figcaption&gt;
&lt;/figure&gt;&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-deployed-value-set.png" alt="" width="493" height="474" loading="lazy"&gt;
 &lt;figcaption&gt;A single example deployed picklist value set as per Salesforce Setup UI&lt;/figcaption&gt;
&lt;/figure&gt;&lt;figure&gt;
 &lt;img src="https://blog.uwe-braig.de/sf-metadata-toolkit-bulk-manage-global-value-sets/screenshot-deployed-translations.png" alt="" width="599" height="686" loading="lazy"&gt;
 &lt;figcaption&gt;Deployed picklist label translations as per Translation Workbench in Salesforce Setup UI&lt;/figcaption&gt;
&lt;/figure&gt;&lt;h2 id="how-it-works"&gt;How It Works
&lt;/h2&gt;&lt;p&gt;The SfMetadataToolkit operates on top of the Salesforce project structure managed by &lt;a class="link" href="https://developer.salesforce.com/tools/salesforcecli" target="_blank" rel="noopener"
 &gt;Salesforce CLI&lt;/a&gt;. It does not communicate directly with your Salesforce org nor does it issue any sf cli commands on its own. Instead, it only reads from and writes to the &lt;code&gt;*.*-meta.xml&lt;/code&gt; files in the &lt;code&gt;force-app&lt;/code&gt; folder. So it can be combined with any DevOps/deployment workflow, IDE and diff tool (git or non-git-based) of your choice.&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;Note&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;If you don&amp;rsquo;t yet have a full developer setup: The minimum requirement is the CLI itself. You don&amp;rsquo;t have to set up VS Code (Notepad++ with XML plugin will do), you don&amp;rsquo;t need git (any file diff tool of your choice will do, e.g. Notepad++) and you don&amp;rsquo;t need to configure a Dev Hub.&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;p&gt;You can use it for any one-off mass-creation of picklist values. The full strength of this approach, however, becomes apparent when you let the data dictionary be the source of truth for your implementation. With the metadata created from the documentation, the documentation and the implementation will always be in sync.&lt;/p&gt;
&lt;p&gt;With certain limitations, it will also support a round-trip approach where the data dictionary Excel can be reverse-engineered from the org&amp;rsquo;s metadata.&lt;/p&gt;
&lt;h2 id="how-to-get-it"&gt;How To Get It
&lt;/h2&gt;&lt;p&gt;The module is based on PowerShell 7.x, which is open source and available on Windows, macOS, and Linux:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell" target="_blank" rel="noopener"
 &gt;Install PowerShell on Windows, Linux, and macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/PowerShell/PowerShell" target="_blank" rel="noopener"
 &gt;PowerShell&lt;/a&gt; on GitHub&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/powershell/scripting/overview" target="_blank" rel="noopener"
 &gt;What is PowerShell?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The SfMetadataToolkit is published on &lt;a class="link" href="https://codeberg.org/" target="_blank" rel="noopener"
 &gt;Codeberg&lt;/a&gt; and on the &lt;a class="link" href="https://www.powershellgallery.com/" target="_blank" rel="noopener"
 &gt;PowerShell Gallery&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.powershellgallery.com/packages/SfMetadataToolkit" target="_blank" rel="noopener"
 &gt;SfMetadataToolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To install: &lt;code&gt;Install-Module -Name SfMetadataToolkit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://codeberg.org/uwe-braig/sf-metadata-toolkit" target="_blank" rel="noopener"
 &gt;Codeberg Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell directly supports importing from and exporting to CSV files. To work with .xlsx files, the ImportExcel module needs to be installed from the PowerShell Gallery:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.powershellgallery.com/packages/ImportExcel/7.8.4" target="_blank" rel="noopener"
 &gt;ImportExcel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To install: &lt;code&gt;Install-Module -Name ImportExcel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dfinke/ImportExcel" target="_blank" rel="noopener"
 &gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;p&gt;This Data-Dictionary-driven approach has been battle-tested in various projects over the past years. The PowerShell code is currently being refactored and cleaned from some technical debt in order to be published as open source gradually. So stay tuned to see more functionality to come.&lt;/p&gt;</description></item></channel></rss>