我有两个数组。其中一个包含引用工作表其他范围(其他页面)的字符串值。字符串引用的范围具有恒定的列大小(水平,在本例中为 4),但行大小(垂直)可能不同。另一个数组包含名称列表。两个数组的大小相同,每个数组的位置也相对应。我想从这些数据中获得更长的范围,第二个数组的名称分别位于每个范围的右侧。最好具有单一功能/单元,溢出到所需的空间。我非常不喜欢使用 google appscript/vba 脚本。问题的布局:
主页:
参考 | 姓名 |
---|---|
第一页!A2:D4 | 鲍勃 |
第二页!A3:D5 | 亚当 |
首页:
行# | 身份证 | 金额 | 商品 | 价格 |
---|---|---|---|---|
2 | 23 | 45 | 芹菜 | 120$ |
3 | 12 | 34 | 萝卜 | 100$ |
4 | 8 | 32 | 煎蛋 | 50$ |
第二页:
行# | 身份证 | 金额 | 商品 | 价格 |
---|---|---|---|---|
3 | 35 | 23 | 生菜 | 32$ |
4 | 10 | 64 | 牛奶 | 87$ |
5 | 9 | 95 | CPU | 234$ |
想要的输出:
行# | 身份证 | 金额 | 商品 | 价格 | 姓名 |
---|---|---|---|---|---|
2 | 23 | 45 | 芹菜 | 120$ | 鲍勃 |
3 | 12 | 34 | 萝卜 | 100$ | 鲍勃 |
4 | 8 | 32 | 煎蛋 | 50$ | 鲍勃 |
5 | 35 | 23 | 生菜 | 32$ | 亚当 |
6 | 10 | 64 | 牛奶 | 87$ | 亚当 |
7 | 9 | 95 | CPU | 234$ | 亚当 |
我尝试过的:
lambda(id, MAKEARRAY(rows(indirect(index(MainSheet!A2:A999, id))), 5, LAMBDA(row, column, if(column=5, index(MainSheet!B2:B999, id), index(INDIRECT(index(MainSheet!A2:A999, id)), row, column)))))(1)
\-> 适用于单个范围,但我不知道如何合并它们(因此是问题标题)(只需将 1 替换为引用的 id)
VSTACK(makearray(counta(MainSheet!A2:A999), 1, lambda(id, _, MAKEARRAY(rows(indirect(index(MainSheet!A2:A999, id))), 5, LAMBDA(row, column, if(column=5, index(MainSheet!B2:B999, id), index(INDIRECT(index(MainSheet!A2:A999, id)), row, column)))))))
\->“结果应该在单行中”错误
reduce({},makearray(counta(MainSheet!A2:A999), 1, lambda(id, _, MAKEARRAY(rows(indirect(index(MainSheet!A2:A999, id))), 5, LAMBDA(row, column, if(column=5, index(MainSheet!B2:B999, id), index(INDIRECT(index(MainSheet!A2:A999, id)), row, column)))))), LAMBDA(array, array2, array&array2))
\->“引用错误”:似乎
reduce()
不适用于数组作为初始值。 (我也尝试过用 arrayformula()
强制它
这是一个可能的解决方案:
=ARRAYFORMULA(
REDUCE(TOCOL(,1),SEQUENCE(COUNTA(MainSheet!A2:A)),
LAMBDA(a,i,VSTACK(a,
LET(x,INDIRECT(INDEX(MainSheet!A2:A,i)),
{x,IF(SEQUENCE(ROWS(x)),INDEX(MainSheet!B2:B,i))})))))
REDUCE
迭代 A2:A3
并获得 ref
erencesOFFSET
即可得到对应的name
,INDIRECT
即可得到对应的range
,IF/SEQUENCE
根据 ROWS
中
range
STACK
range
和 names
H
水平,最后 V
将当前迭代器结果与前一个 c
累加器进行堆叠。
a