Google Sheets:按空白单元格拆分转置数据并添加N个空列
解决方案(Google Sheets)
假设你的原始数据在A列,需要添加的空列数N=2,按以下步骤操作:
1. 生成分组标记
给每个非空行分配组号(连续非空行属于同一组,不管中间空行数量),在B1单元格输入:
=SCAN(1, A:A, LAMBDA(current_group, cell, IF(cell="", current_group, IF(OFFSET(cell, -1, 0)="", current_group+1, current_group) ) ))
这个公式会自动给每组连续非空行分配唯一组号,空行继承上一行的组号。
2. 合并每组数据
用GROUPBY把同一组的内容合并成单个单元格(用|作为分隔符),在C1单元格输入:
=GROUPBY(B:B, A:A, LAMBDA(values, TEXTJOIN("|", TRUE, values)), 0)
执行后,C列每个单元格对应一组数据,组内内容用|分隔。
3. 拆分、转置并添加空列
用REDUCE迭代处理每个分组,转置后拼接N个空列,在D1单元格输入:
=LET( groups, C:C, group_count, COUNTA(groups), N, 2, // 此处可修改空列数量 REDUCE("", SEQUENCE(group_count), LAMBDA(result, idx, HSTACK( result, TRANSPOSE(SPLIT(INDEX(groups, idx), "|")), IFERROR(SEQUENCE(ROWS(SPLIT(INDEX(groups, idx), "|")), N)/0, "") ) )) )
公式说明:
REDUCE:逐个处理每个分组,逐步构建最终结果TRANSPOSE(SPLIT(...)):把每组的竖排数据转置为横排IFERROR(SEQUENCE(...)/0, ""):生成对应行数的N个空列(除以0得到错误,用IFERROR转为空值)
简化版一步公式
如果不想分步操作,可直接使用整合后的公式(原数据在A列,N=2):
=LET( data, A:A, group_ids, SCAN(1, data, LAMBDA(g, c, IF(c="", g, IF(OFFSET(c,-1,0)="", g+1, g)))), groups, GROUPBY(group_ids, data, LAMBDA(v, TEXTJOIN("|", TRUE, v)), 0), N, 2, REDUCE("", SEQUENCE(COUNTA(groups)), LAMBDA(acc, i, HSTACK(acc, TRANSPOSE(SPLIT(INDEX(groups,i), "|")), IFERROR(SEQUENCE(ROWS(SPLIT(INDEX(groups,i), "|")), N)/0, "")) )) )
注意事项:
- 若数据从A2开始(A1为表头),需将公式中的范围改为
A2:A,并调整SCAN的初始判断逻辑 - 若
GROUPBY函数不可用(旧版Google Sheets),可用QUERY替代分组步骤:=QUERY( {group_ids, data}, "select Col1, TEXTJOIN('|', true, Col2) where Col2<>'' group by Col1", 0 )
内容的提问来源于stack exchange,提问作者emed2022
相关产品推荐
相关产品推荐

