Скрипт Google Таблиц: ошибка типа: getValues не является функцией

#google-apps-script #google-sheets

#google-приложения-скрипт #google-таблицы

Вопрос:

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

Получение «TypeError: range.getValues не является функцией» при запуске теста не смог определить, почему. Буду признателен за любой совет. MTIA

 function c_test(){
  var result = c_VLookup(25, "Foil_Cant_Values", 2);  
  Logger.log("c_VLookup returned: "   result);
}

function c_VLookup(searchKey, NamedRange, index) {
// Author: Max Hugen
// Date: 20102-11-21
// Purpose: Script version of sheets VLOOKUP(search_key, range, index)

  var range = c_GetRangeByName(NamedRange);
    if (!range) { 
      Logger.log("c_VLookup didn't return a range.");
      return;
    }
  Logger.log("c_VLookup range: "   range);
  //Logger returned: c_VLookup range: A160:E162

  //TypeError: range.getValues is not a function (line 26, file "Utils")
  var data = range.getValues();

  var resultRow = data.filter( function(row) { row[1] = searchKey; });
  var result = resultRow[index];
  return resu<
}

function c_GetRangeByName(NamedRange) {
SpreadsheetApp.getActiveSpreadsheet().getRangeByName(NamedRange).getA1Notation();
}

 

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

1. Если ошибка возникает в var data = range.getValues() , из Logger returned: c_VLookup range: A160:E162 , кажется, что диапазон является строковым значением. Итак, в этом случае, как насчет изменения функции c_GetRangeByName(NamedRange) ? Потому что в этом случае, я думаю, что необходимо знать информацию электронной таблицы и таблицы для диапазона. Например, если var range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(NamedRange) невозможно использовать вместо var range = c_GetRangeByName(NamedRange) , можете ли вы предоставить сценарий c_GetRangeByName(NamedRange) ?

2. Привет, Танайке, я добавил функцию c_GetRangeByName выше. Я думаю, вы правы, я не могу использовать это для получения объекта диапазона?

Ответ №1:

В вашем скрипте c_GetRangeByName getA1Notation() используется, и значения не возвращаются. Я думаю, что это причина вашей проблемы. Поэтому, пожалуйста, измените следующим образом.

Модифицированный скрипт:

 function c_GetRangeByName(NamedRange) {
  return SpreadsheetApp.getActiveSpreadsheet().getRangeByName(NamedRange);
}
 

Кроме того, ваш filter файл должен быть изменен следующим образом.

 var resultRow = data.filter( function(row) { return row[1] == searchKey; });
 

Примечание:

  • Если вы хотите проверить примечание A1 по адресу Logger.log("c_VLookup range: " range); , пожалуйста, измените его на Logger.log("c_VLookup range: " range.getA1Notation());
  • В качестве дополнительной информации в вашем скрипте, когда ячейки «B160:B162» имеют значение 25 , возвращаются значения строки 162. Хотя я не уверен в вашей реальной ситуации, пожалуйста, будьте осторожны с этим.

Ссылки:

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

1. В вашем последнем комментарии, столбец A — это столбец «lookup», как в sheets VLOOKUP(). Тогда «индекс — это столбец, из которого можно получить результат, пронумерованный 1,2,3 и т. Д. Я попытался сделать это точно так же, как функция sheets. Поэтому он должен искать «25» в col A и возвращать значение в col B.

2. @maxhugen Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, из вашего ответа я не могу этого понять. Я думаю, что в этом случае, чтобы узнать вашу фактическую цель, необходимо подтвердить ваш пример ввода и вывода, который вы ожидаете. Итак, можете ли вы опубликовать его как новый вопрос, включив дополнительную информацию? Таким образом, это поможет пользователям, включая меня, подумать о решении. Если вы можете сотрудничать, чтобы решить вашу проблему, я рад.