複数のシートに分散したデータを1つにまとめたいと思ったことはありませんか。特に月ごとにシートが分かれている場合や、複数の部署からデータを集める場合には、手作業でコピーするのは時間がかかりミスも発生しやすいものです。QUERY関数とUNION句を組み合わせれば、数式1つで複数シートのデータを縦方向に結合できます。この記事では、QUERY関数のUNION句を使ったシート結合の具体的な手順と応用テクニックを解説します。
【要点】QUERY+UNIONでシート結合を実現する3つのポイント
- =QUERY({シート1!A1:C; シート2!A1:C}, “SELECT * WHERE Col1 IS NOT NULL”) の構文: 中かっこで複数範囲をセミコロンで区切って指定し、UNION句の代わりに配列リテラルを使用します。
- 列数が異なる場合は不足列に#N/Aが入る: 結合するすべてのシートの列数を揃えるか、QUERY内でNULL列を追加して調整します。
- UNION ALLとUNIONの違い: 重複行を削除したい場合はQUERYでSELECT DISTINCTを、そのまま残す場合は通常のSELECTを使います。
ADVERTISEMENT
目次
QUERY関数とUNION句の仕組み
QUERY関数はSQLライクな構文でデータを操作できる強力な関数です。標準のQUERY構文ではUNION句を直接記述することはできませんが、配列リテラル(中かっこ {})を使って複数の範囲を縦方向に結合することで、疑似的にUNION結合を実現します。
具体的には、QUERY関数の第1引数に配列リテラルを指定します。配列内ではセミコロン(;)が行の区切りを表し、カンマ(,)が列の区切りを表します。例えば ={シート1!A1:C; シート2!A1:C} と書くと、シート1のA1:Cのデータの下にシート2のA1:Cのデータが追加されます。その配列に対してQUERYでSELECTやWHEREを適用することで、UNION結合と同様の結果が得られます。
QUERYとUNIONで2つのシートを結合する手順
ここでは、サンプルデータとして「売上_1月」「売上_2月」という2つのシートを結合する例を使います。各シートにはA列に日付、B列に商品名、C列に金額が入力されているものとします。
- 結合先のシートを用意する
新しいシートを追加し、結合結果を表示するセルを決めます。ここではシート「結合結果」のA1セルに数式を入力します。 - 配列リテラルで範囲を結合する
まず、QUERY関数の第1引数として配列リテラルを書きます。={売上_1月!A1:C; 売上_2月!A1:C}
これで2つのシートのデータが縦に並びます。 - QUERY関数でラップする
配列をQUERY関数で囲み、必要な列をSELECTします。例えば全データを取得するには次のように書きます。=QUERY({売上_1月!A1:C; 売上_2月!A1:C}, "SELECT * WHERE Col1 IS NOT NULL")
WHERE句で空行を除外しています。 - 数式を入力して結果を確認する
A1セルに上記の数式を入力すると、2つのシートのデータが1つにまとまります。
これで基本的な結合は完了です。ただし、結合するシートの列数が異なる場合は注意が必要です。
列数が異なるシートを結合する方法
例えば「売上_1月」には3列あるのに「売上_2月」には4列ある場合、そのまま結合するとエラーになります。この場合は、列数を揃えるために不足している列をNULLや空白で埋める必要があります。
- 不足列にIFERRORやIFでNULLを追加する
シートの範囲を直接指定する代わりに、配列リテラル内で列を追加します。例えば3列のシートを4列に揃えるには、次のように書きます。={売上_1月!A1:C, IF(ROW(売上_1月!A1:A), ""); 売上_2月!A1:D}
これにより3列のシートに4列目(空列)が追加されます。 - QUERYの中で列を補う
QUERY関数の中でNULL列を生成することもできます。=QUERY({売上_1月!A1:C, ARRAYFORMULA(IF(ROW(売上_1月!A1:A), "")); 売上_2月!A1:D}, "SELECT * WHERE Col1 IS NOT NULL")
ここでARRAYFORMULAを使って空列を生成しています。
QUERYとUNIONを使う際の注意点とよくあるエラー
空白行や不要なデータが含まれてしまう
配列リテラルで範囲を指定すると、範囲内の空白行も含まれてしまいます。これを防ぐには、QUERYのWHERE句で「Col1 IS NOT NULL」のように1列目が空白でない行だけを抽出します。また、特定の条件を追加したい場合はWHERE句に複数の条件を指定できます。
列のデータ型が異なる場合のエラー
同じ列に数値と文字列が混在していると、QUERYが意図しない結果を返すことがあります。例えば日付列に文字列が混ざっていると、日付として認識されずにエラーになる場合があります。このような場合は、事前にデータを整形するか、QUERY内でTO_TEXTやDATEVALUEなどの変換関数を使うと良いでしょう。
シート名にスペースや特殊文字が含まれる場合
シート名にスペースが含まれている場合は、シート名をシングルクォーテーションで囲む必要があります。例えば「売上 1月」というシート名なら、='売上 1月'!A1:C と書きます。配列リテラル内でも同様です。
ADVERTISEMENT
QUERY+UNIONと他の結合方法の比較
| 方法 | メリット | デメリット |
|---|---|---|
| QUERY+配列リテラル(UNION) | 数式1つで完結し、自動更新される。条件抽出も同時にできる。 | 列数が揃っていないとエラー。大量データでは重くなる場合がある。 |
| 手動コピー&ペースト | 誰でも簡単にできる。 | 元データが更新されても反映されない。ミスが起きやすい。 |
| IMPORTRANGE関数 | 別のスプレッドシートのデータを結合できる。 | 権限設定が必要。シート間の結合に特化している。 |
| Apps Script | 柔軟な結合や自動化が可能。 | スクリプトの知識が必要。管理がやや複雑。 |
まとめ
QUERY関数と配列リテラルを組み合わせることで、複数シートのデータを簡単に結合できることがお分かりいただけたと思います。基本的な構文は =QUERY({範囲1; 範囲2}, "SELECT * WHERE Col1 IS NOT NULL") です。列数が異なる場合はIFやARRAYFORMULAで空列を追加して調整します。
さらに、QUERYのWHERE句やORDER BY句を使えば、結合と同時にデータのフィルタリングや並び替えも行えます。まずはよく使うシートの結合から試してみてください。QUERY関数は他にも多くの応用が可能ですので、ぜひ活用してみてください。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】複合グラフで棒と折れ線を同時表示!2軸グラフの作り方
- 【Googleスプレッドシート】FILTER関数で条件に合う行だけ抽出!数式1つで動的な絞り込み
- 【Googleスプレッドシート】フィルタ表示で他の人の表示を変えずに絞り込み!共有時の使い分け
- 【Googleスプレッドシート】重複データを抽出して表示!COUNTIFと条件付き書式の併用
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】ARRAYFORMULAで列全体に数式を一括適用!セル分の入力を不要に
- 【Googleスプレッドシート】データ範囲を動的に伸縮させる!INDIRECTと参照範囲のコツ
- 【Googleスプレッドシート】共有解除と権限の取り消し!アクセスを完全に閉じる手順
