有没有更简单的方法来实现缺少的 "getNamedRange(....)" 方法?

Is there an easier way to implement the missing "getNamedRange(....)" method?

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

我觉得这很奇怪。

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

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

*/
}

有更简单的方法吗?我忍不住想我错过了一些明显的东西。

比如用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

不幸的是,return 单个 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);

实际上有一种方法可以获取命名范围。假设我有一个名为 "Test".

的命名范围 A1:B3
var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("Test").getValues();

将 return 中的值设为 A1:B3。或者更简单。

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

如果 objective 是要更改名称试试这个。

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