我有一个复杂的电子表格,其中每个选项卡都有许多在不同工作集中定义的命名范围(例如 Tab_A、Tab_B、... Tab_X)。我试图将此电子表格分解为较小的独立电子表格(假设独立电子表格 1 只有 Tab_A、Tab_B),方法是首先复制原始大型电子表格并剪掉我不需要的工作表,然后尝试清理命名范围。我试图摆脱现在已删除的工作表中定义的所有现在无效的命名范围。
我尝试运行这个脚本...
function ListInvalidNamedRanges() {
var spreadsheet = SpreadsheetApp.getActive();
/* remove named range if match or partial match with Tab Name reference */
var namedRangeList = spreadsheet.getNamedRanges();
for (var j=0; j<namedRangeList.length; j++) {
var namedRangeName = namedRangeList[j].getName();
// Do not use includes - ECMA-6 not supported in AppScript
try {
var namedRange = namedRangeList[j].getRange();
var valueToTriggerErrorIfApplicable = namedRange.getValue(); // force error if necessary
Logger.log("Try: Valid named range: %s; Range: %s; Value: %s; j: %s", namedRangeName,namedRange, valueToTriggerErrorIfApplicable, j );
}
catch(e) {
Logger.log("Catch: Invalid named range: %s; Range: %s; Value: %s", namedRangeName,namedRange, valueToTriggerErrorIfApplicable );
// namedRangeList[j].remove();
}
}
}
问题是spreadsheet.getNamedRanges()
不会返回现在删除的选项卡中定义的命名范围列表,但它们确实显示在命名范围 UI 中,如下图所示。
View of named images using the UI![](https://i.stack.imgur.com/rAygj.png)
有没有替代的电话spreadsheet.getNamedRanges()
返回完整列表?
有太多垃圾 NamedRanges 无法从 UI 中一次删除一个(甚至录制宏也不起作用,因为这些垃圾 NamedRanges 似乎也无法通过宏中的 appscript 访问)。我不止一次有这个用例,所以我尝试以脚本驱动的方式来完成此操作。
通过这个仅包含 2 个工作表的更简单的测试用例,可以轻松看出这一点。
这是测试电子表格的“删除之前”版本。为自己创建一个本地副本。https://docs.google.com/spreadsheets/d/1XVTmOMROWuCO640eBnNDF2WpVZFU4UA854pabvYd1ZE/edit?usp=sharing https://docs.google.com/spreadsheets/d/1XVTmOMROWuCO640eBnNDF2WpVZFU4UA854pabvYd1ZE/edit?usp=sharing.
Output of running the AppScript utility BEFORE deleting the 1st-worksheet![](https://i.stack.imgur.com/ngjup.png)
现在,删除第一个工作表 W1-to-be-deleted。
This is what shows up in the Named Range UI![](https://i.stack.imgur.com/fDmDR.png)
这是运行 AppScript 函数时显示的内容
Output of running the Appscript function AFTER the worksheet delete![](https://i.stack.imgur.com/Nv2Me.png)