Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script GoogleSheets:使用命名区域查找所有单元格_Google Apps Script_Google Sheets_Named Ranges - Fatal编程技术网

Google apps script GoogleSheets:使用命名区域查找所有单元格

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",,

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

背景:我正在计算不同风力下船帆上的升力。方程式使用了“升力系数”值(CL),这是我的名字。然而,我现在需要改变这一点,以便在不同的风速下,使用不同的CL,并取消NamedRange

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

我相信你的目标如下

["A1", "B1",,,]
  • 您希望使用NamedRange检索包含公式的单元格
  • 为了实现您的目标,您可以使用谷歌应用程序脚本
在这个答案中,我想使用GoogleApps脚本提出以下流程

  • 检索所有命名范围
  • 使用TextFinder,使用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。