问题描述
如果编写一个简单的 Google Apps Script 自定义函数,如下所示
function colFunc(x) {
if(Array.isArray(x)) {
return x.map(v => colFunc(v))
}
return "A";
}
我可以在 ArrayFormula 中调用 colFunc()
并且一切都按预期完美运行(Google 表格将用“A”填充整列)。
=ArrayFormula(colFunc(A1:A))
请注意,在此特定示例中,参数 x
的唯一用途是让我能够识别何时对整个列或单个单元格调用了该函数。
现在假设我要创建一个函数,该函数将为 3 个水平单元格返回 3 个值。公式代码为:
function cell3Func(x) {
return [["a","b","c"]];
}
如果我以标准方式调用它:
=cell3Func(A1)
我得到了分布在 3 个水平对齐的单元格上的预期结果,这些单元格的值为“a”、“b”和“c”。
现在,如果我想编写一个公式来填充 3 个单元格(水平放置),同时能够利用 ArrayFormula()
的强大功能处理整列怎么办?
function col3cellFunc(x) {
if(Array.isArray(x)) {
return x.map((v,i) => col3cellFunc(v[i]))
}
return [["a","c"]];
}
好吧,Google Sheet 不喜欢这个选项,结果只是显示一个空单元格。
我无法找到有关 ArrayFormula()
此类限制的文档。我知道有几个限制(Query()
、match()
、Index()
、...),但我找不到关于这种使用方式的任何信息。
显然,我真正的函数所做的不仅仅是返回“a”、“b”和“c”。如果问题是用“a”、“b”和“c”填充 3 列,还有其他几种更简单的解决方案。
有什么建议或推荐吗?
解决方法
所有自定义函数都是数组公式。无需使用 =ARRAYFORMULA()
明确指定它是数组公式。返回数组的唯一条件是它返回一个二维数组https://www.google.co.nz。 col3cellFunc
不这样做。 x
是一个二维数组,脚本将每个元素映射到另一个二维数组,这将产生一个 4D 数组。如果打算创建一列 [a,b,c],您可以简单地使用
function col3cellFunc(x) {
return x.map(row => ['a','b','c'])//Note how each row is mapped to a 1D array and NOT a 2D one
}
如果意图不同,您应该设计一个最佳策略来将 2D 输入塑造成所需的 2D 输出。