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

猫男

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 |
たとえば、こんな感じのスプレッドシートがあったとしたら、
こうなる ↓
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関数がないんですね…。ちょっと残念ですけど、セルにQUERYを書き込んだり、フィルタやソートを組み合わせればSQLっぽい処理もできそうですね!少し希望が見えてきました!

猫男

catman
そうなんだ。工夫すれば同じことは実現できる!がっかりする必要はないさ。データ処理の世界はまだまだ広いぞ。