Google表格过滤器使用IN子句

时间:2016-01-20 19:45:24

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

问题:在Google表格中,使用 内置函数,如何编写过滤器以排除基于a的记录每行中的列不在另一个范围的有效值列表中。

详情

我正在使用Google表格编写一份财务电子表格,其中我的所有费用和收入都输入到一张名为“交易”的表格中。我有一个名为常数的单独表格,其中列出了收入类别列表和费用类别列表。

以下是一些用于问题的示例数据:

常量

enter image description here

交易

enter image description here

我有一张名为ByMonth的工作表,我想在一个部分显示所有费用交易,并在一个单独的部分显示所有收入交易。 目标:

enter image description here

我需要在Google工作表函数中实际执行此sql查询:

select date, category, amount from transactions 
where category not in (
    select * from expense_categories
)

但我无法弄清楚如何让Google表格让我在他们的功能中使用IN概念。

这是我用于根据日期字段过滤行的单元格函数表达式:

=filter(Transactions!A2:C, 
        DATEVALUE(Transactions!A2:A) >= date(2015,4,1), 
        DATEVALUE(Transactions!A2:A) <= date(2015,4,30)
)

我会在filter()函数中添加第三个条件,第三个条件会以某种方式将每行数据的Category列与有效费用或收入类别列表进行比较,并返回一个布尔值。

以下是我尝试过的其他一些事情,但无济于事,包括MATCH,ARRAYFORMULA等的一些变体:

=filter(Transactions!A2:C, row(Transactions!B2:B) = UNIQUE(Constants!A2:A))
=filter(Transactions!A2:C, Transactions!B2:B = UNIQUE(Constants!A2:A))
=filter(Transactions!A2:C, Transactions!B2:B = Constants!A2:A)

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

您感兴趣的公式是:

=filter(Journal!A2:C13,IFERROR(Match(Journal!B2:B13,Categories!A2:A3,0)))

功能match(a, b, 0)搜索a中是否可以找到b。最后需要0才能完全匹配(默认为最接近匹配)。如果找不到a,则会收到错误,因此您使用iferror包装该函数以跳过错误。

这是working example file

答案 1 :(得分:2)

由于每个类别都使用关键字expenseincome,因此以下公式会返回所需的结果

=query(Journal!A2:C13,"Select * where B contains 'expense'")
=query(Journal!A2:C13,"Select * where B contains 'income'")