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

时间:2019-02-02 03:48:20

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

在Google Apps脚本中,电子表格和表格上有一个getNamedRanges()方法,该方法返回命名范围的列表。但是没有getNamedRange(“ Name”)会返回一个名为range的单。

这对我来说似乎很奇怪。

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

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

*/
}

有更简单的方法吗?我不禁以为我缺少明显的东西。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

不幸的是,没有函数可以返回单个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);

答案 2 :(得分:0)

其实,有一种方式来获得一个命名范围。让说我有一个名为范围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);