将数组传递给包裹在 ArrayFormula 中的自定义函数?
Passing an array into a custom function wrapped in an ArrayFormula?
我有一个电子表格,其中包含出于格式化原因使用合并单元格的列。我正在尝试创建反映第一组列的列,但在所有受影响的行上使用合并的单元格值。多亏了我在网上找到的一个自定义函数,我才能做到这一点。我不能做的就是将它包含在 arrayformula 中,我不确定为什么。
这是电子表格的缩小版:
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(index(address(row(),5,4)))
而我正在尝试的是:
=arrayformula(cellVal2(index(address(row(E3:E),5,4))))
知道我做错了什么吗?
干杯,
帕特里克
这个修改怎么样?我认为您的情况有几种解决方案。所以请将此视为其中之一。
修改点:
- 当
index(address(row(E3:E30),5,4))
给cellAddress
时,cellAddress
就是[["E3"], ["E4"], ["E5"],,,]
。这是一个二维数组。
- 将此二维数组展平为
getRangeList()
。
- 使用
getRangeList()
. 将展平数组转换为范围数组
- 使用转换后的范围和 return 检索每个值。
修改脚本:
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)))
参考资料:
如果我误解了你的问题,我很抱歉。
我有一个电子表格,其中包含出于格式化原因使用合并单元格的列。我正在尝试创建反映第一组列的列,但在所有受影响的行上使用合并的单元格值。多亏了我在网上找到的一个自定义函数,我才能做到这一点。我不能做的就是将它包含在 arrayformula 中,我不确定为什么。
这是电子表格的缩小版: 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(index(address(row(),5,4)))
而我正在尝试的是:
=arrayformula(cellVal2(index(address(row(E3:E),5,4))))
知道我做错了什么吗?
干杯,
帕特里克
这个修改怎么样?我认为您的情况有几种解决方案。所以请将此视为其中之一。
修改点:
- 当
index(address(row(E3:E30),5,4))
给cellAddress
时,cellAddress
就是[["E3"], ["E4"], ["E5"],,,]
。这是一个二维数组。- 将此二维数组展平为
getRangeList()
。
- 将此二维数组展平为
- 使用
getRangeList()
. 将展平数组转换为范围数组
- 使用转换后的范围和 return 检索每个值。
修改脚本:
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)))
参考资料:
如果我误解了你的问题,我很抱歉。