我有(我以为是)一个简单的查找表,其中包含一些汇率。我在那里根据行和列索引查找值。
我怎样才能在像这样的 ARRAYFORMULA 中做到这一点?:
=ARRAYFORMULA(INDEX(x!C2:C, F1:F))
x
是保存值的工作表,我对 C 列感兴趣,行索引保存在 F 列中。像 INDEX(x!C2:C, F7) 这样的单值查找正在按预期工作。
但遗憾的是,ARRAYFORMULA 不起作用,因为我猜 ARRAYFORMULA 不支持 INDEX。
vlookup
来模仿 index
功能。示例:
=arrayformula(vlookup(F1:F, {row(x!C2:C) - row(x!C2) + 1, x!C2:C}, 2))
执行您尝试使用“= ARRAYFORMULA(INDEX(x!C2:C,F1:F))”执行的操作。
查找表
{row(x!C2:C) - row(x!C2) + 1, x!C2:C}
第一列为 1,2,3,...,第二列为您希望索引的范围。因此,对于 F1:F 中的每个值,vlookup 都会访问 index
会访问的 x!C2:C 条目。
您可以通过在 x!C1 中写入“Anything”并使用 Vlookup 替换索引: =ARRAYFORMULA(Vlookup("任意", TRANSPOSE(x!C2:C),F1:F))
您可以编写自定义脚本来执行此操作,然后可以使用该脚本代替常规的index()函数。只需执行“工具”-->“脚本编辑器”,然后粘贴代码,保存,然后您就可以像 Google Sheets 中的普通函数一样使用该函数了。
代码:
function INDEXMULTI(array, rows, columns) {
var ret = new Array;
var i;
if (rows[0].length != columns[0].length)
return "Error: Row and column count must be the same";
for (i=0; i<rows[0].length; i++)
ret.push(array[(rows[0][i]-1)][(columns[0][i]-1)]);
return ret;
}
此函数将要从中提取数据的数组作为第一个参数,然后将要提取的数据的行和列作为第二个和第三个参数。代码中的 [0] 只是从一维数组中提取值,-1 是因为 javascript 数组是从 0 开始的,而 Google Sheets 是从 1 开始的。
您可以在此处查看其演示:https://docs.google.com/spreadsheets/d/1o6uiRr_OKh6lOUY4pOp_5z7hAIzGifFaXUIMOO7SCoc/edit#gid=0
请原谅我的英语。 VLOOKUP 的使用方式与 INDEX 几乎相同。 =IFERROR( ARRAYFORMULA(VLOOKUP(ARRAYFORMULA((F1:F1000)));({ARRAYFORMULA(ROW(x!C2:C1000))(x!C2:C1000)});2;0));"")
主要是限制from和to的范围,让数组公式不循环
这是一个无需更改所需原始数据的解决方案:
=数组公式(VLOOKUP("*", TRANSPOSE(x!C2:C), F1:F, FALSE))
这应该给出与
相同的结果=ARRAYFORMULA(VLOOKUP("任意", TRANSPOSE(x!C2:C), F1:F))
(稍作修改:由用户 Luigi 于 2019 年 6 月 9 日 23:03 回答。在 Luigi 的回答中,您实际上也不必修改数据。您不必在 x!C1 中写入“任何内容”。VLOOKUP使用默认值 is_sorted=TRUE 应该始终带来所需的结果,无论您作为 search_key 提交什么,因为查找区域在转置后仅包含一行)。