如何在Google Sheets中将多年份收入列垂直堆叠转换格式?
解决Google Sheets宽表转长表(年份列转行)的方案
针对你需要将包含项目名称、用户邮箱及15年收入的宽表转换为名称、邮箱、年份、收入的长表需求,以下是两种直接可用的公式方案:
方案1:使用ARRAYFORMULA+FLATTEN+TRANSPOSE(兼容所有Google Sheets版本)
假设你的数据结构如下:
- A列:项目名称(表头A1)
- B列:用户邮箱(表头B1)
- C-P列:Year 1到Year 15的收入(表头C1:P1)
- 数据从第2行开始(A2:P为有效数据区域)
在空白单元格(比如Q1)输入以下公式:
=ARRAYFORMULA( QUERY( { FLATTEN(A2:A), FLATTEN(B2:B), FLATTEN(TRANSPOSE(C1:P1)), FLATTEN(TRANSPOSE(C2:P)) }, "SELECT Col1, Col2, Col3, Col4 WHERE Col4 IS NOT NULL", 0 ) )
公式说明:
FLATTEN(A2:A):将项目名称列重复15次(对应每一年),生成纵向的项目名称列表FLATTEN(B2:B):同理生成纵向的用户邮箱列表,与项目名称一一对应FLATTEN(TRANSPOSE(C1:P1)):将年份表头从横向转为纵向,生成连续的年份序列FLATTEN(TRANSPOSE(C2:P)):将15年的收入数据从横向转为纵向,与年份、项目/邮箱匹配QUERY函数:过滤掉收入为空的无效行,确保数据整洁
方案2:使用LET+MAP(新版Google Sheets推荐,更灵活)
如果你的Google Sheets支持LAMBDA系列函数,可使用更易维护的公式:
=LET( nameCol, A2:A, emailCol, B2:B, yearHeaders, C1:P1, incomeData, C2:P, numYears, COLUMNS(yearHeaders), FLATTEN( MAP(nameCol, emailCol, incomeData, LAMBDA(n, e, inc, HSTACK( REPT(n&"|", numYears), REPT(e&"|", numYears), yearHeaders&"|", inc ) )) ) )
输入后,在旁边单元格用=SPLIT(上述公式输出单元格, "|")拆分,即可得到四列规整数据。
调整提示:
如果你的年份列不是C-P,只需修改公式中的C1:P1(年份表头)和C2:P(收入数据)为实际区域即可。
内容的提问来源于stack exchange,提问作者offdutyventures
相关产品推荐
相关产品推荐

