下面是一个例子,来说明3楼说的那种比较麻烦的堆积方式。如下图,要根据A:C列的层级关系,来生成右侧绿色区域的组织架构。
在右侧空单元格输入以下公式,回车。结构还是上面的双循环,只不过每层新查询的结果,继续堆积在原数组右侧。
- =LET(P,B2:B46,Q,C2:C46,v,REDUCE(FILTER(P,Q=0),P,LAMBDA(x,y,DROP(REDUCE(0,SEQUENCE(ROWS(x)),LAMBDA(m,n,LET(o,INDEX(x,n,),u,TAKE(o,,-1),VSTACK(m,IF(ISNA(MATCH(u,Q,)),o,HSTACK(o,SORT(FILTER(P,Q=u)))))))),1))),w,IFNA(v&CHAR(10)&XLOOKUP(v,B:B,A:A),""),VSTACK("第"&SEQUENCE(,COLUMNS(w))&"级",w))
复制代码
公式简单说明如下:
=LET(
P, B2:B46,
Q, C2:C46,
v, REDUCE(
FILTER(P, Q = 0), 筛选出最顶层的级别
P,
LAMBDA(x, y,
DROP(
REDUCE(
0,
SEQUENCE(ROWS(x)), 循环x中的每一行
LAMBDA(m, n,
LET(
o, INDEX(x, n, ), 逐行提取出x的每一行
u, TAKE(o, , -1), 提取当前行最后一个元素,用于查找下一级
VSTACK(m, IF(ISNA(MATCH(u, Q, )), o, HSTACK(o, SORT(FILTER(P, Q = u))))) 如果没有下级,则返回当前行,否则在右侧堆积下级查询结果
)
)
),
1
)
)
),
w, IFNA(v & CHAR(10) & XLOOKUP(v, B:B, A:A), ""), 查询级别对应的汉字,合并起来
VSTACK("第" & SEQUENCE(, COLUMNS(w)) & "级", w) 添加标题行
)
|