2

わかりました...これらが実行できるかどうかわかりません。

私はセルA1 =時間のGoogleスプレッドシートにいます..範囲は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 表記を使用できます。これを実現する 1 つの方法は、範囲を括弧で囲み、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. 別のシートを作成し、"[シート名]" をデータシートの名前に設定します。 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 に答える