如何找到值不为空的行中的第一个单元格,并检查该数字是否小于或等于其他单元格中的数字

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

所以上面的输入,处理后应该是这样的:

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' 稍微复杂一些。您使用 INDEXFILTER 的想法是正确的,但您的公式似乎有点过于复杂。基本上我们可以使用 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 更改为最后一列即可。

当您不知道范围的大小时,请使用函数 rowcolumnrowscolumns


简单公式

这是您正在查看的示例:

=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 列开始,等等