У меня есть электронная таблица, содержащая столбцы, в которых для форматирования используются объединенные ячейки. Я пытаюсь создать столбцы, которые отражают этот первый набор столбцов, но используют объединенное значение ячейки во всех затронутых строках. Я могу сделать это благодаря настраиваемой функции, которую нашел в Интернете. Что я не могу сделать, так это включить это в формулу массива, и я не уверен, почему.
Передача массива в пользовательскую функцию, заключенную в 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))))
Есть идеи, что я здесь делаю не так?
Ваше здоровье,
Патрик
comment
Я должен добавить, что причина, по которой я хочу обернуть эту формулу в ArrayFormula, заключается в том, что если последующие пользователи вставляют дополнительные строки в электронную таблицу, формула все равно будет применяться без каких-либо действий. Это будет означать, что я могу скрыть свои зеркальные столбцы.
- person Patrick   schedule 07.05.2018
Ответы (1)
Как насчет этой модификации? Я думаю, что есть несколько вариантов выхода из вашей ситуации. Так что считайте это одним из них.
Пункты модификации:
- When
index(address(row(E3:E30),5,4))
is given tocellAddress
,cellAddress
is[["E3"], ["E4"], ["E5"],,,]
. This is a 2 dimensional array.- Flatten this 2 dimensional array for
getRangeList()
.
- Flatten this 2 dimensional array for
- Преобразуйте плоский массив в массив диапазонов, используя
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