【问题标题】:Google Sheets: Find All Cells Using a Named RangeGoogle 表格:使用命名范围查找所有单元格
【发布时间】:2020-11-12 23:15:21
【问题描述】:

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

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

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

【问题讨论】:

  • 我提出了 2 个示例脚本作为答案。你能确认一下吗?如果这些不是您期望的方向,我很抱歉。
  • 感谢您的宝贵时间!我只在电子表格中使用附加脚本。但是,我得到“TypeError:无法读取 null 的属性 'createTextFinder'(第 255 行,文件“代码”)”
  • 感谢您的回复。我带来的不便表示歉意。根据您的回复,我又添加了一个示例脚本。在该脚本中,使用 namedRange 检索具有 namedRange 的单元格。你能确认一下吗?如果这不是您期望的结果,我再次道歉。顺便说一句,我为您的问题添加了google-apps-script 的标签。
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。从您的回复和目前的情况来看,我担心我建议的答案是否可以解决您的问题。如果我的回答对您的情况没有帮助,我深表歉意。我能问一下你目前的情况吗?
  • 你的英语很好,比我在澳大利亚认识的一些人还要好!实际上,我赞成您的答案,但没有意识到我应该“勾选”它以“接受”答案 - 我现在已经这样做了。干杯伙伴!

标签: google-apps-script google-sheets named-ranges


【解决方案1】:

我相信你的目标如下。

  • 您想要使用 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"}],
  ,
  ,
  ,
}

参考资料:

补充:

我只需要为一个命名范围运行它,因为看起来所有命名范围的所有单元格都已记录,所以我现在不知道哪个是哪个?

从您上面的回复中,我认为模式 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)
}

【讨论】:

  • 请注意,这还将返回使用与 NamedRange 名称相同的文字字符串的单元格。例如:namedRange 名称为:summaryA1: =summaryA2: "The summary is:"。两个单元格都将返回,而我们只需要 A1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多