In lieu of Apex and the Metadata API, I use VS Code and force:source:deploy
Note, in the case where you need to mass-update or mass-replace picklist values:
- Changing the picklist API value creates a new entry but you can change the label (not very useful in most cases)
- Replacing a picklist (via CLI or Metadata API) value causes the old value to be marked inactive as it is no longer part of the picklist metadata.
To replace a large number of picklist values, I would:
- Pull the object metadata into VS Code
- Replace the picklist values directly in the field-meta.xml file (for ease I usually convert the xml to a csv, replace in excel then convert back)
- force:source:deploy back to the target environment
- Run a data import to update all my existing records if needed
If the object has record types which control available picklist values, the following additional steps have to be completed:
- Open the recordType-meta.xml and replace all picklist values to match your updates above
- Note that the picklist values in the recordType-meta.xml are URL-encoded (for whatever god-forsaken reason) so you will need to encode your new values accordingly.
- Force:source:deploy back to target org