好吧......不确定是否可以这样做。
我在谷歌电子表格中,单元格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脚本吗?而不是在电子表格功能?
答案 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.创建一个单独的工作表并设置" [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;
}
答案 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)
我发现有两件事可以改进查询列引用:
将列引用搜索放在另一个单元格(图例)中并使用
=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&"' ")
通过弄乱范围
将其切换到Col [n]参考模式=query({A:C},"select Col1 where Col3 matches 'foo' ")
这使您能够在不破坏数据集的情况下移动数据集,但如果在范围中插入更多列,则会崩溃。