在动态确定的最后一行的ARRAYFORMULA中不能使用INDEX(VLOOKUP也不工作)

问题描述 投票:0回答:1

在这种情况下:当可以添加列时,没有简单的方法来指定范围中的最后一列,同时允许自动增加行数。

该设计是一个Google电子表格+表单,后续的标签/表单最重要。表单需要随着时间的推移而改变,那些执行繁重工作的选项卡需要跟上(获得一些代码来执行此操作),因此将添加更多列,并且我不希望用户必须 - 返回并查找并修改需要在给定新的最后一列时更新的公式。

因此,当添加新的电子表格元素时,我会添加列,最后一列包含我需要的结果。我只是不能在使用结果的其他公式中对该列的位置进行硬编码,而且,我需要为越来越多的行处理它。

动态确定最后一列是一个很容易找到的解决方案,它只获取所有列号的列表,返回最大的:

=max(filter(column(D1:1),len(D1:1)))

...任何专栏信都可以。因此,对于给定的行,您可以获取最后一列的数据:

    =index(E3:3,1,max(filter(column(E1:1),len(E1:1)))-4)  
// the "-4" is to offset for the 4th cell in the range.

但是,INDEX不适用于ARRAYFORMULA。在寻求帮助时,有很多回复表示在这些情况下使用VLOOKUP,包括有关动态列号的答案。也许我错过了这一点,但相应的VLOOKUP,AFAIK,是:

=VLOOKUP(E3,E3:3,max(filter(column(E1:1),len(E1:1)))-4)

其中,在ARRAYFORMULA(跨越所有行)看起来像:

=ARRAYFORMULA(VLOOKUP(E3:E,E3:3,max(filter(column(E1:1),len(E1:1)))-4))

...这是行不通的,因为单行范围“E3:3”对于所有行保持静态,所以我只得到其他每行结果中第3行的结果。

但是,我发现我可以使用:

=ARRAYFORMULA(E3:E & ": " & indirect("R3C" & B1 & ":C" & B1,FALSE))
// where B1 is max(filter(column(E1:1),len(E1:1)))

这将第5列中的条目与“:”连接,然后与最后一列中的条目连接。 ARRAYFORMULA中的范围说明符“E3:E”对第三个之后的所有行重复,并且在R3Cn:Cn(其中INDIRECT是最后一个列号)的n中的R1C1范围表示法将ARRAYFORMULA向下延伸到最后一列。

对这种行为有更好的解释吗?

我在VLOOKUP做错了什么? ...最好我能说,VLOOKUP是在INDEXARRAYFORMULA的方法,但是没有看到那里的解决方案。

google-sheets google-sheets-formula
1个回答
1
投票

要获取基于标题行(第1行)的最后一个非空列的范围,您需要像这样构造它:

=INDIRECT(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4)&":"&
 SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4),1,""))

然后你可以在VLOOKUP中使用它像这样:

=ARRAYFORMULA(IFERROR(VLOOKUP(E3:E, 
 {Form!E3:E,INDIRECT(ADDRESS(3,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4)&":"&
  SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4),1,""))}, 2, 0), ))

如果匹配,将返回最后一列的值

© www.soinside.com 2019 - 2024. All rights reserved.