#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 Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. К сожалению, из вашего ответа я не могу этого понять. Я думаю, что в этом случае, чтобы узнать вашу фактическую цель, необходимо подтвердить ваш пример ввода и вывода, который вы ожидаете. Итак, можете ли вы опубликовать его как новый вопрос, включив дополнительную информацию? Таким образом, это поможет пользователям, включая меня, подумать о решении. Если вы можете сотрудничать, чтобы решить вашу проблему, я рад.