有没有办法使用 google 工作表查询在输出中插入空白列?
Is there a way to insert blank columns in output with google sheets query?
考虑工作表 2
中的查询 运行
=query(Sheet!A7:A, "Select A,B,C where A='Order'")
但我想把它放在 Sheet2 的 A、E、F 列中。
我找到了解决方法
=query(Sheet!A7:A, "Select A,X,Y,Z,B,C where A='Order'")
其中 XYZ 是范围末尾的空白列。这看起来很笨重。
到目前为止,在 Google 文档和 google 产品论坛上搜索查询语法都没有结果。
将空列作为查询中的文字 - 虽然不能真正为空,但必须包含这样的 space
=query(Sheet!A7:C, "Select A,' ',' ',' ',B,C where A='Order'")
我尝试了 ttarchala's response 的一个版本,只是给每个空白栏我想要一个不同的 "signature",如果你愿意的话:
=query(Sheet!A7:C, "Select A,' ',' ',' ',B,C where A='Order'")
注意引号中的 1、2 和 3 space。
这有点奏效了。它给了我 A 列,然后是三个空白列,然后是 B 和 C。但是,它给了我一个 header 行(在我的示例中我不想要),并且在空白列中 header我得到了:
| " "() | " "() | " "() |
这很奇怪,但可以理解。我将公式隐藏了一行,并合并了 A 到 C 的单元格。这给我留下了一个漂亮的空白单元格。我利用了 query() 的输出无法在合并的单元格中显示这一事实。
这当然是一个非常具体的解决方案 - 我的输出上方有一个空行,我可以为此目的使用和滥用它。但我想我还是要提一下,以防万一它为更好的想法提供了方向。
更新
添加:
... LABEL ' ' '', ' ' '', ' ' ''
.. 到查询末尾,将添加的那些奇数 header 归零,并消除对该额外行的需要。这告诉查询“ ”(一个 space)的标签应该什么都不是,“ ”(两个 spaces)什么也不是,等等。这导致 no header行.
如果你需要默认值,比如在我的例子中是 0,你可以这样做:
=query(Sheet!A7:C, "Select A,0,1-1,2-2,B,C where A='Order'")
虽然我检查的答案确实是我原来问题的最佳答案,但我遇到了问题:
要求跳过的列为空白。没有现成的方法来使用单个查询来填充间歇性列。如果我在其中放入任何东西,查询就会中断,并拒绝覆盖该单元格。
添加到该查询的其他弱点:
- 复杂的语法。
- 引用内部和外部电子表格的语法不同
- 无法在 select 语句中使用范围名称
- 对源结构中的更改很敏感 -- 添加列并且查询不会调整。
- 依赖于任何 源字段以频繁计算整个结果。
我最终使用相同的条件将我的查询转换为 4 个过滤语句。
- 对于我想要结果的每一列,我都定义了一个命名范围。
- 对于每个过滤器,我根据命名范围定义了我的标准和来源。
例如
=filter(COcode,COcount > 0,isNumber(COcount))
=filter(COcount,COcount > 0,isNumber(COcount))
每个过滤器的双重标准是由于工作表认为 "foo" > 0。这不是我直觉上显而易见的东西。
如果确实需要空列,则需要在这些空白列中插入空值而不是空格。例如,在为 CSV 文件创建数据以导入其他系统时,这可能非常重要。
不是直接查询数据单元格,而是可以使用大括号从单元格构建数据集,然后对其进行查询。让我们逐步构建它。
您想要在两个范围之间插入三个空白列。这些范围可以这样写。
={Sheet!A7:A, Sheet!B7:C}
您不能只在这些范围之间插入 ""
,因为那只会是一行数据,而且行数必须与源数据中的行数匹配。
LEFT
函数的一个小技巧可用于为每一行创建一个空白单元格。 LEFT
函数可以取 0 到 return 的字符数,这将 return 一个空字符串,无论它给出什么数据。可以使用源数据中的任何范围。我将使用 A7:A
。当整个内容都包含在 ARRAYFORMULA
中时,它将对每一行进行评估。可以为每个需要的空白列重复该操作。具有三个空列的数据集如下所示。
=ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:A, 0), LEFT(Sheet!A7:A, 0), LEFT(Sheet!A7:A, 0), Sheet!B7:C})
有一些方法可以缩短这个时间。一种方法是在单个 LEFT
函数中创建另一个数据集。该函数可以处理数组,并将 return 多列空字符串。这只是短了一点。
=ARRAYFORMULA({Sheet!A7:A, LEFT({Sheet!A7:A, Sheet!A7:A, Sheet!A7:A}, 0), Sheet!B7:C})
如果需要大量空白列,则向范围内的每个单元格添加一些字符,重复它,然后将其拆分为基于该字符的列可能会更短。更改空白列的数量与更改重复次数一样简单。不过,它确实取决于选择一个不在数据中的字符,否则它会中断。这是一个包含九个空白列的示例,它的长度不超过空白列的数量。
=ARRAYFORMULA({Sheet!A7:A, LEFT(SPLIT(REPT(Sheet!A7:A&"~",9),"~"), 0), Sheet!B7:C})
由于源数据有三列,需要三个空白列,所以可以通过引用源中更大的范围来缩短最多。每列仍将输出空字符串。尽管此版本要短得多,但它取决于源数据是否包含足够多的列。
=ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:C, 0), Sheet!B7:C})
现在查询那个数据集。它们不是通过单元格引用来引用数据,而是按 Col1
、Col2
等顺序引用。这是使用引用数据的最短版本的全部内容。
=QUERY(ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:C, 0), Sheet!B7:C}), "Select * where Col1='Order'", 0)
如果您希望在查询结果的列中获得真正的空白值,而不是空格,您可以先构建一个包含一列空白值的数组,然后查询该数组而不是查询直接在原始数据上。为了实现这一点,原始数据不需要包含一列空白值。您可以结合使用 ARRAYFORMULA 和 IFERROR 函数在公式中定义此类列。
诀窍是 IFERROR 可用于通过定义除以零的公式强制为空值。除非另有定义,否则 return 值将为空白。
=IFERROR(0/0)
然而,这只会 return 单个单元格值,因此要创建一整列空白值,ARRAYFORMULA 函数会发挥作用。上面公式中的顶部零必须用范围替换。以原始 posts 数据为例,它看起来像这样。
=ARRAYFORMULA(IFERROR(Sheet!A7:A/0))
假设与 A 列一样,在源数据中,B 列和 C 列中的信息从第 7 行开始,可以按如下方式构建数组。
=ARRAYFORMULA({Sheet!A7:A,Sheet!B7:B,Sheet!C7:C,IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0)})
此数组包含 Col1、Col2 和 Col3 中 A、B 和 C 列的源数据,Col4、Col5 和 Col6 由空白值组成。现在可以按如下方式查询此数组以创建开头 post.
中指定的所需结果
=QUERY(ARRAYFORMULA({Sheet!A7:A,Sheet!B7:B,Sheet!C7:C,IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0)}), "SELECT Col1,Col4,Col5,Col6,Col2,Col3 WHERE Col1='Order'")
注意列的顺序可以在查询中灵活指定。
我希望这对某人有所帮助。
Sample File
我成功了。
您可以使用一些罕见的字符创建查询输入:
=rept("", N)
然后你会得到这样的文本:
select Col1, '', '', '', Col2
从结果中替换这个字符:
=index(SUBSTITUTE(QUERY({A5:B12},D3),"",""))
其中 D3
是您的查询。
可选:使用label
去掉headers:
select Col1, '', '', '', Col2 label '' '', '' '', '' ''
考虑工作表 2
中的查询 运行=query(Sheet!A7:A, "Select A,B,C where A='Order'")
但我想把它放在 Sheet2 的 A、E、F 列中。
我找到了解决方法
=query(Sheet!A7:A, "Select A,X,Y,Z,B,C where A='Order'")
其中 XYZ 是范围末尾的空白列。这看起来很笨重。
到目前为止,在 Google 文档和 google 产品论坛上搜索查询语法都没有结果。
将空列作为查询中的文字 - 虽然不能真正为空,但必须包含这样的 space
=query(Sheet!A7:C, "Select A,' ',' ',' ',B,C where A='Order'")
我尝试了 ttarchala's response 的一个版本,只是给每个空白栏我想要一个不同的 "signature",如果你愿意的话:
=query(Sheet!A7:C, "Select A,' ',' ',' ',B,C where A='Order'")
注意引号中的 1、2 和 3 space。
这有点奏效了。它给了我 A 列,然后是三个空白列,然后是 B 和 C。但是,它给了我一个 header 行(在我的示例中我不想要),并且在空白列中 header我得到了:
| " "() | " "() | " "() |
这很奇怪,但可以理解。我将公式隐藏了一行,并合并了 A 到 C 的单元格。这给我留下了一个漂亮的空白单元格。我利用了 query() 的输出无法在合并的单元格中显示这一事实。
这当然是一个非常具体的解决方案 - 我的输出上方有一个空行,我可以为此目的使用和滥用它。但我想我还是要提一下,以防万一它为更好的想法提供了方向。
更新
添加:
... LABEL ' ' '', ' ' '', ' ' ''
.. 到查询末尾,将添加的那些奇数 header 归零,并消除对该额外行的需要。这告诉查询“ ”(一个 space)的标签应该什么都不是,“ ”(两个 spaces)什么也不是,等等。这导致 no header行.
如果你需要默认值,比如在我的例子中是 0,你可以这样做:
=query(Sheet!A7:C, "Select A,0,1-1,2-2,B,C where A='Order'")
虽然我检查的答案确实是我原来问题的最佳答案,但我遇到了问题:
要求跳过的列为空白。没有现成的方法来使用单个查询来填充间歇性列。如果我在其中放入任何东西,查询就会中断,并拒绝覆盖该单元格。
添加到该查询的其他弱点:
- 复杂的语法。
- 引用内部和外部电子表格的语法不同
- 无法在 select 语句中使用范围名称
- 对源结构中的更改很敏感 -- 添加列并且查询不会调整。
- 依赖于任何 源字段以频繁计算整个结果。
我最终使用相同的条件将我的查询转换为 4 个过滤语句。
- 对于我想要结果的每一列,我都定义了一个命名范围。
- 对于每个过滤器,我根据命名范围定义了我的标准和来源。
例如
=filter(COcode,COcount > 0,isNumber(COcount))
=filter(COcount,COcount > 0,isNumber(COcount))
每个过滤器的双重标准是由于工作表认为 "foo" > 0。这不是我直觉上显而易见的东西。
如果确实需要空列,则需要在这些空白列中插入空值而不是空格。例如,在为 CSV 文件创建数据以导入其他系统时,这可能非常重要。
不是直接查询数据单元格,而是可以使用大括号从单元格构建数据集,然后对其进行查询。让我们逐步构建它。
您想要在两个范围之间插入三个空白列。这些范围可以这样写。
={Sheet!A7:A, Sheet!B7:C}
您不能只在这些范围之间插入 ""
,因为那只会是一行数据,而且行数必须与源数据中的行数匹配。
LEFT
函数的一个小技巧可用于为每一行创建一个空白单元格。 LEFT
函数可以取 0 到 return 的字符数,这将 return 一个空字符串,无论它给出什么数据。可以使用源数据中的任何范围。我将使用 A7:A
。当整个内容都包含在 ARRAYFORMULA
中时,它将对每一行进行评估。可以为每个需要的空白列重复该操作。具有三个空列的数据集如下所示。
=ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:A, 0), LEFT(Sheet!A7:A, 0), LEFT(Sheet!A7:A, 0), Sheet!B7:C})
有一些方法可以缩短这个时间。一种方法是在单个 LEFT
函数中创建另一个数据集。该函数可以处理数组,并将 return 多列空字符串。这只是短了一点。
=ARRAYFORMULA({Sheet!A7:A, LEFT({Sheet!A7:A, Sheet!A7:A, Sheet!A7:A}, 0), Sheet!B7:C})
如果需要大量空白列,则向范围内的每个单元格添加一些字符,重复它,然后将其拆分为基于该字符的列可能会更短。更改空白列的数量与更改重复次数一样简单。不过,它确实取决于选择一个不在数据中的字符,否则它会中断。这是一个包含九个空白列的示例,它的长度不超过空白列的数量。
=ARRAYFORMULA({Sheet!A7:A, LEFT(SPLIT(REPT(Sheet!A7:A&"~",9),"~"), 0), Sheet!B7:C})
由于源数据有三列,需要三个空白列,所以可以通过引用源中更大的范围来缩短最多。每列仍将输出空字符串。尽管此版本要短得多,但它取决于源数据是否包含足够多的列。
=ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:C, 0), Sheet!B7:C})
现在查询那个数据集。它们不是通过单元格引用来引用数据,而是按 Col1
、Col2
等顺序引用。这是使用引用数据的最短版本的全部内容。
=QUERY(ARRAYFORMULA({Sheet!A7:A, LEFT(Sheet!A7:C, 0), Sheet!B7:C}), "Select * where Col1='Order'", 0)
如果您希望在查询结果的列中获得真正的空白值,而不是空格,您可以先构建一个包含一列空白值的数组,然后查询该数组而不是查询直接在原始数据上。为了实现这一点,原始数据不需要包含一列空白值。您可以结合使用 ARRAYFORMULA 和 IFERROR 函数在公式中定义此类列。
诀窍是 IFERROR 可用于通过定义除以零的公式强制为空值。除非另有定义,否则 return 值将为空白。
=IFERROR(0/0)
然而,这只会 return 单个单元格值,因此要创建一整列空白值,ARRAYFORMULA 函数会发挥作用。上面公式中的顶部零必须用范围替换。以原始 posts 数据为例,它看起来像这样。
=ARRAYFORMULA(IFERROR(Sheet!A7:A/0))
假设与 A 列一样,在源数据中,B 列和 C 列中的信息从第 7 行开始,可以按如下方式构建数组。
=ARRAYFORMULA({Sheet!A7:A,Sheet!B7:B,Sheet!C7:C,IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0)})
此数组包含 Col1、Col2 和 Col3 中 A、B 和 C 列的源数据,Col4、Col5 和 Col6 由空白值组成。现在可以按如下方式查询此数组以创建开头 post.
中指定的所需结果=QUERY(ARRAYFORMULA({Sheet!A7:A,Sheet!B7:B,Sheet!C7:C,IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0),IFERROR(Sheet!A7:A/0)}), "SELECT Col1,Col4,Col5,Col6,Col2,Col3 WHERE Col1='Order'")
注意列的顺序可以在查询中灵活指定。
我希望这对某人有所帮助。
Sample File
我成功了。
您可以使用一些罕见的字符创建查询输入:
=rept("", N)
然后你会得到这样的文本:
select Col1, '', '', '', Col2
从结果中替换这个字符:
=index(SUBSTITUTE(QUERY({A5:B12},D3),"",""))
其中 D3
是您的查询。
可选:使用label
去掉headers:
select Col1, '', '', '', Col2 label '' '', '' '', '' ''