Google Apps: Array.map () - как выбросить ошибку только в один индекс - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть пользовательская функция в 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()?

...