У меня есть пользовательская функция в Google Sheets.Я передаю в качестве параметров строку, диапазон и число N (индекс), и он ищет строку в диапазоне, а затем возвращает мне значение позиции N ячейки вдали от моего найденного элемента.Таким образом, в таблице ниже:
A B C D
1 z y w v
2 q w e r
3 i d e a
4 s t a r
, если я запускаю =myfunc('q',A:D,2)
, он возвращает мне 'e'
.Не слишком отличается от vlookup()
, но мой поиск выполняется везде в таблице (не только в первом столбце) и может возвращать значения слева от найденного значения, например =myfunc('v', A:D, -2)
возвращает 'y'
.
СейчасЯ кодирую обработку ошибок, поэтому, если индекс для возврата выходит за пределы диапазона, он выдает ошибку с этим кодом throw new Error( "Item out of range." );
.Поскольку я не возвращаю это, Google Sheet идентифицирует себя как ошибку электронной таблицы, как я хочу.
Моя проблема заключается в следующем: когда я использую myfunc внутри ArrayFormula (), он работает нормально, если только нет одного значениядиапазона, тогда приложения Google выдают ошибку всем строкам в столбце.Я сделал более простой прототип ниже:
function testError(range) {
var cellRef;
if (range.map) {
return range.map(function (x) {
cellRef = SpreadsheetApp.getActive().getRange(x).getValue();
//(*) below is the problem!!!
if (cellRef == 'q') throw new Error("Error on purpose on cell A2");
return cellRef;
});
}
else {
cellRef = SpreadsheetApp.getActive().getRange(range).getValue();
// (**) below works fine!!
if (cellRef == 'q') throw new Error("Error on purpose on cell A2");
return cellRef;
}
}
Итак, в моих листах, когда я набираю его следующим образом =testerror(address(row(A:A),column(A:A)))
во всех строках (из любого столбца, потому что здесь я имею в виду column(A:A)
,вторая строка (ссылающаяся на ячейку A2) показывает ошибку, как и предполагалось (**). Но если я наберу это =ArrayFormula(testerror(address(row(A:A),column(A:A))))
в первой строке любого столбца, ничего не будет отображаться, поскольку будет единственная ошибка для всехстолбец (*).
Для иллюстрации ячейки E1, E2, E3 и E4 имеют следующую формулу: =testerror(address(row(),column(A:A)))
, а F1 имеет следующий =ArrayFormula(testerror(address(row(A:A),column(A:A))))
. Ниже приведен результат:
A B C D E F
1 z y w v z #ERROR
2 q w e r #ERROR
3 i d e a i
4 s t a r s
Как вы видите, результаты столбца F не заполняются, потому что он выдал одну ошибку. Для моей части массива, если я подставлю эту строку (*) что-то вроде этого: if (cellRef == 'q') return "String for ERROR on A2";
результат будет:
A B C D E F
1 z y w v z z
2 q w e r #ERROR "String for ERROR on A2"
3 i d e a i i
4 s t a r s s
Теперь это не сломает мой map()
, но это потому, что я вернул строку. Итак, как я могу выдать ошибку в эту ячейку только при использовании ArrayFormula()
?