Скрипт Google Sheets — передача диапазона в качестве параметра функции

#javascript #google-sheets

#javascript #google-sheets

Вопрос:

В таблице Google у меня есть пользовательская функция в ячейке =doSomething(myrange) . При использовании myrange непосредственно в моем скрипте он вернет значения диапазона в виде массива. В случае, если мне нужно не содержимое диапазона, а сам диапазон (например, для получения цветов ячеек), есть возможность проанализировать первый параметр как строку и создать диапазон на лету.

Пример:

     function doSomething(myRange) {
      let activeRg = SpreadsheetApp.getActiveRange();
      let activeformula = activeRg.getFormula();
      let countRangeAddress = activeformula.match(/((.*),/).pop().trim();
      ... 

Есть ли более элегантный способ получить диапазон, а не содержимое диапазона в виде массива? Это сделало бы код намного более читабельным.

Комментарии:

1. Хорошо, после попытки работы с этой вышеупомянутой функцией я решил удалить скрипт и работать со стандартными формулами Google Sheet. Функция была действительно ненадежной.

2. Я удалил свою пользовательскую функцию и заменил ее стандартной формулой. Функция, хотя и очень простая, работала ненадежно. Его использование в разных строках электронной таблицы иногда приводило к правильным, иногда к неправильным результатам.

Ответ №1:

Вы можете передать свой диапазон в виде строки в своей пользовательской функции и использовать Sheet.getRange(A1Notation)

Вместо =doSomething(A2:B3) использования =doSomething("A2:B3")

Пример кода:

 function doSomething(myRange){
  var sheet = SpreadsheetApp.getActiveSheet();
  var bgColors = sheet.getRange(myRange).getBackgrounds()
  for (var i in bgColors) {
    for (var j in bgColors[i]) {
      Logger.log(bgColors[i][j]);
    }
  }
  return bgColors;
}
 

Вывод:

введите описание изображения здесь

введите описание изображения здесь

  • Вы также можете указать, на каком листе вы хотите прочитать диапазон, как показано в примере вывода

введите описание изображения здесь

Комментарии:

1. Привет, Рон, ты вложил много усилий в свой ответ, и я ценю это. Однако это не было бы моим предпочтительным решением, поскольку у меня есть коллеги, которым потребуется введение в использование этой простой функции, и это было бы невозможно.