【问题标题】:How to use WHERE clause in a query when number of columns is dynamic?当列数是动态的时,如何在查询中使用 WHERE 子句?
【发布时间】:2016-08-15 19:52:45
【问题描述】:

我已经搜索过了,但似乎找不到答案:

我使用电子表格中的查询功能从工作伙伴那里收集 cmets。有 17 位评论者,我从本周和未来十周开始查询。但是,我只想要 cmets 而不是最终结果中的空字段。我快到了,但是使用我现在使用的公式,我必须手动更新查询最后一部分中的列数,因为列数会根据 cmets 的数量而变化。这是我的公式:

=transpose(query(transpose(query(QUERY(
IMPORTRANGE("1oQVZDEKLqx6ruz2yzIzUgppkWvBEOB_Eo-a4NW1WTSQ";"Comments!A1:U");
"select Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, 
Col15, Col16, Col17, Col18, Col19 where todate(Col1) > date '"&text(today()-7;
"yyyy-mm-dd")&"' limit 10");"select * where Col2<>'' or Col3<>'' or Col4<>'' or 
Col5<>'' or Col6<>'' or Col7<>'' or Col8<>'' or Col9<>'' or Col10<>'' or Col11<>'' or 
Col12<>'' or Col13<>'' or Col14<>'' or Col15<>'' or Col16<>'' or Col17<>'' or Col18<>''"));
"select * where Col2<>'' or Col3<>'' or Col4<>''"))

无论两个“最内层”查询返回多少列,有什么方法可以让这个公式起作用?

这是带有queried comments 的电子表格。它从this sheet 收集 cmets(在现实生活中,这是使用 importrange-formula 从 19 张表中收集的)。

我希望我的问题可以理解,最重要的是,我的问题可以解决!

【问题讨论】:

  • 您会按行还是按列组合多个导入范围调用?如果按行计算,列数是否始终相同?在您当前的查询中,您只检查第 18 列是否为空,而不是第 19 列,并且您没有拉第 20 和 21 列,这是故意的吗?
  • 对不起,这是一个错误,我现在已经更正了。在此示例中,有 17 位评论者加上日期(A 列)和周数(B 列)。
  • 还有评论人数,那么列数会变吗?所以你需要动态选择和过滤吗?其他问题呢
  • 如果我理解正确:这是我想要做的(包含我查询的 cmets 的电子表格中的列数是静态的):从本周的 17 位评论者中收集 cmets十周后,但只有带有 cmets 的列(查询 NO 2)。然后转置后再次查询,去掉不包含 cmets 的周数。
  • 所以最后一个在没有 cmets 的情况下摆脱几周的查询是困扰我的一个:我不知道我有多少列。

标签: google-sheets google-query-language


【解决方案1】:

此函数从具有行和列标题的范围中删除空列和行。 你可以这样称呼它:

=FILTERROWSANDCOLS(IMPORTRANGE("1oQVZDEKLqx6ruz2yzIzUgppkWvBEOB_Eo-a4NW1WTSQ";"Comments!B1:U"))

请注意,我为此排除了 A 列。

function FILTERROWSANDCOLS(input) {
  function rowIsBlank(row) {
    return row.slice(1, row.length).join("") !== "";
  }

  return input.filter(rowIsBlank).transpose().filter(rowIsBlank).transpose();
}


Object.defineProperty(Object.prototype, "transpose", {value: function(){
  var output = [];
  for (var row = 0; row < this.length; row++) {
    for (var col = 0; col < this[row].length; col++) {
      if (row === 0){
        output.push([this[row][col]]); 
      } else {
        output[col].push(this[row][col]); 
      }
    }
  }
  return output;
}});

【讨论】:

  • 哇!极好的!这正是我想要的。真是太感谢你了,这件事在我脑海里想了很久。
  • 我不确定是否可以提出后续问题,或者是否应该发布新问题。我会尝试,但只要告诉我这是否不合时宜。在我的工作表中,我已经预先格式化了 10 行,以防万一这几周都有 cmets(我有几个这样的预先格式化的数组)。使用您的魔术公式后,如何自动隐藏空白行?
  • 不太清楚你的意思,你能展示一些图片吗?
  • 这是一张照片:drive.google.com/…
  • 你可以将两者结合起来={FILTERROWSANDCOLS(IMPORTRANGE("1oQVZDEKLqx6ruz2yzIzUgppkWvBEOB_Eo-a4NW1WTSQ";"Comments!B1:U"));=FILTERROWSANDCOLS(IMPORTRANGE("1oQVZDEKLqx6ruz2yzIzUgppkWvBEOB_Eo-a4NW1WTSQ";"ANOTHERRANGE"))}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多