Google 工作表:使用命名范围查找所有单元格

Google Sheets: Find All Cells Using a Named Range

我需要在 sheet 的 any 单元格中找到对命名范围(这是一个单元格)的所有引用。有什么方法(或脚本)可以做到这一点?

上下文:我正在计算船 sail 在不同风力下的升力。该等式使用“提升系数”值 (CL),这是我的 NamedRange。但是,我现在需要更改它,以便在不同的风速下使用不同的 CL,并废弃 NamedRange。

我可以使用嵌套的 IF() 语句来做到这一点,没问题,但首先我必须找到当前使用 NamedRange 的所有单元格。 MTIA!

我相信你的目标如下。

  • 您想使用 NamedRange 检索具有公式的单元格。
  • 为了实现您的目标,您可以使用 Google Apps 脚本。

在这个回答中,我想提出以下使用 Google Apps 脚本的流程。

  1. 检索所有命名范围。
  2. 使用 TextFinder,检索具有使用 NamedRange 的公式的单元格。

请将以下脚本复制并粘贴到电子表格的容器绑定脚本的脚本编辑器中。和 运行 函数 myFunction1myFunction2()。这样,您可以在日志中看到结果值。

示例脚本 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"}],
  ,
  ,
  ,
}

参考文献:

已添加:

I would need to run it for just one Named Range, as it looks like all cells for ALL Named Ranges have been logged, so I don't now which is which?

从你上面的回复来看,我觉得模式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)
}