谷歌电子表格查询功能列ID比列的其它信(google spreadsheet query funct

2019-10-17 16:26发布

好了......不知道这些可以做。

我在谷歌电子表格单元格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)

每本页面的建议: 谷歌电子表格查询错误-列不存在

我也试过如下:

=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

这里的例子好像你能做到这一点,但是,对于唯一的应用程序的脚本? 而不是在电子表格功能?

Answer 1:

不幸的是查询功能的电子表格SELECT子句中通过在头引用列的没有原生方式。

您可以使用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))



Answer 2:

我也遇到了这个问题如果不解决,所以我写了一个脚本,将允许在查询中列引用。 使用方法:1.创建一个单独的片材,并设置“[表名称]”的数据表2.创建名称范围(从工具菜单)的名称是这些列ID存储例如A1行:K1 3 。改变[COLUMNIDs ROW参考]在代码中的命名范围。 现在,在查询简单的前缀字符$ 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;
}


Answer 3:

您好我有另一种解决方案。 我打破了孔的东西可以读线。

=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) 

仍然不是很好,而你limmited至24列。 因为之后你需要拆分。 不喜欢它在所有:(



Answer 4:

有两件事情我发现你可以做,以提高查询列引用:

  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. 通过与范围搞乱切换到山口[n]的参考模式

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

    这使您可以四处移动数据集而不被破坏的能力,但将打破,如果你插入更多的列到的范围内。



文章来源: google spreadsheet query function column id other than letter of column