Есть ли более простой способ реализовать отсутствующий метод getNamedRange (....)? - PullRequest
0 голосов
/ 02 февраля 2019

В Google Apps Script есть метод getNamedRanges () для электронных таблиц и листов, который возвращает список именованных диапазонов.Но нет 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

*/
}

Есть ли более простой способ сделать это?Я не могу не думать, что упускаю что-то очевидное.

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

К сожалению, нет функции для возврата одного 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);
0 голосов
/ 02 февраля 2019

На самом деле есть способ получить именованный диапазон.Допустим, у меня есть именованный диапазон A1: B3, называемый «Test».

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);
0 голосов
/ 02 февраля 2019

Например, как насчет использования метода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...