スプレッドシートQUERY関数の使い方完全ガイド|条件指定・集計・GAS連携

スプシのQUERY関数を覚えると、VLOOKUPやフィルターでは不可能だったデータ操作が1行で実現できます!
- QUERY関数の基本構文と6つの句(SELECT / WHERE / ORDER BY / GROUP BY / PIVOT / LABEL)
- WHERE句で複数条件・日付条件を使いこなす方法
- GROUP BYとPIVOTで集計・クロス集計を行うテクニック
- 別シート・別ファイルのデータをQUERY関数で参照する方法
- セル参照で動的クエリを作り、ダッシュボードを構築する手順
- GAS連携でQUERY関数の限界を超える実践コード
QUERY関数とは?30秒で分かる概要
GoogleスプレッドシートのQUERY関数は、データベース言語のSQLに似た構文でデータを検索・集計・並び替えできる関数です。VLOOKUPやFILTER関数では複数の数式を組み合わせないと実現できない処理を、QUERY関数ならたった1つの数式で完結させられます。
たとえば「東京支店の売上が100万円以上のデータを、売上の高い順に並べて、商品名と売上金額だけ表示する」といった複雑な条件を1行で記述できます。
QUERY関数の構文(3つの引数を図解)
QUERY関数の基本構文は以下の通りです。
=QUERY(データ範囲, クエリ文字列, [見出し行数])
| 引数 | 説明 | 例 |
|---|---|---|
| データ範囲 | 検索対象のセル範囲 | A1:E100、A:E、’売上データ’!A:E |
| クエリ文字列 | SQL風の検索条件(ダブルクォーテーションで囲む) | “SELECT A, B WHERE C > 100” |
| 見出し行数(省略可) | 先頭の何行を見出しとして扱うか(省略時は自動判定) | 1 |
最もシンプルな使い方は、全列・全行を表示する以下の形です。
=QUERY(A1:E100, "SELECT *")
SQL風の構文が初めてでもOK — 6つの句を覚えるだけ
QUERY関数で使える句(クエリの命令語)は、主に以下の6つです。SQLの経験がなくても、この6つを順番に覚えるだけで大半の処理が実現できます。
| 句 | 機能 | 使用例 |
|---|---|---|
| SELECT | 表示する列を指定 | SELECT A, C, E |
| WHERE | 条件でデータを絞り込む | WHERE B = ‘東京’ |
| ORDER BY | 並び替え | ORDER BY C DESC |
| GROUP BY | グルーピングして集計 | GROUP BY A |
| PIVOT | クロス集計 | PIVOT B |
| LABEL | 列ヘッダーの変更 | LABEL A ‘商品名’ |
これらの句は組み合わせて使えます。記述する順序は SELECT → WHERE → GROUP BY → PIVOT → ORDER BY → LABEL の順です。この順番を間違えるとエラーになるので注意しましょう。
クエリの種類を選択すると、数式と結果がリアルタイムで変化します(JavaScript不使用・CSS-onlyデモ)。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | 名前 | 地域 | 売上 | 月 | カテゴリ |
| 2 | 田中 | 東京 | 150 | 1月 | 食品 |
| 3 | 鈴木 | 大阪 | 200 | 1月 | 家電 |
| 4 | 佐藤 | 東京 | 300 | 2月 | 食品 |
| 5 | 山田 | 名古屋 | 180 | 2月 | 衣料 |
| 6 | 伊藤 | 大阪 | 250 | 3月 | 食品 |
| 7 | 渡辺 | 東京 | 120 | 3月 | 家電 |
| 名前 | 地域 | 売上 | 月 | カテゴリ |
|---|---|---|---|---|
| 田中 | 東京 | 150 | 1月 | 食品 |
| 鈴木 | 大阪 | 200 | 1月 | 家電 |
| 佐藤 | 東京 | 300 | 2月 | 食品 |
| 山田 | 名古屋 | 180 | 2月 | 衣料 |
| 伊藤 | 大阪 | 250 | 3月 | 食品 |
| 渡辺 | 東京 | 120 | 3月 | 家電 |
| 名前 | 売上 |
|---|---|
| 田中 | 150 |
| 佐藤 | 300 |
| 渡辺 | 120 |
| 地域 | 合計売上 |
|---|---|
| 東京 | 570 |
| 大阪 | 450 |
| 名古屋 | 180 |
| 名前 | 売上 |
|---|---|
| 佐藤 | 300 |
| 伊藤 | 250 |
| 鈴木 | 200 |
| 山田 | 180 |
| 田中 | 150 |
| 渡辺 | 120 |
SELECT句 — 必要な列だけ表示する
SELECT句は、データ範囲の中から表示したい列だけを選ぶ句です。不要な列を非表示にするフィルター操作を、数式1つで実現できます。
列の指定方法(A, B, C…)
QUERY関数では列をアルファベット(A, B, C…)で指定します。以下は、A列(商品名)、C列(支店)、E列(売上)だけを抽出する例です。
=QUERY(A1:E100, "SELECT A, C, E")
全列を表示する場合は SELECT * を使います。WHERE句だけ指定してSELECT句を省略した場合もすべての列が表示されます。
計算列の追加
SELECT句では、列同士の四則演算で計算列を追加できます。たとえば、D列(単価)× E列(数量)で売上金額を計算する場合は以下のように書きます。
=QUERY(A1:E100, "SELECT A, D, E, D*E LABEL D*E '売上金額'")
LABEL句を同時に使うと、計算列に任意の見出し名を付けられます。LABEL句を省略すると見出しが「multiply」のような自動生成名になるため、一緒に指定するのがおすすめです。
WHERE句 — 条件でデータを絞り込む
WHERE句はQUERY関数の中でも最も使用頻度が高い句です。指定した条件に一致する行だけを抽出できます。Excelのフィルター機能を数式だけで実現するイメージです。
基本の条件指定(=, !=, >, <, >=, <=)
WHERE句で使える比較演算子は以下の6つです。
| 演算子 | 意味 | 使用例 |
|---|---|---|
| = | 等しい | WHERE A = ‘東京’ |
| != | 等しくない | WHERE A != ‘大阪’ |
| > | より大きい | WHERE B > 100 |
| < | より小さい | WHERE B < 50 |
| >= | 以上 | WHERE B >= 100 |
| <= | 以下 | WHERE B <= 50 |
文字列はシングルクォーテーション(’東京’)で囲み、数値はそのまま記述します。この使い分けを間違えるとエラーになるので注意してください。
=QUERY(A1:E100, "SELECT * WHERE B = '東京'")
=QUERY(A1:E100, "SELECT * WHERE C > 1000000")
複数条件の組み合わせ(AND / OR)
複数の条件を組み合わせるには AND(かつ)と OR(または)を使います。
AND(両方の条件を満たす行を抽出):
=QUERY(A1:E100, "SELECT * WHERE B = '東京' AND C > 1000000")
OR(いずれかの条件を満たす行を抽出):
=QUERY(A1:E100, "SELECT * WHERE B = '東京' OR B = '大阪'")
ANDとORを組み合わせる場合は、括弧で優先順位を明示しましょう。以下は「東京または大阪の支店で、かつ売上が100万円以上」という条件です。
=QUERY(A1:E100, "SELECT * WHERE (B = '東京' OR B = '大阪') AND C > 1000000")
部分一致検索(LIKE / CONTAINS)
完全一致ではなく、文字列の一部を含む条件で検索したい場合は LIKE や CONTAINS を使います。
| 構文 | 意味 | 使用例 |
|---|---|---|
| CONTAINS | 指定した文字列を含む | WHERE A CONTAINS ‘株式’ |
| LIKE ‘%文字%’ | 任意の位置に文字列を含む | WHERE A LIKE ‘%東京%’ |
| LIKE ‘文字%’ | 先頭が一致(前方一致) | WHERE A LIKE ‘東京%’ |
| LIKE ‘%文字’ | 末尾が一致(後方一致) | WHERE A LIKE ‘%支店’ |
| STARTS WITH | 先頭一致 | WHERE A STARTS WITH ‘東京’ |
| ENDS WITH | 末尾一致 | WHERE A ENDS WITH ‘支店’ |
| MATCHES | 正規表現に一致 | WHERE A MATCHES ‘東京|大阪’ |
=QUERY(A1:E100, "SELECT * WHERE A CONTAINS '株式'")
=QUERY(A1:E100, "SELECT * WHERE A LIKE '%東京%'")
MATCHES を使えば正規表現でパターンマッチングが可能です。「東京または大阪を含む」データを1つの条件で抽出できます。
=QUERY(A1:E100, "SELECT * WHERE B MATCHES '東京|大阪|名古屋'")
空白行の除外(IS NOT NULL)
データに空白行が混じっていると集計結果がおかしくなることがあります。IS NOT NULL を使えば、特定の列が空白でない行だけを抽出できます。
=QUERY(A1:E100, "SELECT * WHERE A IS NOT NULL")
逆に空白行だけを抽出したい場合は IS NULL を使います。データの入力漏れチェックに便利です。
=QUERY(A1:E100, "SELECT * WHERE C IS NULL")
日付条件の指定方法
QUERY関数で日付を条件にする場合、特有の書き方が必要です。ここを理解していないとエラーが頻発するため、しっかり押さえておきましょう。
date literalの書き方(date ‘2026-01-01’)
QUERY関数の中で日付を直接書く場合は、date 'YYYY-MM-DD' の形式(date literal)を使います。日付をシングルクォーテーションで囲み、先頭に date キーワードを付けるのがポイントです。
=QUERY(A1:E100, "SELECT * WHERE A >= date '2026-01-01'")
日付の範囲指定も可能です。2026年1月1日から3月31日までのデータを抽出する例です。
=QUERY(A1:E100, "SELECT * WHERE A >= date '2026-01-01' AND A <= date '2026-03-31'")
- NG: WHERE A = '2026-01-01'(dateキーワードがない)
- NG: WHERE A = date "2026-01-01"(ダブルクォーテーションを使用)
- OK: WHERE A = date '2026-01-01'
セル参照で日付を動的に指定する
日付をクエリ文字列の中にハードコーディングせず、セルの値を参照させることもできます。TEXT関数で日付をYYYY-MM-DD形式に変換し、文字列結合で組み込みます。
=QUERY(A1:E100, "SELECT * WHERE A >= date '"&TEXT(G1,"yyyy-MM-dd")&"'")
G1セルに日付(例: 2026/01/01)を入力しておけば、その値に応じて抽出結果が自動的に変わります。
月ごと・年ごとのフィルタリング
特定の月や年のデータだけを抽出するには、YEAR()、MONTH()、DAY() 関数をWHERE句の中で使います。
=QUERY(A1:E100, "SELECT * WHERE YEAR(A) = 2026 AND MONTH(A) = 3")
上記は「2026年3月のデータ」だけを抽出する例です。MONTH()の値は1〜12の数値で指定します。
TODAY関数との組み合わせ
TODAY関数を使えば、「今日から過去30日分」のような動的な日付条件を設定できます。
=QUERY(A1:E100, "SELECT * WHERE A >= date '"&TEXT(TODAY()-30,"yyyy-MM-dd")&"'")
TODAY()はスプレッドシートを開くたびに更新されるため、常に最新の30日分のデータが表示されます。月次レポートや直近のデータ確認に便利なテクニックです。
ORDER BY — データを並び替える
ORDER BY句は、抽出結果を指定した列で並び替えます。Excelの「並べ替え」機能を数式で実現できます。
昇順・降順の指定
昇順(小さい順)は ASC、降順(大きい順)は DESC を指定します。省略した場合はASC(昇順)がデフォルトです。
=QUERY(A1:E100, "SELECT * ORDER BY C DESC")
上記はC列(たとえば売上金額)の大きい順にデータを並び替えます。
複数列での並び替え
カンマで区切ることで、複数列での並び替えが可能です。第1ソートキー、第2ソートキーのように優先順位が付きます。
=QUERY(A1:E100, "SELECT * ORDER BY B ASC, C DESC")
上記は「B列(支店名)の昇順で並べた上で、同じ支店内ではC列(売上)の降順で並べる」という意味です。
GROUP BY — 集計テクニック
GROUP BY句を使うと、データをグループ化して集計できます。Excelのピボットテーブルに近い機能を、数式1つで実現できるのが大きなメリットです。
SUM / COUNT / AVG / MAX / MIN の使い方
GROUP BY句は集計関数とセットで使います。使える集計関数は以下の5つです。
| 関数 | 意味 | 使用例 |
|---|---|---|
| SUM(列) | 合計 | SUM(C) |
| COUNT(列) | 件数 | COUNT(A) |
| AVG(列) | 平均 | AVG(C) |
| MAX(列) | 最大値 | MAX(C) |
| MIN(列) | 最小値 | MIN(C) |
支店ごとの売上合計を求める例です。
=QUERY(A1:E100, "SELECT B, SUM(C) GROUP BY B")
複数の集計関数を同時に使うこともできます。支店ごとの売上合計・件数・平均を一度に算出する例です。
=QUERY(A1:E100, "SELECT B, SUM(C), COUNT(C), AVG(C) GROUP BY B")
複数列でのグルーピング
GROUP BY句にカンマ区切りで複数列を指定すると、組み合わせごとの集計ができます。
=QUERY(A1:E100, "SELECT B, D, SUM(C) GROUP BY B, D")
上記は「B列(支店)とD列(商品カテゴリ)の組み合わせごとに、C列(売上)を合計する」という意味です。ExcelのSUMIFS関数を何行も書く代わりに、1つの数式で完結します。
PIVOTでクロス集計(ピボットテーブル風)
PIVOT句を使うと、ある列の値を横方向(列見出し)に展開したクロス集計表を作成できます。Excelのピボットテーブルに相当する機能です。
=QUERY(A1:E100, "SELECT B, SUM(C) GROUP BY B PIVOT D")
上記は「B列(支店)を行に、D列(商品カテゴリ)を列に展開し、C列(売上)を合計したクロス集計表」を生成します。ピボットテーブルの作成手順に比べて、たった1行の数式で同じ結果が得られるのは大きなメリットです。
LABELで列名を変更
集計結果の列ヘッダーは、デフォルトで「sum 売上」のような自動生成名になります。LABEL句を使うと、任意の名前に変更できます。
=QUERY(A1:E100, "SELECT B, SUM(C), COUNT(C), AVG(C) GROUP BY B LABEL B '支店名', SUM(C) '売上合計', COUNT(C) '取引件数', AVG(C) '平均売上'")
LABEL句はクエリの最後に記述します。各列の後にシングルクォーテーションで新しい列名を指定し、カンマで区切ります。レポートとしてそのまま使えるレベルの見た目になります。
別シート・別ファイルのデータを参照する
QUERY関数のデータ範囲は、同一シートだけでなく別シートや別ファイルのデータも指定できます。複数のデータソースを1つのダッシュボードに集約する場合に活用しましょう。
同じファイル内の別シート参照
同じスプレッドシートファイル内の別シートを参照するには、シート名を指定します。
=QUERY('売上データ'!A1:E100, "SELECT * WHERE C > 1000000")
シート名にスペースや記号が含まれる場合は、シングルクォーテーションで囲む必要があります(例: '2026年 売上'!A:E)。
IMPORTRANGE連携(別ファイルのデータ結合)
別のスプレッドシートファイルのデータを参照するには、IMPORTRANGE関数をQUERYのデータ範囲として使います。
=QUERY(IMPORTRANGE("スプレッドシートURL","シート名!A1:E100"), "SELECT * WHERE Col2 = '東京'")
- IMPORTRANGE経由のデータでは列名が
Col1, Col2, Col3...に変わります(A, B, Cではない) - 初回使用時にアクセス許可のポップアップが表示されるので、「アクセスを許可」をクリックしてください
- 大量データの場合は読み込みに時間がかかることがあります
アクセス許可エラーの対処法
IMPORTRANGE連携で「このスプレッドシートにアクセスする権限がありません」というエラーが出た場合は、以下の手順で対処します。
- IMPORTRANGE関数だけを別のセルに単独で入力する(例:
=IMPORTRANGE("URL","シート名!A1")) - 「アクセスを許可」ボタンが表示されるのでクリック
- 許可後にQUERY関数と組み合わせた数式を入力する
一度アクセスを許可すれば、同じスプレッドシート間では再度の許可は不要です。
セル参照で動的クエリを作る
QUERY関数の真価は、セル参照と組み合わせて動的なクエリを作れる点にあります。ユーザーがセルの値を変えるだけで、抽出結果がリアルタイムに切り替わるダッシュボードを構築できます。
ドロップダウンリスト連動クエリ
データの入力規則でドロップダウンリストを作成し、その選択値をQUERY関数に渡す方法です。以下の例では、G1セルにドロップダウンリストを設定し、選択した支店のデータだけを表示します。
=QUERY(A1:E100, "SELECT * WHERE B = '"&G1&"'")
「全支店」を選択した場合にすべてのデータを表示したいなら、IF関数と組み合わせます。
=QUERY(A1:E100, "SELECT * "&IF(G1="全支店","","WHERE B = '"&G1&"'"))
売上ダッシュボードの作成(実践例)
ここでは、ドロップダウンとQUERY関数を組み合わせた売上ダッシュボードの実践例を紹介します。
前提データ(「売上データ」シートのA:E列):
| A列:日付 | B列:支店 | C列:売上 | D列:商品 | E列:担当者 |
|---|---|---|---|---|
| 2026/01/05 | 東京 | 1500000 | 商品A | 田中 |
| 2026/01/10 | 大阪 | 800000 | 商品B | 鈴木 |
| 2026/02/15 | 東京 | 2000000 | 商品C | 佐藤 |
ダッシュボードシートの構成:
- G1: 支店選択(ドロップダウン: 全支店 / 東京 / 大阪 / 名古屋)
- G2: 開始日(日付入力)
- G3: 終了日(日付入力)
売上一覧の表示(A10セルに入力):
=QUERY('売上データ'!A:E, "SELECT * WHERE A >= date '"&TEXT(G2,"yyyy-MM-dd")&"' AND A <= date '"&TEXT(G3,"yyyy-MM-dd")&"'"&IF(G1="全支店","","AND B = '"&G1&"'")&" ORDER BY A DESC")
支店別売上合計(H10セルに入力):
=QUERY('売上データ'!A:E, "SELECT B, SUM(C), COUNT(C), AVG(C) WHERE A >= date '"&TEXT(G2,"yyyy-MM-dd")&"' AND A <= date '"&TEXT(G3,"yyyy-MM-dd")&"' GROUP BY B LABEL B '支店', SUM(C) '売上合計', COUNT(C) '件数', AVG(C) '平均'")
ドロップダウンと日付セルを変更するだけで、表示内容がリアルタイムに更新される対話型ダッシュボードの完成です。
GASでQUERY関数を超える
QUERY関数はデータの抽出・集計・並び替えに非常に強力ですが、データの書き込みや外部サービスとの連携はできません。そこで、Google Apps Script(GAS)と組み合わせることで、QUERY関数の限界を超えた自動化が実現できます。
QUERY関数だけではできないこと(書き込み、メール送信、API連携)
| やりたいこと | QUERY関数 | GAS |
|---|---|---|
| データの抽出・検索 | 可能 | 可能 |
| 集計・並び替え | 可能 | 可能 |
| データの書き込み・更新 | 不可 | 可能 |
| メール自動送信 | 不可 | 可能 |
| PDF出力 | 不可 | 可能 |
| 外部API連携 | 不可 | 可能 |
| 定時自動実行 | 不可 | 可能(トリガー) |
GASの基礎から学びたい方は、GAS入門ガイド(Google Apps Script入門)をあわせてご覧ください。環境構築から実践コードまで網羅しています。
GASでQUERY結果をメール自動送信するコード
以下のGASコードは、スプレッドシートのデータから条件に一致する行を抽出し、HTML形式のメールとして自動送信します。QUERY関数で絞り込んだ結果を、手動コピー不要でメール配信できます。
function sendQueryResultByEmail() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('売上データ');
const data = sheet.getDataRange().getValues();
const header = data[0];
// 条件: C列(売上)が100万円以上の行を抽出
const filtered = data.filter((row, i) => i === 0 || row[2] >= 1000000);
if (filtered.length <= 1) {
Logger.log('条件に一致するデータがありません');
return;
}
// HTML形式のテーブルを生成
let html = '<h2>売上レポート(100万円以上)</h2>';
html += '<table border="1" cellpadding="8" cellspacing="0">';
html += '<tr>' + header.map(h => '<th>' + h + '</th>').join('') + '</tr>';
for (let i = 1; i < filtered.length; i++) {
html += '<tr>' + filtered[i].map(v => '<td>' + v + '</td>').join('') + '</tr>';
}
html += '</table>';
html += '<p>対象件数: ' + (filtered.length - 1) + '件</p>';
// メール送信
GmailApp.sendEmail(
'report@example.com', // 送信先
'売上レポート(自動送信)', // 件名
'', // プレーンテキスト(HTML版があるので空)
{ htmlBody: html } // HTML形式の本文
);
Logger.log('メール送信完了: ' + (filtered.length - 1) + '件');
}
このコードをGASのスクリプトエディタに貼り付けて実行するだけで動作します。トリガーを設定すれば毎朝自動送信も可能です。トリガーの設定方法はGAS入門ガイドで解説しています。
GASでQUERY結果をPDF出力するコード
スプレッドシートのデータをPDFファイルとしてGoogleドライブに保存するGASコードです。月次レポートの自動作成に活用できます。
function exportQueryResultToPdf() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('レポート');
// PDF出力先のフォルダ(GoogleドライブのフォルダID)
const folderId = 'YOUR_FOLDER_ID';
const folder = DriveApp.getFolderById(folderId);
// ファイル名に日付を付与
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
const fileName = '売上レポート_' + today + '.pdf';
// スプレッドシートをPDFとしてエクスポート
const url = ss.getUrl().replace(/\/edit.*$/, '')
+ '/export?format=pdf'
+ '&gid=' + sheet.getSheetId()
+ '&size=A4'
+ '&portrait=true'
+ '&fitw=true'
+ '&gridlines=false';
const options = {
headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const blob = response.getBlob().setName(fileName);
// Googleドライブに保存
folder.createFile(blob);
Logger.log('PDF保存完了: ' + fileName);
}
YOUR_FOLDER_ID はGoogleドライブのフォルダURLから取得できます(URLの /folders/ 以降の文字列)。QUERY関数でフィルタリングした結果を「レポート」シートに表示しておけば、そのシートだけをPDF化できます。
ExcelユーザーのためのQUERY関数入門
Excelにはデータ検索・集計のための様々な関数やツールがあります。ここでは、Excelユーザーが馴染みのある機能とQUERY関数を比較し、どう使い分けるかを整理します。
VLOOKUPとQUERY関数の機能比較表
| 比較項目 | VLOOKUP | QUERY関数 |
|---|---|---|
| 検索方向 | 左から右のみ | 全方向(列の自由指定) |
| 複数条件 | 不可(補助列が必要) | AND / OR で記述可能 |
| 複数列の返却 | 不可(1列のみ) | SELECT句で複数列指定可 |
| 並び替え | 不可 | ORDER BY句で可能 |
| 集計 | 不可 | GROUP BY + SUM等で可能 |
| 部分一致 | ワイルドカード対応 | LIKE / CONTAINS / MATCHES |
| 対応環境 | Excel / スプレッドシート | スプレッドシートのみ |
VLOOKUPが「1つの値を検索して1つの値を返す」関数なのに対し、QUERY関数は「条件に合うデータセット全体を返す」関数です。VLOOKUPの基本的な使い方はVLOOKUP関数の使い方完全ガイドを参照してください。
XLOOKUPとQUERY関数の使い分け
Excel 365で追加されたXLOOKUP関数は、VLOOKUPの制約の多くを解消しています。しかし、QUERY関数とは得意分野が異なります。
| 用途 | おすすめ |
|---|---|
| 1つの値を検索して返す | XLOOKUP |
| 複数条件で一括検索・抽出 | QUERY関数 |
| 集計(合計・平均・件数) | QUERY関数 |
| クロス集計・ピボット | QUERY関数 |
| Excelで使いたい | XLOOKUP |
XLOOKUP関数の詳しい使い方はXLOOKUP関数の使い方ガイドを参照してください。
Power QueryとQUERY関数の違い
ExcelのPower Queryは、GUIベースのETLツールです。複数データソースの結合、データ型変換、ピボット解除など、高度なデータ変換が可能です。
| 比較項目 | Power Query(Excel) | QUERY関数(スプレッドシート) |
|---|---|---|
| 操作方式 | GUIベース(M言語) | 数式(SQL風構文) |
| リアルタイム更新 | 手動更新が必要 | データ変更時に自動更新 |
| データ変換 | 非常に強力(型変換、結合、ピボット解除等) | 基本的な抽出・集計 |
| 学習コスト | やや高い | 低い(SQL経験があればすぐ使える) |
| 共有・共同編集 | ファイル共有が必要 | URLを共有するだけ |
チームでリアルタイムにデータを共有しながら分析するならQUERY関数、大量データの高度な変換処理が必要ならPower Queryがおすすめです。Excelのフィルター機能との比較はExcelフィルター機能の使い方も参考にしてください。
よくあるエラーと解決法
QUERY関数を使い始めると、構文エラーに悩まされることがあります。ここでは代表的なエラーとその解決法をまとめます。
「クエリ文字列の解析に失敗しました」
最も多いエラーです。原因はクエリ文字列の構文ミスです。
- 句の順序が正しいか(SELECT → WHERE → GROUP BY → PIVOT → ORDER BY → LABEL)
- 文字列条件がシングルクォーテーションで囲まれているか
- クエリ全体がダブルクォーテーションで囲まれているか
- 列名がデータ範囲内に存在するか(A:E指定でF列を参照していないか)
- GROUP BY使用時にSELECT句の非集計列が全てGROUP BYに含まれているか
日付形式のエラー(date literalの書き方ミス)
日付関連のエラーで多い原因は以下の通りです。
dateキーワードの付け忘れ:WHERE A = '2026-01-01'ではなくWHERE A = date '2026-01-01'- 日付形式の間違い:
date '2026/01/01'ではなくdate '2026-01-01'(ハイフン区切り) - ダブルクォーテーションの使用:
date "2026-01-01"ではなくdate '2026-01-01'(シングルクォーテーション) - A列が日付型でない: テキスト形式の日付だとdate literalでは比較できない
型不一致エラー(数値と文字列の混在列)
同じ列に数値と文字列が混在していると、QUERY関数は「多数派の型」を基準にして少数派のデータを無視します。たとえば、B列に数値が多い場合、文字列の行は空白として扱われます。
対処法:
- データ範囲の型を統一する(数値列に文字列を入れない)
- 数式で型変換する:
=ARRAYFORMULA(TO_TEXT(B2:B100))で全て文字列に変換してからQUERYする - 第3引数(見出し行数)を明示的に指定する:
=QUERY(A1:E100, "SELECT *", 1)
IMPORTRANGE連携時のエラー
IMPORTRANGE連携特有のエラーと対処法です。
| エラー内容 | 原因 | 対処法 |
|---|---|---|
| #REF!(アクセス許可が必要) | 初回のアクセス許可が未完了 | IMPORTRANGEを単独で実行し「許可」をクリック |
| 列名でエラー(A, B, Cが使えない) | IMPORTRANGE経由ではCol1, Col2...形式に変わる | Col1, Col2, Col3...で指定する |
| データが表示されない | 参照先のシート名やURL間違い | URLとシート名を再確認 |
| 読み込みが遅い | データ量が大きい | 範囲を必要最小限に絞る(A:E → A1:E500等) |
よくある質問(FAQ)
Q. QUERY関数はExcelでも使えますか?
A. いいえ、QUERY関数はGoogleスプレッドシート専用の関数です。Excelには存在しません。Excelで同様の処理を行うには、FILTER関数、SORT関数、SUMIFS関数などを組み合わせるか、Power Queryを使用します。スプレッドシートへの移行が難しい場合は、ExcelのFILTER関数(Microsoft 365)が近い機能を提供しています。
Q. QUERY関数で大量データを扱うと重くなりますか?
A. データ量が数万行を超えると計算に時間がかかることがあります。対策としては、データ範囲を必要最小限に絞る(A:EではなくA1:E5000のように指定する)、IMPORTRANGE連携を減らす、複雑なクエリを分割する、などが有効です。10万行を超えるデータの場合はGASでの処理やBigQueryの利用も検討しましょう。
Q. QUERY関数で複数シートのデータを結合できますか?
A. はい、波括弧 {} を使って複数のデータ範囲を縦方向に結合できます。たとえば =QUERY({Sheet1!A:E;Sheet2!A:E}, "SELECT * WHERE Col1 IS NOT NULL") のように書きます。結合するシートの列構造(列数と型)が一致している必要があります。結合後の列名はCol1, Col2...形式になる点に注意してください。
Q. QUERY関数の中でセルの値を条件に使うにはどうすればよいですか?
A. 文字列結合(&演算子)でセル参照をクエリ文字列に組み込みます。文字列条件の場合は "SELECT * WHERE B = '"&G1&"'"、数値条件の場合は "SELECT * WHERE C > "&G2 のように書きます。文字列はシングルクォーテーションで囲む必要がある点に注意してください。
Q. QUERY関数とFILTER関数はどう使い分ければよいですか?
A. 単純な条件で行を抽出するだけならFILTER関数の方がシンプルです。一方、列の選択(SELECT)、並び替え(ORDER BY)、集計(GROUP BY)、クロス集計(PIVOT)が必要な場合はQUERY関数が適しています。FILTER関数は配列操作との相性が良く、QUERY関数はSQL的な思考でデータを操作したい場面に向いています。
まとめ
この記事では、GoogleスプレッドシートのQUERY関数の使い方を基礎から応用まで解説しました。
- 6つの句(SELECT / WHERE / ORDER BY / GROUP BY / PIVOT / LABEL)を覚えれば大半の処理に対応できる
- WHERE句の複数条件(AND / OR)と部分一致(LIKE / CONTAINS)が実務で最も使う
- 日付条件は
date 'YYYY-MM-DD'形式を厳守する - GROUP BY + PIVOTでピボットテーブル相当のクロス集計を数式1つで実現できる
- セル参照と組み合わせれば、動的ダッシュボードが構築できる
- 書き込みやメール送信が必要ならGAS連携でQUERY関数の限界を超える
QUERY関数を使いこなせるようになると、VLOOKUPやフィルター機能では何ステップもかかっていた処理が1つの数式で完結します。まずはSELECT句とWHERE句から始めて、慣れてきたらGROUP BYやPIVOTに挑戦してみてください。
さらにGASと組み合わせれば、データの自動取得・加工・配信まで一気通貫で自動化できます。GAS入門ガイドもあわせて活用して、スプレッドシートの可能性を最大限に引き出しましょう。
「QUERY関数やGASを活用して業務を自動化したいけど、自分では難しい...」という方へ。スプレッドシートの自動化からGAS開発まで、業務効率化をサポートします。
LINEでExcelを気軽に学べる
