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

Evaluate conditions passed as arguments to custom function in Google spreadsheet

本文关键字:自定义函数 条件 电子表格 Google 参数传递 评估      更新时间:2023-09-26

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

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

(数据、奖金和体育被命名范围)。

你会有这样做的函数的例子吗?最好的是 FILTER() 函数的源代码,但我什至不确定它是 Javascript 在后面运行的内置函数。

自定义函数接收的参数不是范围,而是 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 函数不需要这样的包装器,因为它已经知道是一个处理数组的函数。