Google Sheets中使用TOCOL函数或模拟数据透视表实现数据转换的方法咨询
Google Sheets中使用TOCOL函数或模拟数据透视表实现数据转换的方法咨询
嘿,我完全懂你现在的困扰!不能用数据透视表,普通查找函数又只能盯着第一列搜,Child2、Child3直接报错,确实头疼。不过咱们可以用Google Sheets里的数组函数完美解决这个问题,不用复杂操作,直接把多列子项转换成和父项一一配对的结构~
方法一:用TOCOL函数(适合新版Google Sheets)
假设你的原始数据是这样的:
| Parent Name | Child 1 | Child 2 | Child 3 |
|---|---|---|---|
| Bob | Steve | John | Cody |
你可以直接在空白单元格输入这个公式(这里假设数据从A1开始,A列是Parent Name,B-D列是子项):
=ARRAYFORMULA( QUERY( { TOCOL(IF(B2:D<>"", A2:A, ), 3), TOCOL(B2:D, 3) }, "SELECT * WHERE Col2 IS NOT NULL" ) )
简单给你拆解下逻辑:
TOCOL(B2:D, 3)会把B到D列的所有子项直接转成一列,自动跳过空值TOCOL(IF(B2:D<>"", A2:A, ), 3)会跟着子项的数量,把对应的父项重复生成,只有子项不为空的时候才保留父项- 最后用
QUERY过滤掉可能存在的空行,确保结果干净
运行后直接就能得到你想要的结果:
| Parent | Child |
|---|---|
| Bob | Steve |
| Bob | John |
| Bob | Cody |
方法二:兼容旧版Google Sheets的替代公式(没有TOCOL函数时用)
如果你的Google Sheets版本比较旧,没有TOCOL函数,咱们可以用SEQUENCE和INDEX来模拟这个效果,公式稍微长一点,但逻辑一样:
=ARRAYFORMULA( QUERY( { VLOOKUP(SEQUENCE(ROWS(A2:A)*COLUMNS(B2:D), 1, 0, 1)/COLUMNS(B2:D)+1, {ROW(A2:A), A2:A}, 2, 1), INDEX(B2:D, MOD(SEQUENCE(ROWS(A2:A)*COLUMNS(B2:D), 1, 0), COLUMNS(B2:D))+1, SEQUENCE(ROWS(A2:A)*COLUMNS(B2:D), 1, 0, 1)/COLUMNS(B2:D)+1) }, "SELECT * WHERE Col2 IS NOT NULL" ) )
这个公式的核心是通过生成序列,逐个遍历每一个子项,然后精准匹配对应的父项,一样能输出你要的两行结构,不用担心空值或者匹配错误的问题。
额外提示
如果你的数据有多个父行(比如不止Bob一个),这两个公式也能自动适配,直接把所有父项和对应的子项一一配对,完全不用手动复制粘贴,比lookup靠谱多啦~
备注:内容来源于stack exchange,提问作者Tyler Schaffer
相关产品推荐
相关产品推荐

