Передача массива в пользовательскую функцию, заключенную в ArrayFormula?

У меня есть электронная таблица, содержащая столбцы, в которых для форматирования используются объединенные ячейки. Я пытаюсь создать столбцы, которые отражают этот первый набор столбцов, но используют объединенное значение ячейки во всех затронутых строках. Я могу сделать это благодаря настраиваемой функции, которую нашел в Интернете. Что я не могу сделать, так это включить это в формулу массива, и я не уверен, почему.

Вот небольшая версия таблицы:

Пользовательская функция:

/**
* Takes into account merged cells and returns the value of the merged cell 
* for all the cells within the merged range, rother than just the top left 
* cell of the merged range.
*
* Copied from https://webapps.stackexchange.com/questions/110277/how-do-i-reference-the-values-of-merged-cells-in-formulas
*
* Used by Patrick Duncan. - 7 May 2018
*/

function cellVal(cellAddress) {
  var cell = SpreadsheetApp.getActiveSheet().getRange(cellAddress);  
  return (cell.isPartOfMerge() ? cell.getMergedRanges()[0].getCell(1, 1) : cell).getValue();
}

Формула без Arrayformula:

= cellVal2 (индекс (адрес (строка (), 5,4)))

И я пытался:

= arrayformula (cellVal2 (index (адрес (строка (E3: E), 5,4))))

Есть идеи, что я здесь делаю не так?

Ваше здоровье,

Патрик


person Patrick    schedule 07.05.2018    source источник
comment
Я должен добавить, что причина, по которой я хочу обернуть эту формулу в ArrayFormula, заключается в том, что если последующие пользователи вставляют дополнительные строки в электронную таблицу, формула все равно будет применяться без каких-либо действий. Это будет означать, что я могу скрыть свои зеркальные столбцы.   -  person Patrick    schedule 07.05.2018


Ответы (1)


Как насчет этой модификации? Я думаю, что есть несколько вариантов выхода из вашей ситуации. Так что считайте это одним из них.

Пункты модификации:

  • When index(address(row(E3:E30),5,4)) is given to cellAddress, cellAddress is [["E3"], ["E4"], ["E5"],,,]. This is a 2 dimensional array.
    • Flatten this 2 dimensional array for getRangeList().
  • Преобразуйте плоский массив в массив диапазонов, используя getRangeList().
  • Получите каждое значение, используя преобразованный диапазон, и верните их.

Измененный скрипт:

function cellVal3(cellAddress) { // Modified the function name to "cellVal3"
  cellAddress = Array.prototype.concat.apply([], cellAddress);
  var cells = SpreadsheetApp.getActiveSheet().getRangeList(cellAddress).getRanges();
  return cells.map(function(cell){return [(cell.isPartOfMerge() ? cell.getMergedRanges()[0].getCell(1, 1) : cell).getValue()]});
}

Использование :

Когда вы используете эту пользовательскую функцию, пожалуйста, используйте следующее.

=ARRAYFORMULA(cellVal3(index(address(row(E3:E30),5,4))))

or

=cellVal3(index(address(row(E3:E30),5,4)))

Использованная литература :

Если я неправильно понял ваш вопрос, извините.

person Tanaike    schedule 07.05.2018