如何使用ARRAYFORMULA生成稀疏层级表格的完整层级路径列
问题原因
你现有代码的核心问题是FRUIT列的填充逻辑是全局查找最近的非空值,没有和SEASON分组绑定,新SEASON出现时不会自动清空之前缓存的FRUIT值,因此会把上一个季节的FRUIT带到新季节的路径中。
可用实现代码
假设你的三列分别对应命名范围SEASON、FRUIT、LETTER,可以用以下公式实现需求:
=ARRAYFORMULA( IF(SEASON="",, // 填充当前行对应的SEASON值 IFERROR(VLOOKUP(ROW(SEASON), IF(SEASON<>"", {ROW(SEASON), SEASON}), 2, 1), "") & "/" & // 填充当前行对应SEASON分组内的FRUIT值,新SEASON出现时自动重置为空 SCAN("", ROW(SEASON), LAMBDA(acc, r, LET(idx, r-ROW(SEASON)+1, IF(INDEX(SEASON, idx)<>"", "", IF(INDEX(FRUIT, idx)<>"", INDEX(FRUIT, idx), acc) ) ) )) & "/" & LETTER ) )
如果你的数据是放在普通列范围(比如SEASON在A2:A,FRUIT在B2:B,LETTER在C2:C,表头在第一行),可以用更简化的写法:
=ARRAYFORMULA( IF(A2:A="",, IFERROR(VLOOKUP(ROW(A2:A), IF(A2:A<>"", {ROW(A2:A), A2:A}), 2, 1), "") & "/" & SCAN("", ROW(A2:A), LAMBDA(acc, r, IF(INDEX(A:A,r)<>"", "", IF(INDEX(B:B,r)<>"", INDEX(B:B,r), acc)) )) & "/" & C2:C ) )
逻辑说明
- SEASON的填充逻辑和你原有实现一致,通过全局向上查找最近的非空SEASON值补全空单元格。
- FRUIT的填充逻辑做了分组适配:用
SCAN函数遍历每行,只要当前行的SEASON有值(说明进入新的季节分组),就立刻把FRUIT的缓存值重置为空;如果当前行FRUIT有值就更新缓存,否则沿用当前分组内最近的非空FRUIT值,完全避免跨季节的FRUIT值泄漏。 - 最后直接拼接三部分值,就得到你需要的路径格式。
内容的提问来源于stack exchange,提问作者Alexander Gladysh
相关产品推荐
相关产品推荐

