重新格式化 google sheet 中的长范围数据

reformat long range of data in google sheet

我有一些数据行和列,如下例所示: Current Format

我想在另一个sheet中拉取数据如下:Desire Format

我尝试了查询、拆分和转置的组合,但没有得到我想要的结果。这可能吗?

Link 点差sheet: https://docs.google.com/spreadsheets/u/0/d/1ct7HLdvgkY0tYaiUyduhehyci7Dt7p_ajNCKcJandS0/htmlview

按照我下面的屏幕截图在第 4 行试试这个:

=arrayformula(query(iferror(array_constrain({vlookup({flatten(split(row(E4:E)&rept(","&0,len(H4:H)-len(regexreplace(H4:H,",",""))),","))},{row(E4:E),A4:D},{2,3,4,5},false),flatten(split(E4:E,",")),flatten(split(F4:F,",")),flatten(split(G4:G,",")),flatten(split(H4:H,",")),flatten(split(I4:I,",")),vlookup({flatten(split(rept(0&",",len(H4:H)-len(regexreplace(H4:H,",","")))&row(E4:E),","))},{row(E4:E),E4:J},7,false)},max(if(F4:F<>"",len(F4:F)-len(regexreplace(F4:F,",",""))+1,))*counta(F4:F),10),),"where Col6 is not null",0))

它由 3 个部分组成:

前 4 列:

=arrayformula(iferror(vlookup({flatten(split(row(E4:E)&rept(","&0,len(H4:H)-len(regexreplace(H4:H,",",""))),","))},{row(E4:E),A4:D},{2,3,4,5},false),))

中间5列:

=arrayformula(array_constrain({flatten(split(E4:E,",")),flatten(split(F4:F,",")),flatten(split(G4:G,",")),flatten(split(H4:H,",")),flatten(split(I4:I,","))},max(if(F4:F<>"",len(F4:F)-len(regexreplace(F4:F,",",""))+1,))*counta(F4:F),6))

末尾总计栏:

=arrayformula(iferror(vlookup({flatten(split(rept(0&",",len(H4:H)-len(regexreplace(H4:H,",","")))&row(E4:E),","))},{row(E4:E),E4:J},7,false),))

假设:

当 E、F、G、H、I 列中有逗号分隔的项目时,同一行的单元格中的项目数量相同。不同行的数量可能不同。该示例将第 4 行到第 7 行显示为 3、2、3、4 项。

您的 GrandTotal 数字已经计算出来。

如果这有帮助,请考虑 https://whosebug.com/help/someone-answers :-)

我在您的样本传播中添加了两个 sheets(“Sheet1B”和“Erik Help”)sheet。

'Sheet1B' 只是 'Sheet1' 的 cleaned-up 版本。此 sheet 反映了 real-world 布局。因此,我在 'Erik Help' 中的公式引用 'Sheet1B' 而不是 'Sheet1."

'Erik Help'中有一个公式!A1:

=ArrayFormula({Sheet1B!A1:J1; QUERY(SPLIT(FLATTEN(FILTER(SUBSTITUTE(SPLIT(SUBSTITUTE(Sheet1B!A2:A & "|" & Sheet1B!B2:B & "|" & Sheet1B!C2:C & "|" & Sheet1B!D2:D,",","~") & REPT(",|||",LEN(Sheet1B!E2:E)-LEN(SUBSTITUTE(Sheet1B!E2:E,",",""))),",",1,0),"~",",") & "|" & SPLIT(Sheet1B!E2:E,",") & "|" & SPLIT(Sheet1B!F2:F,",") & "|" & SPLIT(Sheet1B!G2:G,",") & "|" & SPLIT(Sheet1B!H2:H,",") & "|" & SPLIT(Sheet1B!I2:I,",") & "|" & SPLIT(REPT(",",LEN(Sheet1B!E2:E)-LEN(SUBSTITUTE(Sheet1B!E2:E,",",""))) & Sheet1B!J2:J,",",1,0),Sheet1B!A2:A<>"")),"|",1,0),"Select * WHERE Col5 Is Not Null")})

这个公式生成所有 headers 和看到的结果,并将扩展以包含新的数据行。

如您所见,我强烈建议将公式放在它自己的 sheet 中,而不是放在与原始数据相同的 sheet 中。但是,如果一定要放在与原始数据相同的sheet,请不要将其放在原始数据下方,因为这样会抑制原始数据范围的能力自然生长。把它放在右边。在这种情况下,给定 'Sheet1' 的当前布局(假设您删除了第 7 行以下的所有数据,公式将如下所示:

=ArrayFormula({A3:J3; QUERY(SPLIT(FLATTEN(FILTER(SUBSTITUTE(SPLIT(SUBSTITUTE(A4:A & "|" & B4:B & "|" & C4:C & "|" & D4:D,",","~") & REPT(",|||",LEN(E4:E)-LEN(SUBSTITUTE(E4:E,",",""))),",",1,0),"~",",") & "|" & SPLIT(E4:E,",") & "|" & SPLIT(F4:F,",") & "|" & SPLIT(G4:G,",") & "|" & SPLIT(H4:H,",") & "|" & SPLIT(I4:I,",") & "|" & SPLIT(REPT(",",LEN(E4:E)-LEN(SUBSTITUTE(E4:E,",",""))) & J4:J,",",1,0),A4:A<>"")),"|",1,0),"Select * WHERE Col5 Is Not Null")})