【GAS】QUERY関数をスプレッドシートで使う方法

スプレッドシートのQUERY関数をGASでも使って、データをSQLっぽくフィルタして処理したいんだけどできる…?
猫男
猫男

catman
catman
よし、catmanに任せな!

GASでQUERY関数の使う方法

残念ながら、GASにQUERY関数は、

ない!

ないんだ。残念ながら。

日本でドリアンが収穫できないの同じで、QUERY関数のメソッドは存在しないんだ。

でも、GASでQUERY関数を再現するとしたら、次の2つの方法ならいけるっちゃいけるぞ。

 

1.セルにQUERY関数を直書き

セルに QUERY 関数を自動入力」すれば、シート上で SQL っぽい抽出処理を走らせられる。


function useQUERYFunction() {
  const sheet = SpreadsheetApp.getActiveSheet();
  
  // QUERY関数をセルに書き込む
  const QUERYFormula = '=QUERY(A1:C10,"SELECT A, B WHERE C > 100")';
  sheet.getRange('E1').setFormula(QUERYFormula);
}
  • const sheet = SpreadsheetApp.getActiveSheet();
    → アクティブなスプレッドシートのシートを取得。
  • const QUERYFormula = '=QUERY(A1:C10,"SELECT A, B WHERE C > 100")';
    実際にシートに書き込む QUERY 関数を文字列として準備。
    → 意味:範囲 A1:C10 から、C列が100より大きい行だけを抽出し、A列とB列を表示する。
  • sheet.getRange('E1').setFormula(QUERYFormula);
    → セル E1 に QUERY 関数を自動で入力します。結果は E1 から下方向に表示。

 

ちなみに、QUERY関数では、SQLに似た以下のキーワードを使用できるぞ。要チェックだ。

キーワード 説明 クエリ例
SELECT 取得したい列を指定する SELECT A, B
WHERE 条件を指定してデータをフィルタリングする WHERE C > 100
ORDER BY データを特定の列で並べ替える ORDER BY B DESC
LIMIT 取得するデータの最大数を指定する LIMIT 5

 

たとえば、こんな感じのスプレッドシートがあったとしたら、

gas query

 

こうなる ↓

gas query

 

2.GASでフィルタ&ソートを組み合わせる

GASには直接QUERY関数はないけれど、配列操作を組み合わせれば同じようなことができる。

例えば「C列が100より大きい行だけ取り出し、A列とB列を抽出してA列順に並び替える」なら、こんなコードになる。


function useFilterAndSort() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues(); // シートのデータを配列で取得
  
  const header = data[0];         // 1行目はヘッダー
  const rows = data.slice(1);     // データ部分だけ
  
  // C列 > 100 を満たす行を抽出し、A,B列を取り出す
  const filtered = rows
    .filter(row => row[2] > 100)  // C列(インデックス2)の条件
    .map(row => [row[0], row[1]]); // A,B列だけ残す
  
  // A列で昇順ソート
  filtered.sort((a, b) => a[0] > b[0] ? 1 : -1);
  
  // 結果をE1から出力
  sheet.getRange(1, 5, filtered.length, 2).setValues(filtered);
}
  • filter → 条件に合う行だけを残す
  • map → 必要な列だけに絞る
  • sort → 並べ替える

これでシート関数に頼らなくても、GASの中で「QUERYっぽい処理」を実現できるぞ。

 

たとえば、こんな感じのスプレッドシートがあったとしたら、

gas query

 

こうなる ↓

gas query

 

GASには直接QUERY関数がないんですね…。ちょっと残念ですけど、セルにQUERYを書き込んだり、フィルタやソートを組み合わせればSQLっぽい処理もできそうですね!少し希望が見えてきました!
猫男
猫男
catman
catman
そうなんだ。工夫すれば同じことは実現できる!がっかりする必要はないさ。データ処理の世界はまだまだ広いぞ。