Google apps script GoogleSheets:使用命名区域查找所有单元格
我需要在工作表中的任何单元格中查找对命名范围(即单个单元格)的所有引用。有什么方法(或脚本)可以做到这一点吗 背景:我正在计算不同风力下船帆上的升力。方程式使用了“升力系数”值(CL),这是我的名字。然而,我现在需要改变这一点,以便在不同的风速下,使用不同的CL,并取消NamedRange 我可以使用嵌套的IF()语句来实现这一点,没有问题,但首先我必须找到当前使用NamedRange的所有单元格。Google apps script GoogleSheets:使用命名区域查找所有单元格,google-apps-script,google-sheets,named-ranges,Google Apps Script,Google Sheets,Named Ranges,我需要在工作表中的任何单元格中查找对命名范围(即单个单元格)的所有引用。有什么方法(或脚本)可以做到这一点吗 背景:我正在计算不同风力下船帆上的升力。方程式使用了“升力系数”值(CL),这是我的名字。然而,我现在需要改变这一点,以便在不同的风速下,使用不同的CL,并取消NamedRange 我可以使用嵌套的IF()语句来实现这一点,没有问题,但首先我必须找到当前使用NamedRange的所有单元格。 MTIA 我相信你的目标如下 ["A1", "B1",,
MTIA 我相信你的目标如下
["A1", "B1",,,]
- 您希望使用NamedRange检索包含公式的单元格
- 为了实现您的目标,您可以使用谷歌应用程序脚本
myFunction1
或myFunction2()。这样,您可以在日志中看到结果值
示例脚本1:
在这个示例脚本中,使用带有NamedRanges的公式的单元格的A1符号作为数组返回
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的公式的单元格的标记作为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的单元格符号用作键。并使用NamedRange和NamedRange的范围作为值。也可以从使用多个NamedRange的单元格中检索这些值
{
"A1":[{"namedRange":"sample1","rangeOfNamedRange":"'Sheet2'!A1"}],
"B1":[{"namedRange":"sample1","rangeOfNamedRange":"'Sheet2'!A1"},{"namedRange":"sample2","rangeOfNamedRange":"'Sheet2'!B1"}],
"C1":[{"namedRange":"sample3","rangeOfNamedRange":"'Sheet3'!A1"}],
,
,
,
}
参考资料:
补充:
我只需要为一个命名区域运行它,因为看起来所有命名区域的所有单元格都已被记录,所以我现在不知道哪个是哪个
从你上面的回答中,我认为模式1可能是合适的。所以当上面的脚本被修改时,它变成如下
["A1", "B1",,,]
修改脚本:
我提出了两个示例脚本作为答案。你能确认一下吗?如果这些不是你期望的方向,我道歉。谢谢你的时间!我只是在电子表格中使用附加的脚本。但是,我得到“TypeError:无法读取属性'createTextFinder'为null(第255行,文件“代码”)”感谢您的回复。给您带来不便,我深表歉意。从您的回复中,我又添加了一个示例脚本。在该脚本中,使用一个namedRange检索具有namedRange的单元格。你能确认一下吗?如果这不是你期望的结果,我再次道歉。顺便说一句,我为你的问题添加了一个谷歌应用脚本的标签。谢谢你的回复。我不得不为我糟糕的英语水平道歉。从你的答复和目前的情况来看,我担心我建议的答案能否解决你的问题。如果我的回答对你的情况没有帮助,我道歉。我可以问一下你目前的情况吗?你的英语很好,比我在澳大利亚认识的一些人都好!事实上,我对你的答案投了赞成票,但没有意识到我应该“勾选”它来“接受”答案——我现在已经这么做了。干杯,伙计!请注意,这也将返回使用与NamedRange名称相同的文字字符串的单元格。例如:namedRange名称是:摘要
<代码>A1:=摘要
,A2:“摘要是:
。两个单元格都将返回,而我们只需要A1。