这一小段 Google Apps 脚本将列出您在应用程序脚本链接到的电子表格中定义的所有命名范围。它使用电子表格对象的
getNamedRanges()
。
function myFunction() {
let thisSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
let theNamedRanges = thisSpreadsheet.getNamedRanges();
let ordinal = 0;
for (aRange of theNamedRanges) {
Logger.log("Named Range %s: %s", ++ordinal, aRange.getName());
}
}
如果您在新的(空白 - 不需要数据)Google Sheets 文档中定义了一些命名范围 (
Menu > Data > Named Ranges
),则转到 [Menu] > Extensions > Apps Script
,将上面的小片段粘贴到它创建的 Code.gs 文件中为您保存并运行“myFunction”,然后回答 Google 关于授予新项目访问权限的安全问题,您应该会在应用程序底部显示的“执行日志”中看到您为命名范围指定的名称。脚本选项卡。
现在,返回电子表格文档,然后按左下角的
[+]
按钮添加另一张工作表。现在文档中有两个工作表,您可以在新工作表上定义更多命名范围。然后,如果您返回到应用程序脚本项目,并重新运行 myFunction,您将看到所有原始的命名范围集以及列出在一起的所有新范围。没有惊喜。
现在再次返回电子表格文档,在屏幕左下角,右键单击文档中两张工作表之一的“选项卡”,然后选择“删除”。如果“命名范围”侧边栏仍然打开,您将看到所有命名范围仍然存在,但那些在现已删除的工作表上定义的范围不再具有与其关联的有效单元格范围。如果有效的命名范围仍显示
Sheet!Cell:Cell
引用,则无效的范围(工作表已被删除的范围)只需显示 #REF
。
如果您现在重新运行 myFunction,您将看到它仅列出仍对表格文档中的单元格具有有效引用的命名范围。不再列出其单元格位于已删除工作表上的命名范围。
我有一个 Google 表格文档,由我编写的一些 Apps 脚本“操作”。我每天都使用电子表格,并使用脚本添加新工作表,并向这些工作表添加新的命名范围。当我完成今天的工作表时,我可以按下按钮并使用另一段应用程序脚本将它们一起删除,但我没有意识到这会在文档中留下命名范围。所以现在我的文档有成百上千个带有损坏单元格引用的命名范围。我尝试使用更多应用程序脚本来删除已失效的命名范围,但正如我们所见,我只能发现具有有效单元格引用的命名范围;我想要那些被破坏的!
我做错了吗?有谁知道我可以列出all命名范围的方法,以便我可以删除旧的损坏的范围? getNamedRanges() 函数似乎无法看到损坏的范围,但显然 Google 能够列出损坏的范围,因为我可以在命名范围侧边栏中看到它们(数百个!)。
感谢您的宝贵时间
山姆
function nr() {
const ss = SpreadsheetApp.getActive();
const arr = ss.getNamedRanges().map(nr => [nr.getName(),nr.getRange().getA1Notation()]).filter(r => !~r[1].indexOf("#REF"));
arr.unshift(["Name","Range"]);
Logger.log(JSON.stringify(arr))
}
此版本尝试计算与范围关联的数据数组的长度。
function nr() {
const ss = SpreadsheetApp.getActive();
const arr = ss.getNamedRanges().filter(nr => nr.getRange().getValues().flat().length > 0).map(nr => [nr.getName(),nr.getRange().getA1Notation()]);
arr.unshift(["Name","Range"]);
Logger.log(JSON.stringify(arr))
}