【问题标题】: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如何找到值不为空的行中的第一个单元格并检查该数字是否小于或等于其他单元格中的数字
【发布时间】:2016-10-08 02:40:15
【问题描述】:

我有以下 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 )

(它返回#REF!)不确定它出了什么问题或如何进行下一步。

提前致谢!

【问题讨论】:

    标签: google-sheets formulas


    【解决方案1】:

    如果您知道有多少列需要,或者甚至知道工作表上有多少列,这很简单。如果没有,并且您需要查看整行,则可能需要重新设计一下以避免来自单元格的循环引用,而公式是该行的一部分。

    无论哪种方式,您的后两个步骤都相当简单 - 您想要基于条件的两个结果之一,因此您将要使用 =IF。您的条件是“需要”数字小于或等于“有”数字,如果这是真的,您希望它说“是”,如果不是,则什么也不说。所以,这给了我们:

    =IF(need<=have, "Yes", "")
    

    以下示例假设您的上表从左上角的单元格 A1 开始,并且工作表中的最后一列是 Z

    接下来我们需要找到“需要”和“拥有”。找到“拥有”非常容易 - 它只是 B 列中的数字。

    寻找“需要”稍微复杂一些。您使用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", "")
    

    然后只需将公式向下拖动到所需的行数即可。如果您的工作表变宽或变宽,只需将 Z 更改为您的最后一列。

    【讨论】:

      【解决方案2】:

      如果您不知道范围的大小,请使用函数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)

      返回从给定单元格 (D2) 到工作表末尾 (COLUMNS(1:1)-column(D2)+1) 的范围


      数组公式

      我建议使用 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",""))
      

      假定“项目”列没有空白值。

      【讨论】:

        【解决方案3】:

        @Max Makhrov 的解决方案有效,并且具有对整个列使用单个公式的优势。 但是,它假定您在 ready 列 (D) 右侧的所有列都是 need_ 列。

        @dmusgrave 的解决方案也有效,前提是您删除了INDEX 之前的额外“=”: =IF(INDEX(FILTER(D2:Z2,D2:Z2&lt;&gt;""),1)&lt;=B2,"Yes","")。 但是,它做出了相同的假设,并且在 Z 列也有限制。

        这样的假设似乎是合理的,但如果它们限制了你,那么你可以在ready 列的右侧开始拥有任意数量的need_ 列:

        =IF(INDEX(FILTER(INDIRECT( "D"&amp;ROW()&amp;":"&amp;CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&amp;row() ), INDIRECT( "D"&amp;ROW()&amp;":"&amp;CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1,4)="need")))&amp;row() )&lt;&gt;""),1)&lt;=B2,"Yes","")

        这个想法只是将D2:Z2(在@dmusgrave 的解决方案中)替换为:

        INDIRECT( "D"&amp;ROW()&amp;":"&amp;CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&amp;row() )

        解释:从当前行的 D 开始,一直到同一当前行的最后一个 need_ 列。 CHAR(68)D,在其中加上标题为 need.* 的列数减一(因此为 67)。

        使用相同的逻辑,您可以轻松地使您的公式更健壮/更通用,例如不让need_ 列从ready 列开始,等等。

        【讨论】:

          猜你喜欢
          • 2022-12-20
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-11
          • 2016-04-15
          • 2017-08-14
          相关资源
          最近更新 更多