2

好吧...不确定这些是否可以完成。

我在谷歌电子表格中,单元格 A1 = time.. 范围是 A1:C4。

我有一个简单的表格如下:

time   sit   stand 
1      bob   mike
2      fred  pat
3      chris mike

这是我的查询:

=query($A$1:$C$4,"select A,B,C where C='mike'",0) 

......非常直截了当。但是,我希望列引用是动态的。所以我需要能够使用标题进行查询。我该怎么做?我已经尝试过以下方法:

=query($A$1:$C$4,"select 'sit ', 'stand' where 'stand' = 'mike' ",0)

=query($A$1:$C$4,"select sit, stand where stand = 'mike' ",0)

并根据此页面的建议: Google 电子表格查询错误 - 列不存在

我还尝试了以下方法:

=query($A$1:$C$4,"select Col2, Col3  where Col3 = 'mike' ",0)

=query($A$1:$C$4,"select Col2, Col3  where (Col3) = 'mike' ",0)

=query($A$1:$C$4,"select (Col2), (Col3)  where (Col3) = 'mike' ",0)

=query($A$1:$C$4,"select 'Col2', 'Col3'  where 'Col3' = 'mike' ",0)

他们都没有工作......有人知道怎么做或知道是否可能吗?

https://developers.google.com/chart/interactive/docs/querylanguage

此处的示例似乎您可以做到,但这仅适用于应用程序脚本吗?而不是在电子表格功能中?

4

4 回答 4

5

不幸的是,在 QUERY 电子表格函数 select 子句中没有通过标题引用列的本地方式。

如果 QUERY 的第一个参数不是显式引用的范围,则可以使用 Colx 表示法。实现此目的的一种方法是将范围括在括号中,并调用 ArrayFormula:

=ArrayFormula(QUERY(($A$1:$C$4),"select Col2, Col3 where Col3 = 'mike'",0))

它相当难看,但您可以使用 MATCH 函数来插入标题引用:

=ArrayFormula(QUERY(($A$1:$C$4),"select Col"&MATCH("sit";$A$1:$C$1;0)&", Col"&MATCH("stand";$A$1:$C$1;0)&" where Col"&MATCH("stand";$A$1:$C$1;0)&" = 'mike'",1))

于 2013-02-09T20:27:24.387 回答
2

我也遇到过这个问题,但没有解决方案,所以我编写了一个脚本,允许在查询中引用列。要使用: 1. 创建一个单独的表并将“[SHEET NAME]”设置为数据表的名称 2. 创建一个名称范围(从工具菜单),它是存储列 ID 的行,例如 A1:K1 3 .将代码中的[COLUMNIDs ROW REFERENCE]更改为命名范围。现在在查询列 id 示例之前的简单前缀 $ 字符时: =QUERY([SHEET_NAME]!A4:F, _Select(" * WHERE $[COLUMNID] < $[COLUMNID2]")

function _Select(squery){
  var sheetName = "[SHEET NAME]";
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var colIndex = sheet.getDataRange().getColumn();
  var colIndex2 = sheet.getDataRange().getLastColumn();

  var rangeString = sheetName+"!"+sheet.getRange(3, colIndex, 1, colIndex2).getA1Notation();

  return "SELECT "+yq(rangeString, squery);
}

function yq(range, sQuery) {
  var sheetName = SpreadsheetApp.getActiveSheet().getSheetName();
  if( (typeof range == "object") && (range !== null) ){
    sheetName = range.getSheet().getName();
    range = range.getA1Notation();
  }else{
    var tRange = range.split("!");
    if(tRange.length > 1){
      sheetName = tRange[0]
      range = tRange[1];
    }
  }

  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var range = sheet.getRange(range);

  var qInput = sQuery.split(" ");
  var outQuery = [];
  for(var i = 0; i < qInput.length; i++){
    if(qInput[i].charAt(0) == "$"){
      var colIndex = getHeaderValues(sheet, qInput[i].slice(1), range, "[COLUMNIDs ROW REFERENCE]");
      outQuery.push(colIndex.toString());
    }else{
      outQuery.push(qInput[i]);
    }
  }

  return outQuery.join(" ");
}


function getHeaderValues(sheet, columnName, range, columnHeaderRow){
  var columnHeaderRowIndex = range.getRowIndex() - 1;
  if(!isNaN(parseFloat(columnHeaderRow)) && isFinite(columnHeaderRow)){
    columnHeaderRowIndex = range.getRowIndex() + columnHeaderRow;
  }else if(typeof columnHeaderRow == "string"){
    columnHeaderRowIndex = SpreadsheetApp.getActive().getRangeByName(columnHeaderRow).getRowIndex();
  }  
  var numColumns = range.getLastColumn() - range.getColumn() + 1;
  var headersRange = sheet.getRange(columnHeaderRowIndex, range.getColumn(), 1, numColumns);
  var headers = headersRange.getValues()[0];
  var hIndex = null;
  for(var i = 0; i < headers.length; i++){    
    if(headers[i] == columnName){
      hIndex = headersRange.getColumn() + i;
      hIndex = sheet.getRange(headersRange.getRow(), hIndex).getA1Notation();
      return hIndex.charAt(0);
    }
  }
  return null;
}
于 2014-07-01T17:13:40.853 回答
1

嗨,我有另一个解决方案。我打破了可以读取洞东西的线条。

=query($A$1:$C$4,"select "

&CHAR(MATCH("time";1:1;0)+64)
&","
&CHAR(MATCH("sit";1:1;0)+64)
&","
&CHAR(MATCH("stand";1:1;0)+64)

&"where C='mike'",0) 

仍然不好,并且您被限制为 24 列。因为在那之后你需要分裂。一点都不喜欢 :(

于 2013-09-28T20:51:05.100 回答
0

我发现您可以做两件事来改进查询列引用:

  1. 将列引用搜索放在另一个单元格(图例)中并使用

    =query(A:C,"select "&D2&" where "&E2&" starts with '"&E3&"' ")
    

    例如 D2 = A, E2 = C, E3 = foo

    这样做的好处是允许您通过编辑单元格而不是公式来更改查询术语,并且在您添加/移动列时也不会中断。您可以更进一步并命名范围以使其看起来像

    =query(A:C,"select "&cats&" where "&name&" starts with '"&search&"' ")
    
  2. 通过弄乱范围将其切换到 Col[n] 参考模式

    =query({A:C},"select Col1 where Col3 matches 'foo' ")
    

    这使您能够在不破坏数据集的情况下四处移动数据集,但如果您在范围中插入更多列,则会破坏它。

于 2016-01-14T05:19:00.450 回答