【问题标题】:Is there an easier way to implement the missing "getNamedRange(....)" method?有没有更简单的方法来实现缺少的“getNamedRange(....)”方法?
【发布时间】:2019-02-02 03:48:19
【问题描述】:

在 Google Apps 脚本中,电子表格和表格上有一个方法 getNamedRanges(),它返回命名范围的列表。但是没有返回 SINGLE 命名范围的 getNamedRange("Name")。

我觉得这很奇怪。

为了解决这个问题,我使用了这个复杂的过程:

function testing()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var nameOfNamedRange = "NameOfMyNamedRange";

  var namedRanges = ss.getNamedRanges();

  /* ###### THIS IS WHAT I HAVE TO DO ######### */
  for (i = 0; i<namedRanges.length; ++i)
  { var nRange = namedRanges[i];
    if ( nRange.getName() == nameOfNamedRange )
      {
        /* Process nRange
        doSomething(nRange);
        */
        Logger.log(nRange.getName());
      }
  }

/* ############ THIS IS WHAT I'D LIKE TO DO (or something similar) ##########
    var nRange = ss.getNamedRange("NameOfMyNamedRange") // ...Range   not ...Ranges

*/
}

有没有更简单的方法来做到这一点?我忍不住想我错过了一些明显的东西。

【问题讨论】:

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


    【解决方案1】:

    比如用getRangeByName()的方法怎么样?

    修改脚本:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var nameOfNamedRange = "NameOfMyNamedRange";
    var nRange = ss.getRangeByName(nameOfNamedRange); // Added
    

    参考:

    编辑:

    当您想检索单个命名范围时,下面的示例脚本怎么样,因为没有直接检索单个命名范围的方法?命名范围的名称在电子表格中只有一个。这个可以用。请认为这只是几个答案之一。

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var nameOfNamedRange = "NameOfMyNamedRange";
    var nRange = ss.getNamedRanges().filter(function(e) {return e.getName() === nameOfNamedRange})[0]; // Added
    

    【讨论】:

    • 很遗憾,不是。提示在方法 getRange 的名称中......它返回一个 Range,而不是 Named Range。在我看来, getNamedRange(...) 根本就不见了。
    • @Alex Goodall 对于给您带来的不便,我深表歉意。我更新了我的答案。你能确认一下吗?
    • 这非常好用。比我笨拙的方法紧凑得多。谢谢@Tanaike。
    【解决方案2】:

    不幸的是,没有返回单个 NamedRange 实例的函数。但是您可以清理当前的解决方法并将其包装成一个实用函数,如下所示:

    (function(scope){
        const Utils = scope.Utils || (scope.Utils = {});
    
        /**
         * Filter function
         */
        function filterByName(namedRange) {
            return this.name === namedRange.getName();
        }
    
        /**
         * Gets named range by name.
         *
         * @param {Spreadsheet|Sheet} context - An instance of Spreadsheet or Sheet.
         * @param {String}               name - The name of a NamedRange.
         *
         * @return {NamedRange} A NamedRange or null if not found.
         */
        function getNamedRangeByName(context, name) {
            if (!context || !context.getNamedRanges) {
                throw new Error("Invalid context object; must implement getNamedRanges()");
            }
    
            var filtered = context.getNamedRanges().filter(filterByName.bind({name:name}));
    
            return filtered.length ? filtered[0] : null;
        }
    
        Utils.getNamedRangeByName = getNamedRangeByName;
    })(this);
    

    只需将上面的脚本添加到你的项目中,然后调用如下:

    var ss = SpreadsheetApp.getActive();
    var nameOfNamedRange = "[NAME_OF_NAMED_RANGE]";
    
    var namedRange = Utils.getNamedRangeByName(ss, nameOfNamedRange);
    

    【讨论】:

    • 感谢 Dimu Designs。几十年后我又回来做一些编程——并且第一次使用 Javascript。因此,我非常感谢您的解决方案的专业性 - 我可以从中学习很多东西。但是,@Tanaike 的解决方案仍然最适合我的当前需求。
    【解决方案3】:

    实际上有一种方法可以获取命名范围。假设我有一个名为“Test”的命名范围 A1:B3。

    var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("Test").getValues();
    

    将返回 A1:B3 中的值。或者更简单。

      var values = SpreadsheetApp.getActiveSpreadsheet().getRange("Test").getValues();
    

    如果目标是更改名称,试试这个。

    var spread = SpreadsheetApp.getActiveSpreadsheet();
    var range = spread.getRange("Test");
    spread.setNamedRange("Other",range);
    

    【讨论】:

    • 某些范围名称会导致问题。 AFAIK 官方文档没有提到任何限制。
    • 同样,它返回一个范围,而不是一个命名范围。例如,获取值可以,但不能更改名称或将命名范围移动到不同的工作表。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2023-02-21
    • 2019-08-19
    • 2017-12-18
    相关资源
    最近更新 更多