ArrayFormula 不能使用返回数组的自定义函数吗?
Is ArrayFormula not working with custom functions returning arrays?
如果编写一个简单的 Google Apps 脚本 自定义函数,如下所示
function colFunc(x) {
if(Array.isArray(x)) {
return x.map(v => colFunc(v))
}
return "A";
}
我可以在 ArrayFormula 中调用 colFunc()
,一切都按预期完美运行(Google Sheet 将用“A”填充整个列)。
=ArrayFormula(colFunc(A1:A))
请注意,在此特定示例中,参数 x
的唯一用途是让我识别何时对整个列或单个单元格调用了该函数。
现在假设我要创建一个函数,它将 return 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", "b", "c"]];
}
好吧,Google Sheet 不喜欢这个选项,结果只是显示一个空单元格。
我无法找到有关 ArrayFormula()
的此类限制的文档。我知道有几个限制(Query()
、Match()
、Index()
、...),但我找不到关于这种使用方式的任何信息。
显然,我的实际功能不仅仅是 returning“a”、“b”和“c”。如果问题是用“a”、“b”和“c”填充 3 列,还有其他几个更简单的解决方案。
有什么建议或建议吗?
所有自定义函数都是数组公式。使用=ARRAYFORMULA()
不需要明确指定是数组公式。 return 数组的唯一条件是它 return 是一个二维数组 Related。 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 输出。
如果编写一个简单的 Google Apps 脚本 自定义函数,如下所示
function colFunc(x) {
if(Array.isArray(x)) {
return x.map(v => colFunc(v))
}
return "A";
}
我可以在 ArrayFormula 中调用 colFunc()
,一切都按预期完美运行(Google Sheet 将用“A”填充整个列)。
=ArrayFormula(colFunc(A1:A))
请注意,在此特定示例中,参数 x
的唯一用途是让我识别何时对整个列或单个单元格调用了该函数。
现在假设我要创建一个函数,它将 return 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", "b", "c"]];
}
好吧,Google Sheet 不喜欢这个选项,结果只是显示一个空单元格。
我无法找到有关 ArrayFormula()
的此类限制的文档。我知道有几个限制(Query()
、Match()
、Index()
、...),但我找不到关于这种使用方式的任何信息。
显然,我的实际功能不仅仅是 returning“a”、“b”和“c”。如果问题是用“a”、“b”和“c”填充 3 列,还有其他几个更简单的解决方案。
有什么建议或建议吗?
所有自定义函数都是数组公式。使用=ARRAYFORMULA()
不需要明确指定是数组公式。 return 数组的唯一条件是它 return 是一个二维数组 Related。 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 输出。