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

Javascript 计算作为参数传递给Google电子表格中自定义函数的条件,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我想创建一个自定义函数,它接受条件作为参数,就像FILTER()函数那样,例如: LARGEST_STREAK(Data, Winnings > 0) LARGEST_STREAK(Data, Winnings > 0, Sports = "Football") (数据、奖金和运动被命名为范围) 你有这样做的函数的例子吗?最好是FILTER()函数的源代码,但我甚至不确定内置函数背后运行的是Javascript。自定义函数接收的参数不是范围,而是Javascript值或双数组。例如

我想创建一个自定义函数,它接受条件作为参数,就像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自己的
过滤器
方法中使用。以下是作为自定义函数的
过滤器
函数的重新实现:

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
wrapper:

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

原因是没有包装器,
D1:D10>5
返回与
D1>5
相同的结果。内置的
FILTER
函数不需要像wrapper这样的函数,因为已经知道它是一个处理数组的函数

我不确定何时使用“conditions.length==1”范围。还有多个条件,条件数组是什么样子的?过滤器中的条件数组必须是一维的:行或列。长度==1表示一行,
[[x,y,z]]
。否则它是一列,
[[x],[y],[z]]
。如果您有多个条件,您将有
返回条件[0][i]&更多条件[0][i]。。。