在这种情况下:当可以添加列时,没有简单的方法来指定范围中的最后一列,同时允许自动增加行数。
该设计是一个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
是在INDEX
做ARRAYFORMULA
的方法,但是没有看到那里的解决方案。
要获取基于标题行(第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), ))
如果匹配,将返回最后一列的值