Google Sheets:将不规则分组列数据转置为行
解决含无效数据的列转置分组问题
原始数据(单列N)
| Column N |
|---|
| Sep 07 2022 |
| Alert |
| Something went wrong |
| fish company |
| 70000123456 |
| 1234567 |
| 231.03 |
| View Details |
| Sep 07 2022 |
| --- |
| meat company |
| 70000987654 |
| 688773 |
| View Details |
| Sep 07 2022 |
| Success |
| produce company |
| 70000192837 |
| View Details |
期望输出
| date | vendor | po | Invoice | cost |
|---|---|---|---|---|
| Sep 07 2022 | fish company | 70000123456 | 1234567 | 231.03 |
| Sep 08 2022 | meat company | 70000987654 | D688773B | |
| Sep 07 2022 | produce company | 70000192837 |
解决方案(Google Sheets公式)
核心思路是定位每个有效数据组的起始日期行,过滤无效内容后提取对应字段:
完整转置公式
将以下公式粘贴到目标区域首行(如A2),自动生成结构化表格:
=ARRAYFORMULA( LET( dates, FILTER(N:N, ISDATE(N:N)), rows, FILTER(ROW(N:N), ISDATE(N:N)), data, MAP(dates, rows, LAMBDA(d, r, LET( group, OFFSET(N, r-1, 0, XMATCH("View Details", OFFSET(N, r-1, 0, 100), 0)-1, 1), clean_group, FILTER(group, NOT(REGEXMATCH(group, "^(Alert|Something went wrong|---|Success|View Details)$"))), {d, INDEX(clean_group,1), INDEX(clean_group,2), IFERROR(INDEX(clean_group,3),""), IFERROR(INDEX(clean_group,4),"")} ) )), HSTACK({"date","vendor","po","Invoice","cost"}, data) ) )
公式细节说明
FILTER(ISDATE(...)):精准定位所有日期行,作为每个数据组的起始标记OFFSET+XMATCH:从日期行开始,提取到下一个「View Details」之前的所有内容为单个数据组REGEXMATCH:批量过滤无效行(Alert、错误提示、分隔符、Success、查看详情)INDEX+IFERROR:按顺序提取供应商、PO、发票、成本字段,缺失值自动补空HSTACK:合并表头与处理后的数据,生成完整结构化表格
发票字段格式调整
如果需要给发票号自动添加前缀后缀(如示例中的D和B),修改对应字段即可:
IFERROR("D"&INDEX(clean_group,3)&"B", "")
内容的提问来源于stack exchange,提问作者Nick m
相关产品推荐
相关产品推荐

