如何用递归Google Sheets函数将内联标签转换为列?
解决Google表格项目标签行向下填充并重构表格的问题
假设你的原始数据位于A:C列(表头为Projects、Dollars、Hours),可以使用以下公式直接生成目标结构的表格:
=LET( data, A2:C, project_rows, INDEX(data,,1), project_names, IF(LEFT(project_rows,8)="Project: ", TRIM(RIGHT(project_rows, LEN(project_rows)-8)), ""), current_project, SCAN("", project_names, LAMBDA(acc, val, IF(val<>"", val, acc))), task_rows, FILTER(data, project_names=""), tasks, INDEX(task_rows,,1), dollars, INDEX(task_rows,,2), hours, INDEX(task_rows,,3), filtered_projects, FILTER(current_project, project_names=""), HSTACK(filtered_projects, tasks, dollars, hours) )
公式拆解
- 提取项目名称:通过
LEFT判断行首是否为Project:,是则截取并去除空格得到项目名,否则留空。 - 持续沿用项目名:核心用
SCAN函数遍历所有行,遇到新的项目名就更新当前值,没有新项目时保持上一个项目名,实现自动向下填充。 - 筛选任务行并重组:用
FILTER剔除项目标签行,只保留任务数据,再通过HSTACK将项目名、任务、金额、工时组合成目标表格。
自定义调整
如果你的数据范围不是A2:C,修改公式中data变量对应的单元格范围即可。需要包含表头的话,可在公式最外层添加表头数组:
={"Project","Task","Dollars","Hours"; LET( data, A2:C, project_rows, INDEX(data,,1), project_names, IF(LEFT(project_rows,8)="Project: ", TRIM(RIGHT(project_rows, LEN(project_rows)-8)), ""), current_project, SCAN("", project_names, LAMBDA(acc, val, IF(val<>"", val, acc))), task_rows, FILTER(data, project_names=""), tasks, INDEX(task_rows,,1), dollars, INDEX(task_rows,,2), hours, INDEX(task_rows,,3), filtered_projects, FILTER(current_project, project_names=""), HSTACK(filtered_projects, tasks, dollars, hours) )}
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

