自用的二维表转一维表的通用公式
=LET(hqy,A4:C9,lqy,D1:G3,sjqy,D4:G9,
lb,LAMBDA(a,b,IF(b="h",TRANSPOSE(SCAN("",TRANSPOSE(a),LAMBDA(x,y,IF(y="",x,y)))),SCAN("",a,LAMBDA(x,y,IF(y="",x,y))))),
hhb,MAKEARRAY(ROWS(lb(hqy,"h")),1,LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(hqy,"h"),r,SEQUENCE(1,COLUMNS(lb(hqy,"h"))))))),
lhb,MAKEARRAY(1,COLUMNS(lb(lqy,"l")),LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(lqy,"l"),SEQUENCE(1,ROWS(lb(lqy,"l"))),c)))),
eb,TEXTSPLIT(TEXTJOIN("|",0,hhb&"@"&lhb&"@"&sjqy),"@","|"),
sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+")),
HSTACK(sb(1),sb(2),CHOOSECOLS(eb,3)))
使用:只需要修改第一行标注红颜色的三个区域,分别是行标签区域、列标签区域以及值区域
公式解释:
lb,LAMBDA(a,b,IF(b="h",TRANSPOSE(SCAN("",TRANSPOSE(a),LAMBDA(x,y,IF(y="",x,y)))),SCAN("",a,LAMBDA(x,y,IF(y="",x,y)))))
第一步定义了填充合并单元格的函数,许多二维表的行列标签有合并单元格,例如下图
hhb,MAKEARRAY(ROWS(lb(hqy,"h")),1,LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(hqy,"h"),r,SEQUENCE(1,COLUMNS(lb(hqy,"h")))))))
把所有行标签合并成一列,如下图:
lhb,MAKEARRAY(1,COLUMNS(lb(lqy,"l")),LAMBDA(r,c,TEXTJOIN("-",TRUE,INDEX(lb(lqy,"l"),SEQUENCE(1,ROWS(lb(lqy,"l"))),c))))
把所有列标签合并成一行,如下图:
4、eb,TEXTSPLIT(TEXTJOIN("|",0,hhb&"@"&lhb&"@"&sjqy),"@","|"),
sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+"))
把第2步和第3步的结果以及二维表的值拼接转换为一维表,如下图:
5、sb,LAMBDA(x,TEXTSPLIT(TEXTJOIN("+",,CHOOSECOLS(eb,x)),"-","+"))
定义了一个拆分函数,用于拆分第4步形成的一维表的第一列和第二列,如下图:
6、HSTACK(sb(1),sb(2),CHOOSECOLS(eb,3))
运用第5步定义的函数拆分第4步形成的数组的第一列和第二列,然后把所有拆分结果和第4步形成的数组的第三列横向拼接,就生成了最终的一维表,如下图:
这是我学习函数以来第一次发帖,deepseek给了我很大的帮助,公式中肯定有许多可以继续改进的,大家有好的改进建议我会及时修改公式,谢谢大家的阅读。
创作者俱乐部成员