我如何 1:将水平的数据线提取到带有标题的垂直范围内。 2:所述数据的垂直范围,只显示选中的项目
How do I 1: Extract horizontal lines of data into vertical range with headings. 2: Vertical range of said data, show only selected items
我有一个电子表格,我想根据需要向其中添加数据,并根据需要动态显示它的公式。
在整个过程中,我将参考包含我的问题示例的电子表格:https://docs.google.com/spreadsheets/d/1maHGRearacPc4TOqiMShvjdP0oskOVMXb_X9mD9Cc6k/edit?usp=sharing
电子表格是完全可编辑的。所以请随意将您的解决方案放入(尽管可能制作重复页面以便其他人展示他们自己的解决方案)
问题 1:在“动态数据”选项卡中,我有一列包含未知数量的组 (A2:A) 的名称。然后在每个组名的右边是它的数据(B2:E)。
我想将每一行转置为一个垂直列,在每个标题旁边添加文本。
在示例中,F2 具有我希望添加的符号,G2 具有我放置公式的位置,G2:G14 具有我期望的结果。
备注:
- 虽然“动态数据”中目前有 3 个组 (A2:A4),但我的想法是我应该能够根据需要添加组。
- 在示例中,数据 (B2:E) 上升到 E 列,但实际上数据会使用更多的列。
更新:额外(可选):在 G2 中创建数组时将跳过任何空组,例如“第 4 组”。
问题 2:在下一个选项卡“提取所选数据”中,我希望能够 select 特定数据 (B2:B),并且有另一个显示该数据的垂直范围,除以组标题 (F2:F)。此范围将跳过任何没有数据 selected 的组。 (即 E、F 和 G 都没有 selected,所以第 2 组没有出现)
Extra (optional): B2:B 有数据验证,如果可能的话,我想只能 select "non-titles"(即 A、B、C、D、E...),但在数据验证列表中仍然可见。
已更新(第 2 号)问题 3:如果可能的话,拥有仅提供包含数据 selected 的组标题的代码也很棒.这也意味着我可以创建自己的解决方案来显示我需要的数据。
问题一:
假设数据从Column B
开始
=ArrayFormula(QUERY(FLATTEN(QUERY({F2&A2:A,B2:E},"select * where Col2 is not null",0)),"select Col1 where Col1 is not null",0))
问题二:
我认为这可以通过更简单的正则表达式甚至只使用正则表达式来完成。
=TRANSPOSE(SPLIT(REGEXREPLACE(JOIN("♦",QUERY(A2:A,CONCATENATE("select A where A contains '------' or A='",TEXTJOIN("' or A='",TRUE,B2:B),"'"),0)),"(-----[^♦]+♦)(-|$)|(-----[^♦]+$)",),"♦"))
额外:
不能同时设置值列表和用公式限制输入。
您可以考虑使用 onEdit
来拒绝输入。
标题:
=ArrayFormula(REGEXREPLACE(QUERY(TRANSPOSE(SPLIT(JOIN("♦",FILTER(A2:A,A2:A<>"")),"------ ",FALSE)),CONCATENATE("select Col1 where Col1 contains '♦",TEXTJOIN("' or Col1 contains '",TRUE,B2:B),"'"),0),"♦.+$",))
=TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN("♦",TRUE,A2:A)&"♦",CONCATENATE("------ ([^♦]+♦)(([^-♦]+♦)*)((",TEXTJOIN("|",TRUE,B2:B),")♦)(([^-♦]+♦)*)|------ ([^♦]+)♦(([^-♦]+♦)+)"),""),"♦"))
尝试:
=INDEX(QUERY(FLATTEN({IF(TRIM(FLATTEN(QUERY(TRANSPOSE(B2:E),,9^9)))="",,
F2&" "&A2:A), B2:E}), "where Col1<>''"))
和:
=INDEX(QUERY(FLATTEN({IF(TRIM(FLATTEN(QUERY(TRANSPOSE(IFNA(
REGEXEXTRACT('Dynamic data'!B2:E, TEXTJOIN("|", 1, B2:B)))),,
9^9)))="",,'Dynamic data'!F2&" "&'Dynamic data'!A2:A), IFNA(
REGEXEXTRACT('Dynamic data'!B2:E, TEXTJOIN("|", 1, B2:B)))}), "where Col1<>''"))
我有一个电子表格,我想根据需要向其中添加数据,并根据需要动态显示它的公式。
在整个过程中,我将参考包含我的问题示例的电子表格:https://docs.google.com/spreadsheets/d/1maHGRearacPc4TOqiMShvjdP0oskOVMXb_X9mD9Cc6k/edit?usp=sharing 电子表格是完全可编辑的。所以请随意将您的解决方案放入(尽管可能制作重复页面以便其他人展示他们自己的解决方案)
问题 1:在“动态数据”选项卡中,我有一列包含未知数量的组 (A2:A) 的名称。然后在每个组名的右边是它的数据(B2:E)。 我想将每一行转置为一个垂直列,在每个标题旁边添加文本。 在示例中,F2 具有我希望添加的符号,G2 具有我放置公式的位置,G2:G14 具有我期望的结果。
备注:
- 虽然“动态数据”中目前有 3 个组 (A2:A4),但我的想法是我应该能够根据需要添加组。
- 在示例中,数据 (B2:E) 上升到 E 列,但实际上数据会使用更多的列。
更新:额外(可选):在 G2 中创建数组时将跳过任何空组,例如“第 4 组”。
问题 2:在下一个选项卡“提取所选数据”中,我希望能够 select 特定数据 (B2:B),并且有另一个显示该数据的垂直范围,除以组标题 (F2:F)。此范围将跳过任何没有数据 selected 的组。 (即 E、F 和 G 都没有 selected,所以第 2 组没有出现)
Extra (optional): B2:B 有数据验证,如果可能的话,我想只能 select "non-titles"(即 A、B、C、D、E...),但在数据验证列表中仍然可见。
已更新(第 2 号)问题 3:如果可能的话,拥有仅提供包含数据 selected 的组标题的代码也很棒.这也意味着我可以创建自己的解决方案来显示我需要的数据。
问题一:
假设数据从Column B
=ArrayFormula(QUERY(FLATTEN(QUERY({F2&A2:A,B2:E},"select * where Col2 is not null",0)),"select Col1 where Col1 is not null",0))
问题二: 我认为这可以通过更简单的正则表达式甚至只使用正则表达式来完成。
=TRANSPOSE(SPLIT(REGEXREPLACE(JOIN("♦",QUERY(A2:A,CONCATENATE("select A where A contains '------' or A='",TEXTJOIN("' or A='",TRUE,B2:B),"'"),0)),"(-----[^♦]+♦)(-|$)|(-----[^♦]+$)",),"♦"))
额外:
不能同时设置值列表和用公式限制输入。
您可以考虑使用 onEdit
来拒绝输入。
标题:
=ArrayFormula(REGEXREPLACE(QUERY(TRANSPOSE(SPLIT(JOIN("♦",FILTER(A2:A,A2:A<>"")),"------ ",FALSE)),CONCATENATE("select Col1 where Col1 contains '♦",TEXTJOIN("' or Col1 contains '",TRUE,B2:B),"'"),0),"♦.+$",))
=TRANSPOSE(SPLIT(REGEXREPLACE(TEXTJOIN("♦",TRUE,A2:A)&"♦",CONCATENATE("------ ([^♦]+♦)(([^-♦]+♦)*)((",TEXTJOIN("|",TRUE,B2:B),")♦)(([^-♦]+♦)*)|------ ([^♦]+)♦(([^-♦]+♦)+)"),""),"♦"))
尝试:
=INDEX(QUERY(FLATTEN({IF(TRIM(FLATTEN(QUERY(TRANSPOSE(B2:E),,9^9)))="",,
F2&" "&A2:A), B2:E}), "where Col1<>''"))
和:
=INDEX(QUERY(FLATTEN({IF(TRIM(FLATTEN(QUERY(TRANSPOSE(IFNA(
REGEXEXTRACT('Dynamic data'!B2:E, TEXTJOIN("|", 1, B2:B)))),,
9^9)))="",,'Dynamic data'!F2&" "&'Dynamic data'!A2:A), IFNA(
REGEXEXTRACT('Dynamic data'!B2:E, TEXTJOIN("|", 1, B2:B)))}), "where Col1<>''"))