【前言】:
就目前来说,SF没提供任何批量删除picklist值的方法(包含Metadata),参见Idea Details,根据sf官方回复,这个功能并不在未来2-3个发布计划路线图里面;
【短期解决方案】:
从调研结果看,目前有两种方式能帮助我们节省时间:
1. 在console里边允许js,通过找到page上的删除按钮,执行异步操作模拟用户点击事件;
参考自:Mass deleting picklist values in Salesforce with AJAX javascript hack (2018 version)
2. 通过Chrome插件,帮助我们一次打开多个链接来提高手动删除效率;| Linkclump插件
我们知道Picklist有两种类型:
a. Picklist Value Set即Global Picklist;
b. Object Field Picklist,值维护在对象的字段上,而非参考Global Picklist;
测试发现,我们完全可以利用方法1结合2来根除a的痛点,代码如下:
var allClear = function() {
location.reload();
};
var links = document.getElementsByTagName("a");
var whatToDelete = prompt("Do you want to Delete 'Active' or 'Inactive' picklist values?'''", "Inactive");
if(!(whatToDelete === "Active" || whatToDelete === "Inactive")) {
window.alert("Invalid choice, quitting");
} else {
var onlyInactive = whatToDelete === "Inactive";
var delLinks = new Array();
for (var i = 0; i < links.length-1; i++) {
var link = links[i];
if(onlyInactive) {
if(link.innerHTML === "Activate") {
var link = links[i-1];
} else {
continue;
}
}
if (link.innerHTML == "Del") {
delLinks.push(link);
}
}
if(delLinks.length == 0) {
window.alert("Nothing to delete");
} else {
var goAhead = confirm("You're about to delete " + delLinks.length + " picklist values");
if(goAhead) {
for (var i = 0; i < delLinks.length; i++) {
var delLink = delLinks[i].href
// Synchronous AJAX style
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET",delLink, false);
console.log("Deleting #" + i + ": " + delLink);
xmlhttp.send();
}
window.setTimeout(allClear, 2000);
}
}
}
使用方法:
i. 先打开global picklist detail页面,将上面代码复制进console,回车后输入Active(假定这些值都为Active);
ii. 经删除,我们发现最终只剩下一条记录,而且只有Edit无Del;
iii. 再输入1条数据,这时我们能看见Del按钮在2条记录前,然后使用插件全部清空;
插件用法:以win为例,按住z + 鼠标左键选中超链接区块,然后松开即可在新窗口打开链接。
对于方法1无法解决b痛点,主要原因是sf服务器端还需要用户将del的val1转成valn / 空值操作,所以我们可以利用2,来减少多次点击Del链接。