我相信你的目标如下。
- 您想要使用 NamedRange 检索具有公式的单元格。
- 为了实现您的目标,您可以使用 Google Apps 脚本。
在这个答案中,我想使用 Google Apps 脚本提出以下流程。
- 检索所有命名范围。
- 使用 TextFinder,检索具有使用 NamedRange 的公式的单元格。
请将以下脚本复制并粘贴到电子表格的容器绑定脚本的脚本编辑器中。并运行函数myFunction1 或myFunction2()。这样,您可以在日志中看到结果值。
示例脚本 1:
在此示例脚本中,使用带有 NamedRanges 的公式的单元格的 A1Notations 作为数组返回。
function myFunction1() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1"); // Please set the sheet name.
// 1. Retrieve all named ranges.
const namedRanges = ss.getNamedRanges().map(e => e.getName());
// 2. Using TextFinder, retrieve the cells which have the formulas using NamedRange.
const values = namedRanges.reduce((ar, e) => {
sheet.createTextFinder(e).matchCase(true).matchFormulaText(true).findAll().forEach(f => ar.push(f.getA1Notation()));
return ar;
}, []);
const res = [...new Set(values)];
console.log(res)
}
结果:
样本输出值如下。
["A1", "B1",,,]
示例脚本 2:
在此示例脚本中,使用带有 NamedRanges 的公式的单元格的 A1Notations 作为 JSON 对象返回。
function myFunction2() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet1"); // Please set the sheet name.
// 1. Retrieve all named ranges.
const namedRanges = ss.getNamedRanges().map(e => ({name: e.getName(), range: `'${e.getRange().getSheet().getSheetName()}'!${e.getRange().getA1Notation()}`}));
// 2. Using TextFinder, retrieve the cells which have the formulas using NamedRange.
const res = namedRanges.reduce((o, {name, range}) => {
sheet.createTextFinder(name).matchCase(true).matchFormulaText(true).findAll().forEach(f => {
const r = f.getA1Notation();
const temp = {namedRange: name, rangeOfNamedRange: range};
o[r] = o[r] ? o[r].concat(temp) : [temp];
});
return o;
}, {});
console.log(res)
}
结果:
示例输出值如下。使用 NamedRange 的单元格的 A1Notation 用作键。并将 NamedRange 和 NamedRange 的范围用作值。也可以从使用多个 NamedRanges 的单元格中检索这些值。
{
"A1":[{"namedRange":"sample1","rangeOfNamedRange":"'Sheet2'!A1"}],
"B1":[{"namedRange":"sample1","rangeOfNamedRange":"'Sheet2'!A1"},{"namedRange":"sample2","rangeOfNamedRange":"'Sheet2'!B1"}],
"C1":[{"namedRange":"sample3","rangeOfNamedRange":"'Sheet3'!A1"}],
,
,
,
}
参考资料:
补充:
我只需要为一个命名范围运行它,因为看起来所有命名范围的所有单元格都已记录,所以我现在不知道哪个是哪个?
从您上面的回复中,我认为模式 1 可能是合适的。所以当上面的脚本被修改后,就变成了如下。
修改脚本:
function myFunction1() {
const sheet = ss.getSheetByName("Sheet1"); // Please set the sheet name.
const namedRange = "###"; // Please set the name of namedRange.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const res = sheet.createTextFinder(namedRange).matchCase(true).matchFormulaText(true).findAll().map(f => f.getA1Notation());
console.log(res)
}