【问题标题】:google spreadsheet query function column id other than letter of column谷歌电子表格查询功能列ID不是列的字母
【发布时间】:2013-01-23 21:35:24
【问题描述】:

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

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

这里的例子看起来你可以做到,但这仅适用于应用程序脚本吗?而不是在电子表格函数中?

【问题讨论】:

  • 看起来答案是否定的。关于能够使用nameOfColumn 而不能使用它的引用似乎存在冲突。所以这通常意味着你不能。

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


【解决方案1】:

遗憾的是,在 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))

【讨论】:

  • 嗨 AdamL,我把第一个 ArrayFormula 放进去了。它似乎不起作用。
  • 它给了我“错误:无效查询:表中不存在列 [Col2]。”
  • 你把这篇文章中的确切公式放进去了吗?如果没有,您可以在这里发布您使用的公式吗?例如,您是否按照建议/显示将范围括在括号中
  • 我想是的。 =ArrayFormula(query($A$1:$C$4,"select Col2, Col3 where Col3 = 'mike'",0))
  • 是的,他们改变了“除了明确引用的范围之外的任何东西”的行为;即现在更难生成一个可以用 Colx 表示法引用的数组。一种适用于新(和旧)表格的方法是=QUERY(QUERY(A1:C4,"select *"),"select Col1 etc")
【解决方案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;
}

【讨论】:

    【解决方案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) 
    

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

    【讨论】:

      【解决方案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. 通过弄乱范围将其切换到 Col[n] 参考模式

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 2022-12-31
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多