如何避免在spreadsheet = INDEX(FILTER(),FILTER())表达式中重复自己?

时间:2016-11-25 15:44:14

标签: indexing filter google-sheets spreadsheet dry

我有一个电子表格公式,其中我在INDEX函数中使用两次完全相同的FILTER函数。有没有办法避免重复自己,和/或更简单的表达版本?

表达式看起来像这样(分成多行,以获得一点点额外的清晰度):

=INDEX( FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), NOT (ISBLANK(A2:P2))), COLUMNS( FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), NOT (ISBLANK(A2:P2)))))

表达式的作用是返回行中最右边非空白列的标题,只要该列是" ANIM"," COMP"或者& #34;去编辑"。

请参阅此Google表格第Q列中的公式:

https://docs.google.com/spreadsheets/d/1JCwmv2Bkz4v4_0wbM07IxcUtqCfm2242p0IVbex-I5c/edit?usp=sharing

由于FILTER函数两次完全相同,如果我可以使用变量,它可以重写为:

range1 = FILTER(.....); INDEX(range1,COLUMNS(range1));

为了避免重复我的FILTER表达式,有没有办法做类似的事情 - 或等效的事情?

2 个答案:

答案 0 :(得分:0)

你有正确的想法,避免重复长子公式的方法是将它们从公式中移出并以某种方式调用结果。在某些情况下,您可以使用对显示结果的范围的引用,但对于返回动态数组的公式,自定义函数可能是更好的选择。

示例:

假设你搬出去了

FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), 
NOT (ISBLANK(A2:P2)))

dry!A1(不要忘记在=前面加上

以下只是" mcve"。它假定干燥片材仅包含上述配方:

function headers(){
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheets().getSheeyByName('dry');
   return sheet.getDataRange().getValues();
}

替换原始公式以获取以下内容:

=INDEX(headers(dry!A1:P1),COLUMNS(headers(dry!A1:P1))

注意:使用dry!A1:P1作为headers()的参数是为了在每次子公式的结果发生变化时强制重新计算。

另请参阅:Is there a way to evaluate a formula that is stored in a cell?

答案 1 :(得分:0)

您可以尝试这样的事情:

=REGEXEXTRACT(JOIN("|",FILTER($A$1:$P$1, Regexmatch($A$1:$P$1,"ANIM|SENT TO EDIT|COMP"), NOT (ISBLANK(A2:P2)))),"([^|]+)$")

使用regular expressions是一种处理文本等数组的方法。