【问题标题】:Is ArrayFormula not working with custom functions returning arrays?ArrayFormula 是否不适用于返回数组的自定义函数?
【发布时间】:2020-12-26 05:01:14
【问题描述】:

如果编写一个简单的 Google Apps 脚本自定义函数,如下所示

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", "b", "c"]];
}

好吧,Google 表格不喜欢这个选项,结果只是显示一个空单元格。 我无法找到有关ArrayFormula() 的这种限制的文档。我知道有几个限制(Query()Match()Index()、...),但我找不到任何关于这种使用方式的信息。

显然,我真正的函数不仅仅是返回“a”、“b”和“c”。如果问题是用“a”、“b”和“c”填充 3 列,还有其他几个更简单的解决方案。

有什么建议或建议吗?

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-formula custom-function


    【解决方案1】:

    所有自定义函数都是数组公式。无需使用=ARRAYFORMULA() 明确指定它是一个数组公式。返回数组的唯一条件是它返回一个二维数组Relatedcol3cellFunc 不会那样做。 x 是一个 2D 数组,脚本将每个元素映射到另一个 2D 数组,这将产生一个 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 输出。

    【讨论】:

    • 谢谢@themaster!为什么我没有考虑这个选项?现在你提到它,似乎很明显。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多