Передача массива в пользовательскую функцию, завернутую в ArrayFormula? - PullRequest
0 голосов
/ 07 мая 2018

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

Вот небольшая версия таблицы: https://docs.google.com/spreadsheets/d/1mp8PpgO4sI60bbx__1L4a17qL1VGIB9QVB910vTyhg0/edit?usp=sharing

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

/**
* 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 (индекс (адрес (строка (Е3: Е), 5,4))))

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

Приветствия

Patrick

1 Ответ

0 голосов
/ 07 мая 2018

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

Очки модификации:

  • Когда index(address(row(E3:E30),5,4)) присвоено cellAddress, cellAddress равно [["E3"], ["E4"], ["E5"],,,]. Это двумерный массив.
    • Свести этот 2-мерный массив для 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))))

или

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

Рекомендации:

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

...