我有以下Google电子表格:
item have ready need1 need2 need3
A 1 2 1
B 1 2 1 1
C 2 2
等等
我想填写ready
列如下:
have
列中的值,请将ready
列设置为快乐(例如yes
)have
列中的值,则不要执行任何操作所以上面的输入,处理时应该如下所示:
item have ready need1 need2 need3
A 1 2 1
B 1 2 1 1
C 2 yes 2
对于第一步,我找到了一个建议的解决方案,这对我不起作用:
=INDEX( SORT( FILTER( D10:H10 , LEN( D10:H10 ) ) ,
FILTER( COLUMN( D10:H10 ) , LEN( D10:H10 ) ) , 0 ) , 1 )
(它返回#REF!
)不确定它有什么问题或如何继续下一步。
提前致谢!
如果你知道你需要有多少列,甚至只知道工作表上有多少列,这是非常简单的。如果没有,你需要查看整行,你可能需要重新设计一点,以避免来自单元格的循环引用,公式是该行的一部分。
你的后两个步骤相当简单 - 你想要一个基于条件的两个结果中的一个,所以你将要使用=IF
。你的条件是'需要'数字小于或等于'有'数字,如果那是真的你想要它说'是',如果没有则你想要它。所以,这给了我们:
=IF(need<=have, "Yes", "")
下面的示例假设您的上表从左上角的单元格A1开始,并且工作表中的最后一列是Z.
接下来我们需要找到'需要'和'有'。找到'have'非常简单 - 它只是B列中的数字。
找到“需要”稍微复杂一些。你有正确的想法使用INDEX
和FILTER
,但你的公式似乎有点过于复杂。基本上我们可以使用FILTER
过滤掉空白值,并使用INDEX
找到剩下的第一个。首先,FILTER
:
您要过滤的范围是从D列到Z列的同一行中的所有内容(或最终列的任何内容),您要过滤的条件是这些相同的单元格不是空白。对于您在单元格C2中键入的公式,这给了我们:
=FILTER(D2:Z2, D2:Z2<>"")
接下来,INDEX
:如果给INDEX
一个数组,一个行号和一个列号,它将告诉你那个行和列相遇的单元格是什么。由于我们已经过滤掉了空白,我们只需要在过滤后的数组的第一列中留下任何内容,这样我们就可以:
=INDEX(FILTER(D2:Z2, D2:Z2<>""), 1, 1)
或者,因为我们的数组中只有一行,而INDEX
非常聪明,只需:
=INDEX(FILTER(D2:Z2, D2:Z2<>""), 1)
因此,为了将它们整合在一起,我们对C2单元的最终公式是:
=IF(INDEX(FILTER(D2:Z2, D2:Z2<>""), 1)<=B2, "Yes", "")
然后根据需要将公式向下拖动多个行。如果您的工作表变宽或变宽,只需将Z更改为您的最后一列。
如果您不知道范围的大小,请使用函数row
,column
,rows
,columns
。
简单的公式
这是你正在寻找的一个例子:
=if(INDEX(FILTER(OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1),OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)<>""),1)<=B2,"yes","")
这部分公式:
OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)
返回从给定单元格(D2
)到Sheet结尾的范围(COLUMNS(1:1)-column(D2)+1
)
ARRAYFORMULA
我建议使用ArrayFormula,它会自动扩展:
=ARRAYFORMULA(if(REGEXEXTRACT(SUBSTITUTE(trim(transpose(query(transpose(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)),,COLUMNS(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)))))," ",", "),"\d+")*1<=OFFSET(B2,,,COUNTA(A2:A)),"yes",""))
它假定'Item'列没有空值。
来自@Max Makhrov的解决方案有效,并且具有为整列使用单一公式的优势。但是,它假设您的ready
列(D)右侧的所有列都是need_
列。
@dmusgrave的解决方案也有效,只要你在INDEX
:=IF(INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","")
之前删除额外的“=”。但是,它做出了相同的假设,并且在Z列也有限制。
这样的假设似乎是合理的,但是如果它们限制了你,那么你可以在need_
专栏的右边找到任意数量的ready
列:
=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1,4)="need")))&row() )<>""),1)<=B2,"Yes","")
这个想法只是通过以下方式取代D2:Z2
(在@dmusgrave的解决方案中):
INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row() )
说明:从当前行的D开始,直到同一当前行的最后一个need_
列。 CHAR(68)
是D
,你可以在其中添加标题为need.*
的列数减1(因此为67)。
使用相同的逻辑,您可以轻松地使您的公式更健壮/通用,例如没有need_
列从ready
列开始,等等。