如何将自定义函数与 ArrayFormula 一起使用
How to use a custom function with an ArrayFormula
我想编写一个可以在 ArrayFormula 中使用的函数。我的table是这样的:
| A | B | C |
1| a | | |
2| b | | |
3| c | | |
首先,我为 return 输入编写了一个简单的函数(所以我知道它在 ArrayFormula 中工作):
function retAddress(cell){
return cell;
}
在 B1 上我写了 =ArrayFormula(retAddress(address(row(B:B),column(A:A),4)))
显然它按预期工作了,它 returned 每个地址,像这样:
| A | B | C |
1| a | A1| |
2| b | A2| |
3| c | A3| |
现在,在 C 列上,我想 return A 列的值,所以我写了一个这样的函数:
function retValue(cell){
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValue();
}
在 C1 上我写了 =ArrayFormula(retValue(address(row(B:B),column(A:A),4)))
但它给了我错误 Exception: Range not found (line 2).
,这是 getRange(cell)
方法的行。
如果我这样写没有 ArrayFormula 的函数:
在 C1 上,=retValue(address(row(C1),column(A:A),4))
在 C2 上,=retValue(address(row(C2),column(A:A),4))
在 C3 上,=retValue(address(row(C3),column(A:A),4))
我得到了预期的结果:
| A | B | C |
1| a | A1| a |
2| b | A2| b |
3| c | A3| c |
那么,如何让它在 ArrayFormula 中工作?
问题:
SpreadsheetApp.getActive().getRange(cell)
如果您提供数组输入,cell
是数组。 getRange
方法需要一个字符串作为输入。
解决方案:
map
数组转单值
参考文献:
片段#1:
function retValue(cell){
if(cell.map) {
return cell.map(retValue);
} else {
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValue();
}
}
片段#2:
请注意,在前面的代码片段中,您为输入数组中的每个单元格调用 getValue()
1 次。这非常慢。更好的方法是将其称为批处理:
=retValues("A1:B4")
function retValues(cell){//modified
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValues();//modified
}
- 注意:
- 只调用了 1 次
getValues()
。
- 公式 return 是一个没有显式使用
=ARRAYFORMULA()
的数组。默认情况下,所有自定义公式都是数组公式,但需要将它们配置为 return 值作为应用程序脚本中的数组。
我想编写一个可以在 ArrayFormula 中使用的函数。我的table是这样的:
| A | B | C |
1| a | | |
2| b | | |
3| c | | |
首先,我为 return 输入编写了一个简单的函数(所以我知道它在 ArrayFormula 中工作):
function retAddress(cell){
return cell;
}
在 B1 上我写了 =ArrayFormula(retAddress(address(row(B:B),column(A:A),4)))
显然它按预期工作了,它 returned 每个地址,像这样:
| A | B | C |
1| a | A1| |
2| b | A2| |
3| c | A3| |
现在,在 C 列上,我想 return A 列的值,所以我写了一个这样的函数:
function retValue(cell){
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValue();
}
在 C1 上我写了 =ArrayFormula(retValue(address(row(B:B),column(A:A),4)))
但它给了我错误 Exception: Range not found (line 2).
,这是 getRange(cell)
方法的行。
如果我这样写没有 ArrayFormula 的函数:
在 C1 上,=retValue(address(row(C1),column(A:A),4))
在 C2 上,=retValue(address(row(C2),column(A:A),4))
在 C3 上,=retValue(address(row(C3),column(A:A),4))
我得到了预期的结果:
| A | B | C |
1| a | A1| a |
2| b | A2| b |
3| c | A3| c |
那么,如何让它在 ArrayFormula 中工作?
问题:
SpreadsheetApp.getActive().getRange(cell)
如果您提供数组输入,cell
是数组。 getRange
方法需要一个字符串作为输入。
解决方案:
map
数组转单值
参考文献:
片段#1:
function retValue(cell){
if(cell.map) {
return cell.map(retValue);
} else {
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValue();
}
}
片段#2:
请注意,在前面的代码片段中,您为输入数组中的每个单元格调用 getValue()
1 次。这非常慢。更好的方法是将其称为批处理:
=retValues("A1:B4")
function retValues(cell){//modified
var cellRang = SpreadsheetApp.getActive().getRange(cell);
return cellRang.getValues();//modified
}
- 注意:
- 只调用了 1 次
getValues()
。 - 公式 return 是一个没有显式使用
=ARRAYFORMULA()
的数组。默认情况下,所有自定义公式都是数组公式,但需要将它们配置为 return 值作为应用程序脚本中的数组。
- 只调用了 1 次