我有一个 Google 表格工作簿,可以捕获来自 Google 表单的输入。该工作簿包含两张纸:
WIDE DATA 表包含一系列九个列标题:
第一个资金请求 |资助金额 |其他详细信息 |第二次资助请求 |资助金额 |其他详细信息 |第三次资助请求 |资助金额 |其他详细信息
这些相同的九个列标题以十一个顺序重复,从
S1
到 DM1
。
TALL 数据表仅包含这九个列标题的一个序列,从
G1
到 O1
。
如上所述,九个列标题的每个序列都包含三个段:
如果宽数据表包含任何特定序列的任何特定段下方的特定行上的数据,我将使用什么公式将其展平到高数据表上相应段下方的相应行?
到目前为止,我最接近的解决方案是使用这个公式:
=ARRAYFORMULA(TRANSPOSE(FLATTEN(IF('WIDE DATA'!$S2:$DM2 <> "", 'WIDE DATA'!$S2:$DM2, ""))))
上述公式的问题在于,它返回从 WIDE DATA 到 TALL DATA 的数据序列/段,其相对位置与在 WIDE DATA 表上找到的位置相同。
目标是将如上所述的每个数据序列返回到G
到
O
列中的TALL DATAonly上的相应行。 WIDE DATA 应仅包含该表每一行上 11 个序列中的一个序列中的数据,因此不应存在重叠问题。
您可以在此处查看测试工作簿: 测试:承包商资金请求(简化)
这是您可以测试的一种可能的方法:
=reduce(tocol(,1),sequence(counta('WIDE DATA'!A2:A)),lambda(a,c,vstack(a,hstack(
chooserows('WIDE DATA'!A2:E,c),
torow(chooserows('WIDE DATA'!F2:R,c),1),
let(Σ,chooserows('WIDE DATA'!S2:DM,c),if(counta(Σ)=0,wraprows(,9,),choosecols(Σ,sequence(9,1,index(xmatch("?*",to_text(Σ),2)))))),
chooserows('WIDE DATA'!DN2:EH,c)))))