谷歌电子表格查询功能列ID除了列的字母

时间:2013-02-08 06:45:39

标签: sql google-apps-script google-sheets

好吧......不确定是否可以这样做。

我在谷歌电子表格中,单元格A1 =时间..范围是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 spreadsheet Query Error - column doesn't exist

我也尝试了以下内容:

=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

这里的示例似乎可以做到,但仅适用于app脚本吗?而不是在电子表格功能?

4 个答案:

答案 0 :(得分:3)

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

如果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))

答案 1 :(得分:2)

我在没有解决方案的情况下也遇到了这个问题,因此我编写了一个脚本,允许查询中的列引用。 使用:  1.创建一个单独的工作表并设置&#34; [SHEET NAME]&#34;到数据表的名称  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;
}

答案 2 :(得分: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个专栏。从那以后你需要拆分。根本不喜欢它:(

答案 3 :(得分: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' ")
    

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