如何将来自 Google 表单的信息压缩成统一且易于遵循的内容?
How can I condense information coming in from Google Forms into something that is uniform and easy follow?
我目前正在努力建立一个注册,人们可以 select 他们在 Google 表格中注册的 kids/people 的数量,然后表格会接受他们到一个他们可以注册他们输入的确切号码的部分。问题是,由于 Google 表单的设置方式,放入 Google 表格中的信息到处都是。
为了补救这个问题,我创建了一个在单独的 sheet 上运行的公式,该公式采用分散的信息并对其进行压缩,以便所有信息正确排列。这是公式:
=if('RS1'!G3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{4,5,6,7},false)),
if('RS1'!K3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{8,9,10,11,12,13,14,15},false)),
if('RS1'!S3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{16,17,18,19,20,21,22,23,24,25,26,27},false)),
if('RS1'!AE3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43},false)),
if('RS1'!AU3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63},false)),
if('RS1'!BO3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87},false)),""))))))
虽然我想出的这个公式行得通,但我想知道:是否有另一种更简化的方法可以达到相同的结果?如果是这样,我将如何设置它?
这里是 link 的传播sheet 如果你们想看一看:
https://docs.google.com/spreadsheets/d/1GdzigMHAxPqcr589H5178brsBIuYgU4NVk8OBOr5pSU/edit?usp=sharing
特别是考虑到你有那个巨大的公式被拖下来并在近 1000 行中处于活动状态,我绝对可以为你浓缩东西。
G3 中的这个公式生成 G:AD 中所有行的所有结果 ...
=ArrayFormula(SPLIT(SUBSTITUTE(FILTER(TRANSPOSE(QUERY(TRANSPOSE(IF(INDIRECT("RS1!G3:CL")="","~",INDIRECT("RS1!G3:CL")&"|"))," ",COLUMNS(INDIRECT("RS1!G3:CL")))),INDIRECT("RS1!A3:A")<>""),"~",""),"|",0,1))
至于如何它是如何工作的,这很难解释,但我会给出“浓缩”版本。
简而言之,我用一个我知道你永远不会使用的字符 ("~") 替换了所有空白,并在任何 不是 空白,然后使用 QUERY 函数的一个怪癖将所有这些压缩成与该 QUERY 的实际行数一样多的“header 行”。然后我使用 SUBSTITUTE 去除波浪号(“~”)和 SPLIT 管道上剩下的东西(“|”),选择参数“在任何一组管道上作为一个整体分割”(0)和“删除创建的空白通过这个分裂过程" (1).
使公式更小的一种方法是使用 OFFSET
。请注意,它不能与它一起使用 ARRAYFORMULA
。要使用一个公式生成所有结果,您需要将其解析为字符串并使用它(请参阅 Erik 的回答)。
如果你只是想逐行显示,我认为这样更简单易懂:
=IF('RS1'!$A3<>"",
{
'RS1'!$A3:$F3,
OFFSET('RS1'!$G3, 0, 2*'RS1'!$F3*('RS1'!$F3-1), 1, 4*'RS1'!$F3)
},
""
)
最重要的部分是OFFSET
。这是所有使用的参数:
- 起始单元格是
G3
(第一个child的第一列)。
- 它没有任何垂直偏移(因此为 0)。
- 对于水平偏移,它使用
2*n*(n-1)
,其中 n
是 children 的数量(见下文)。
- 行数。只有一个。
- 列数。每个孩子有 4 列,因此
4*n
其中 n
是 children 的数量。
所以从单元格G3
来看,前4列是第一个child。如果他们有 2 个 child,则接下来的 8 个。这会达到 n-1
(因为我们从 0 开始):
%5Ctimes4)
如果我们将时间 4 分组并应用 the sum of naturals 从 1
到 n-1
的公式:
![4[1+2+3+...+(n-1)]=4\frac{(n-1)(n-1+1)}{2}=2n(n-1)](https://chart.googleapis.com/chart?cht=tx&chl=4%5B1%2B2%2B3%2B...%2B(n-1)%5D%3D4%5Cfrac%7B(n-1)(n-1%2B1)%7D%7B2%7D%3D2n(n-1))
将 n
更改为 'RS1'!$F3
,您将获得用作偏移量的内容。
现在我们只需要添加带有 OFFSET
结果的初始列 (A3:F3
) 并添加条件以防止尝试将 Fn
用作数字时出现错误。
参考资料
我可能误解了问题,但在名为 MK.Help 的选项卡上单元格 A3 中的这个公式可能就是您所需要的。
=ARRAYFORMULA(IFERROR(SPLIT(TRANSPOSE(TRIM(QUERY(TRANSPOSE('RS1'!A3:CL&CHAR(10)),,9^99))),CHAR(10)&" ",0,1)))
我目前正在努力建立一个注册,人们可以 select 他们在 Google 表格中注册的 kids/people 的数量,然后表格会接受他们到一个他们可以注册他们输入的确切号码的部分。问题是,由于 Google 表单的设置方式,放入 Google 表格中的信息到处都是。
为了补救这个问题,我创建了一个在单独的 sheet 上运行的公式,该公式采用分散的信息并对其进行压缩,以便所有信息正确排列。这是公式:
=if('RS1'!G3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{4,5,6,7},false)),
if('RS1'!K3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{8,9,10,11,12,13,14,15},false)),
if('RS1'!S3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{16,17,18,19,20,21,22,23,24,25,26,27},false)),
if('RS1'!AE3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43},false)),
if('RS1'!AU3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63},false)),
if('RS1'!BO3<>"",ARRAYFORMULA(VLOOKUP(D3,'RS1'!$D:$CL,{64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87},false)),""))))))
虽然我想出的这个公式行得通,但我想知道:是否有另一种更简化的方法可以达到相同的结果?如果是这样,我将如何设置它?
这里是 link 的传播sheet 如果你们想看一看:
https://docs.google.com/spreadsheets/d/1GdzigMHAxPqcr589H5178brsBIuYgU4NVk8OBOr5pSU/edit?usp=sharing
特别是考虑到你有那个巨大的公式被拖下来并在近 1000 行中处于活动状态,我绝对可以为你浓缩东西。
G3 中的这个公式生成 G:AD 中所有行的所有结果 ...
=ArrayFormula(SPLIT(SUBSTITUTE(FILTER(TRANSPOSE(QUERY(TRANSPOSE(IF(INDIRECT("RS1!G3:CL")="","~",INDIRECT("RS1!G3:CL")&"|"))," ",COLUMNS(INDIRECT("RS1!G3:CL")))),INDIRECT("RS1!A3:A")<>""),"~",""),"|",0,1))
至于如何它是如何工作的,这很难解释,但我会给出“浓缩”版本。
简而言之,我用一个我知道你永远不会使用的字符 ("~") 替换了所有空白,并在任何 不是 空白,然后使用 QUERY 函数的一个怪癖将所有这些压缩成与该 QUERY 的实际行数一样多的“header 行”。然后我使用 SUBSTITUTE 去除波浪号(“~”)和 SPLIT 管道上剩下的东西(“|”),选择参数“在任何一组管道上作为一个整体分割”(0)和“删除创建的空白通过这个分裂过程" (1).
使公式更小的一种方法是使用 OFFSET
。请注意,它不能与它一起使用 ARRAYFORMULA
。要使用一个公式生成所有结果,您需要将其解析为字符串并使用它(请参阅 Erik 的回答)。
如果你只是想逐行显示,我认为这样更简单易懂:
=IF('RS1'!$A3<>"",
{
'RS1'!$A3:$F3,
OFFSET('RS1'!$G3, 0, 2*'RS1'!$F3*('RS1'!$F3-1), 1, 4*'RS1'!$F3)
},
""
)
最重要的部分是OFFSET
。这是所有使用的参数:
- 起始单元格是
G3
(第一个child的第一列)。 - 它没有任何垂直偏移(因此为 0)。
- 对于水平偏移,它使用
2*n*(n-1)
,其中n
是 children 的数量(见下文)。 - 行数。只有一个。
- 列数。每个孩子有 4 列,因此
4*n
其中n
是 children 的数量。
所以从单元格G3
来看,前4列是第一个child。如果他们有 2 个 child,则接下来的 8 个。这会达到 n-1
(因为我们从 0 开始):
如果我们将时间 4 分组并应用 the sum of naturals 从 1
到 n-1
的公式:
将 n
更改为 'RS1'!$F3
,您将获得用作偏移量的内容。
现在我们只需要添加带有 OFFSET
结果的初始列 (A3:F3
) 并添加条件以防止尝试将 Fn
用作数字时出现错误。
参考资料
我可能误解了问题,但在名为 MK.Help 的选项卡上单元格 A3 中的这个公式可能就是您所需要的。
=ARRAYFORMULA(IFERROR(SPLIT(TRANSPOSE(TRIM(QUERY(TRANSPOSE('RS1'!A3:CL&CHAR(10)),,9^99))),CHAR(10)&" ",0,1)))