如何找到值不为空的行中的第一个单元格,并检查该数字是否小于或等于其他单元格中的数字
How to find the first cell in a row where value is not empty and check if the number is less or equal the number in other cell
我有以下 Google 电子表格:
item have ready need1 need2 need3
A 1 2 1
B 1 2 1 1
C 2 2
等等
我想按如下方式填写 ready
列:
- 找到 need1, ..., needN 范围内具有非空值的第一列
- 如果找到的值小于或等于
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 )
(it returns #REF!
) 不确定它有什么问题或如何进行下一步。
提前致谢!
如果您知道自己有多少需要的列,甚至知道 sheet 上有多少列,这就非常简单了。如果不是,并且您需要查看整行,您可能需要重新设计一点以避免来自单元格的循环引用,其中公式是该行的一部分。
无论哪种方式,您的后两个步骤都相当简单 - 您需要基于条件的两个结果之一,因此您将要使用 =IF
。您的条件是 'need' 数字小于或等于 'have' 数字,并且您希望它说 'yes' 如果这是真的,如果不是的话什么也不说。所以,这给了我们:
=IF(need<=have, "Yes", "")
下面的示例假设上面的 table 从左上角的单元格 A1 开始,并且 sheet 中的最后一列是 Z
接下来我们需要找到'need'和'have'。查找 'have' 非常简单 - 它只是 B 列中的数字。
查找 'need' 稍微复杂一些。您使用 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", "")
然后只需将公式向下拖动到所需的行数即可。如果您的 sheet 变宽或变宽,只需将 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)
returns 从给定单元格 (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列。
这样的假设似乎是合理的,但如果它们限制了您,下面是您可以从 ready
列的右侧开始的任意数量的 need_
列的方法:
=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:,4)="need")))&row() )<>""),1)<=B2,"Yes","")
这个想法只是将 D2:Z2
(在@dmusgrave 的解决方案中)替换为:
INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() )
解释: 您从当前行的 D 开始,一直到同一当前行的最后 need_
列。
CHAR(68)
是 D
,您向其中添加标题为 need.*
的列数,减去一(因此为 67)。
使用相同的逻辑,您可以轻松地使您的公式更 robust/generic,例如不让 need_
列从 ready
列开始,等等
我有以下 Google 电子表格:
item have ready need1 need2 need3
A 1 2 1
B 1 2 1 1
C 2 2
等等
我想按如下方式填写 ready
列:
- 找到 need1, ..., needN 范围内具有非空值的第一列
- 如果找到的值小于或等于
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 )
(it returns #REF!
) 不确定它有什么问题或如何进行下一步。
提前致谢!
如果您知道自己有多少需要的列,甚至知道 sheet 上有多少列,这就非常简单了。如果不是,并且您需要查看整行,您可能需要重新设计一点以避免来自单元格的循环引用,其中公式是该行的一部分。
无论哪种方式,您的后两个步骤都相当简单 - 您需要基于条件的两个结果之一,因此您将要使用 =IF
。您的条件是 'need' 数字小于或等于 'have' 数字,并且您希望它说 'yes' 如果这是真的,如果不是的话什么也不说。所以,这给了我们:
=IF(need<=have, "Yes", "")
下面的示例假设上面的 table 从左上角的单元格 A1 开始,并且 sheet 中的最后一列是 Z
接下来我们需要找到'need'和'have'。查找 'have' 非常简单 - 它只是 B 列中的数字。
查找 'need' 稍微复杂一些。您使用 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", "")
然后只需将公式向下拖动到所需的行数即可。如果您的 sheet 变宽或变宽,只需将 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)
returns 从给定单元格 (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列。
这样的假设似乎是合理的,但如果它们限制了您,下面是您可以从 ready
列的右侧开始的任意数量的 need_
列的方法:
=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:,4)="need")))&row() )<>""),1)<=B2,"Yes","")
这个想法只是将 D2:Z2
(在@dmusgrave 的解决方案中)替换为:
INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER(:,LEFT(:, 4)="need")))&row() )
解释: 您从当前行的 D 开始,一直到同一当前行的最后 need_
列。
CHAR(68)
是 D
,您向其中添加标题为 need.*
的列数,减去一(因此为 67)。
使用相同的逻辑,您可以轻松地使您的公式更 robust/generic,例如不让 need_
列从 ready
列开始,等等