earthpg:GAS専門のプログラミングスクール

【GAS】Query関数でスプレッドシートを効率化する方法

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

catman
catman
よし、GASのQuery関数を使ってスプレッドシートを効率化する方法を教えよう!

GASのQuery関数の使い方

GAS Query関数は、Google スプレッドシートのデータを効率良く検索、フィルター、並べ替えをするための強力なツールだ。

DataTableBuilder を使って SQLっぽい文法(SELECT文など)でスプレッドシートのデータを処理できるぞ。

Query関数の基本構文

GASの中でQuery関数を使う際は、以下のように記述する。


function myQueryExample() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = sheet.getDataRange();
  const data = range.getDisplayValues();
  const query = 'SELECT A, B WHERE C > 10 ORDER BY A';
  const results = SpreadsheetApp.newDataTable().addRowsFromDataSource(data).setQuery(query).build().getRows();
  
  Logger.log(results);
}

このスクリプトは、スプレッドシートのデータから、特定の条件でデータを取り出すサンプルだ。

① アクティブなシートを取得

const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

今開いているスプレッドシートのシートを取得。

② データの範囲を取得

const range = sheet.getDataRange();

データがある範囲(空白でないセルを自動検出)を取得。

③ 表示形式のデータを取得

const data = range.getDisplayValues();

スプレッドシートの値を「表示されている通りの文字列」で取得。

④ SQLっぽいクエリを作成

const query = 'SELECT A, B WHERE C > 10 ORDER BY A';

これはこういう意味だ:

  • SELECT A, B → A列とB列だけ取り出す
  • WHERE C > 10 → C列が10より大きい行だけ対象
  • ORDER BY A → A列の値で昇順ソート

⑤ クエリを適用してフィルタリング!

 const results = SpreadsheetApp.newDataTable() .addRowsFromDataSource(data) .setQuery(query) .build() .getRows(); 

これでクエリを実行し、絞り込まれた結果の配列が取得できる。

⑥ ログ出力で結果を確認

Logger.log(results);

スクリプトエディタの「表示 > ログ」から確認できます。

GASでもSQLっぽくデータ処理できるんですね!表の並び替えや抽出がラクになりそうです!
猫男
猫男

catman
catman
そうだとも!大量データを扱うときは特に便利だから、ぜひ活用してみてくれ。

クエリで使える基本キーワード

Query関数では、SQLに似た以下のキーワードを使用できる。

  • SELECT: 取得したい列を指定する
  • WHERE: 条件を指定してデータをフィルタリングする
  • ORDER BY: データを特定の列で並べ替える
  • LIMIT: 取得するデータの最大数を指定する
QUERY関数って難しそうだけど、便利そうだね。catman、次は実践的な使い方を教えてくれませんか?
猫男
猫男
catman
catman
OK、実践的な場面でのGAS Queryの使い方を見ていこう!

実践!GASとQuery関数でデータマネジメント

学校の先生になった気分の準備はいいか。成績を集計してみよう。

生徒の成績表から、特定の条件を満たす生徒だけを抽出。


function filterTopStudents() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = sheet.getDataRange();
  const data = range.getDisplayValues();
  const query = 'SELECT A, B WHERE C > 85 ORDER BY B';
  const results = SpreadsheetApp.newDataTable().addRowsFromDataSource(data).setQuery(query).build().getRows();
  
  Logger.log(results);
}

✅ このスクリプトは、列AとBのデータを取得し、列Cの値が85以上の行をBの順に並べ替えて抽出する。学校の成績管理に便利だ。

練習問題

GAS Query関数を使って、特定の価格以上の商品を抽出し、その商品名と価格を取得してログに出力するスクリプトを書いてみましょう。

 

 

解答・解説


function filterExpensiveProducts() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = sheet.getDataRange();
  const data = range.getDisplayValues();
  const query = 'SELECT A, B WHERE B > 50 ORDER BY A';
  const results = SpreadsheetApp.newDataTable().addRowsFromDataSource(data).setQuery(query).build().getRows();
  
  Logger.log(results);
}

上記のスクリプトは、スプレッドシートのデータから、価格が50以上の商品の商品名と価格を抽出し、商品名を基準に並べ替えるものだ。

SELECT句で列を選び、WHERE句で条件を設定、ORDER BY句で並べ替えを行っている。

「SpreadsheetApp.newDataTable()」を使い、クエリを構築して結果を取得している。

これでスプレッドシートのデータ処理がもっとスムーズにできそうです!ありがとうございます、catman!
猫男
猫男
catman
catman
どういたしまして!また困った時は呼んでくれさ!