求助:Google Sheets中动态拆分姓名及对应数据至多列的方法
动态拆分Google Sheets中姓名与备注至多列
我在Google Sheets中有一组含「姓名」和「备注」列的数据,姓名数量会随数据增减动态变化,希望将每个姓名对应的所有备注数据拆分到独立的多列中(每列组包含姓名+备注)。之前尝试用FILTER函数,但需要预先指定姓名,无法实现动态适配,求可行方案。
原始数据
| 姓名 | 备注 |
|---|---|
| Josh | anything1 |
| Mike | anything2 |
| Peter | anything3 |
| Nicole | anything4 |
| Josh | anything5 |
| Mike | anything6 |
| Peter | anything7 |
| Nicole | anything8 |
| Josh | anything9 |
| Mike | anything10 |
| Peter | anything11 |
| Nicole | anything12 |
| Josh | anything13 |
| Mike | anything14 |
| Peter | anything15 |
| Nicole | anything16 |
| Josh | anything17 |
| Mike | anything18 |
| Peter | anything19 |
| Nicole | anything20 |
| Josh | anything21 |
| Mike | anything22 |
| Peter | anything23 |
| Nicole | anything24 |
| Josh | anything25 |
| Mike | anything26 |
| Peter | anything27 |
| Nicole | anything28 |
| Peter | anything29 |
| Nicole | anything30 |
| Peter | anything31 |
| Nicole | anything32 |
| Peter | anything33 |
| Nicole | anything34 |
| Peter | anything35 |
| Nicole | anything36 |
期望结果
| 姓名 | 备注 | 姓名 | 备注 | 姓名 | 备注 | 姓名 | 备注 |
|---|---|---|---|---|---|---|---|
| Josh | anything1 | Mike | anything2 | Peter | anything3 | Nicole | anything4 |
| Josh | anything5 | Mike | anything6 | Peter | anything7 | Nicole | anything8 |
| Josh | anything9 | Mike | anything10 | Peter | anything11 | Nicole | anything12 |
| Josh | anything13 | Mike | anything14 | Peter | anything15 | Nicole | anything16 |
| Josh | anything17 | Mike | anything18 | Peter | anything19 | Nicole | anything20 |
| Josh | anything21 | Mike | anything22 | Peter | anything23 | Nicole | anything24 |
| Josh | anything25 | Mike | anything26 | Peter | anything27 | Nicole | anything28 |
| Peter | anything29 | Nicole | anything30 | ||||
| Peter | anything31 | Nicole | anything32 | ||||
| Peter | anything33 | Nicole | anything34 | ||||
| Peter | anything35 | Nicole | anything36 |
动态解决方案
可以通过组合UNIQUE、INDEX、SEQUENCE和IFERROR等函数实现完全动态的效果,无需预先指定姓名:
一步到位数组公式
在目标区域的起始单元格(比如F1)输入以下公式(新版Google Sheets直接回车即可,旧版需按Ctrl+Shift+Enter):
=LET( unique_names, UNIQUE(A:A), name_count, COUNTA(unique_names), max_rows, MAX(COUNTIF(A:A, unique_names)), header, FLATTEN(REPT({"姓名", "备注"}, name_count)), data, REDUCE("", SEQUENCE(name_count), LAMBDA(acc, n, LET( current_name, INDEX(unique_names, n), filtered, FILTER(A:B, A:A=current_name), padded, IFERROR(VSTACK(filtered, SEQUENCE(max_rows-ROWS(filtered),2,"")), filtered), HSTACK(acc, padded) ) )), VSTACK(header, data) )
公式说明
UNIQUE(A:A):自动提取所有不重复的姓名,随数据更新同步变化MAX(COUNTIF(A:A, unique_names)):计算所有姓名中最多的记录行数,用于补全短数据的空白行FLATTEN(REPT({"姓名", "备注"}, name_count)):动态生成重复的「姓名/备注」表头组REDUCE+LAMBDA:循环处理每个唯一姓名,筛选对应数据后补全空白行,再横向拼接成目标格式VSTACK(header, data):将表头和处理好的数据纵向组合,形成最终结果
内容的提问来源于stack exchange,提问作者HSHO
相关产品推荐
相关产品推荐

