评估作为Google电子表格中自定义函数参数传递的条件

时间:2016-04-22 15:08:11

标签: javascript google-apps-script google-sheets

我想创建一个自定义函数,接受条件作为 FILTER()函数的参数,例如:

LARGEST_STREAK(Data, Winnings > 0)
LARGEST_STREAK(Data, Winnings > 0, Sports = "Football")

(数据,奖金和运动被命名为范围)。

您是否有这样做的功能示例?最好的是FILTER()函数的源代码,但我甚至不确定Javascript是否为buit-in函数运行。

1 个答案:

答案 0 :(得分:1)

自定义函数接收的参数不是范围,它们是JavaScript值或双数组。例如,customfunction(A1:A3, B2:D2)将接收参数[[x], [y], [z]][[x,y,z]],其中x,y,z是存储在这些单元格中的值。

特别是,数组可以是布尔数组,然后可以在JavaScript自己的filter方法中使用。以下是FILTER函数作为自定义函数的重新实现:

function myFilter(arr, conditions) {
  if (conditions.length == 1) {
    return arr.map(function (row) {
      return row.filter(function (_, i) {
        return conditions[0][i];
      });
    });
  }
  else {
    return arr.filter(function (_, i) {
      return conditions[i][0];
    });
  }
}

要在比较中使用它,您需要arrayformula包装器:

=arrayformula(myfilter(A1:C10, D1:D10 > 5))

原因是如果没有包装器,D1:D10 > 5将返回与D1 > 5相同的内容。内置的FILTER函数不需要诸如包装器,因为它已经知道是一个与数组一起工作的函数。