スプレッドシート

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

スプレッドシートQUERY関数の完全ガイド 条件指定と集計を示すサムネイル画像
しんたろ。

スプシのQUERY関数を覚えると、VLOOKUPやフィルターでは不可能だったデータ操作が1行で実現できます!

この記事でわかること
  • QUERY関数の基本構文と6つの句(SELECT / WHERE / ORDER BY / GROUP BY / PIVOT / LABEL)
  • WHERE句で複数条件・日付条件を使いこなす方法
  • GROUP BYとPIVOTで集計・クロス集計を行うテクニック
  • 別シート・別ファイルのデータをQUERY関数で参照する方法
  • セル参照で動的クエリを作り、ダッシュボードを構築する手順
  • GAS連携でQUERY関数の限界を超える実践コード
この記事の目次
  1. QUERY関数とは?30秒で分かる概要
  2. SELECT句 — 必要な列だけ表示する
  3. WHERE句 — 条件でデータを絞り込む
  4. 日付条件の指定方法
  5. ORDER BY — データを並び替える
  6. GROUP BY — 集計テクニック
  7. 別シート・別ファイルのデータを参照する
  8. セル参照で動的クエリを作る
  9. GASでQUERY関数を超える
  10. ExcelユーザーのためのQUERY関数入門
  11. よくあるエラーと解決法
  12. よくある質問(FAQ)
  13. まとめ
  14. LINEでExcelを気軽に学べる

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 の順です。この順番を間違えるとエラーになるので注意しましょう。

📊 QUERY関数を体験してみよう!

クエリの種類を選択すると、数式と結果がリアルタイムで変化します(JavaScript不使用・CSS-onlyデモ)。

売上データ.gsheet
▾ 元データ(A1:E7)
ABCDE
1 名前 地域 売上 カテゴリ
2 田中東京1501月食品
3 鈴木大阪2001月家電
4 佐藤東京3002月食品
5 山田名古屋1802月衣料
6 伊藤大阪2503月食品
7 渡辺東京1203月家電
▶ クエリを選択して結果を確認
fx =QUERY(A1:E7, “SELECT *”) =QUERY(A1:E7, “SELECT A, C WHERE B = ‘東京'”) =QUERY(A1:E7, “SELECT B, SUM(C) GROUP BY B LABEL SUM(C) ‘合計売上'”) =QUERY(A1:E7, “SELECT A, C ORDER BY C DESC”)
▾ クエリ結果 6行 3行 3行 6行
名前地域売上カテゴリ
田中東京1501月食品
鈴木大阪2001月家電
佐藤東京3002月食品
山田名古屋1802月衣料
伊藤大阪2503月食品
渡辺東京1203月家電
名前売上
田中150
佐藤300
渡辺120
地域合計売上
東京570
大阪450
名古屋180
名前売上
佐藤300
伊藤250
鈴木200
山田180
田中150
渡辺120
SELECT * は全列を返します。SELECT A, C のように列を指定すると、必要なデータだけ取得できます。
WHERE句で条件を指定し、B列(地域)が「東京」の行だけ抽出しています。文字列条件はシングルクォートで囲みます。
GROUP BY で地域ごとにまとめ、SUM(C) で売上を合計しています。LABEL句で列名を「合計売上」に変更しています。
ORDER BY C DESC で売上(C列)の降順に並べ替えています。ASCにすると昇順になります。

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)

完全一致ではなく、文字列の一部を含む条件で検索したい場合は LIKECONTAINS を使います。

構文意味使用例
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連携の注意点
  • IMPORTRANGE経由のデータでは列名が Col1, Col2, Col3... に変わります(A, B, Cではない)
  • 初回使用時にアクセス許可のポップアップが表示されるので、「アクセスを許可」をクリックしてください
  • 大量データの場合は読み込みに時間がかかることがあります

アクセス許可エラーの対処法

IMPORTRANGE連携で「このスプレッドシートにアクセスする権限がありません」というエラーが出た場合は、以下の手順で対処します。

  1. IMPORTRANGE関数だけを別のセルに単独で入力する(例: =IMPORTRANGE("URL","シート名!A1")
  2. 「アクセスを許可」ボタンが表示されるのでクリック
  3. 許可後に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関数の機能比較表

比較項目VLOOKUPQUERY関数
検索方向左から右のみ全方向(列の自由指定)
複数条件不可(補助列が必要)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関数の使い方を基礎から応用まで解説しました。

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開発まで、業務効率化をサポートします。

自動化コンサルティングの詳細はこちら

期間限定でChatGPT✖︎Googleスプレットシートのコンテンツ配布中!

LINEでExcelを気軽に学べる

しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
Profile
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
プロフィールを読む

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました