配列・スピル時代の関数
1つの数式が範囲を一気に返す「スピル」と、ARRAYFORMULA・QUERY・FILTERなど配列系関数を実務目線で解説。条件抽出・集計・横持ち・別シート取込・LAMBDAまで、表を一本の式で動かす書き方を体系化する。
「1セルに1つの数式、1つの値」という常識は、もう過去のものです。 現代のスプレッドシートでは、1本の数式が範囲全体を計算して複数のセルへ一気に結果を広げます。これを スピル(spill) と呼びます。列に数式をコピーして貼り付ける作業は、たった1つの式で置き換えられます。本章では、この「表を一本の式で動かす」関数群を実務目線で整理します。
本章で扱うのは次の7つです。
- スピルとは — 1式が複数セルに展開される仕組みと、詰まる落とし穴
- ARRAYFORMULA — 列全体に一括適用、行追加に自動対応
- QUERY(最重要・厚め) — SQL風の言語で抽出・集計・横持ちまで
- FILTER / SORT / SORTN / UNIQUE — 条件抽出と並べ替え、重複除去
- SEQUENCE / FLATTEN / TRANSPOSE — 連番生成・1列化・行列入れ替え
- IMPORTRANGE — 別スプレッドシートからの取込
- LAMBDA とヘルパー関数(やや上級) — 自前の処理を組み立てる
数式は日本語ロケール前提で、引数の区切りは カンマ(,) です。各関数の利用可否や引数に迷ったら、一次情報の 関数リスト(公式) を確認してください。
1. スピルとは — 1式が範囲に広がる
スピルとは、1つのセルに入れた数式の結果が、隣接する複数のセルへ自動的に広がる 挙動です。たとえば =A2:A10*1.1 のように範囲を指定すると、結果も範囲(9行分)になり、数式を入れたセルを起点に下へ展開されます。式を入れるのは1か所だけ。コピーは不要です。
この性質には大きな利点があります。第一に 数式の管理が一元化 されること。直すのは1か所だけで、列全体に反映されます。第二に 行が増えても式を書き直さなくてよい こと(範囲を A2:A のように開いた書き方にしておけば、追加行も自動で計算対象になります)。
一方で注意点もあります。展開先のセルに既にデータがあると、スピルは「詰まって」エラーになります。
2. ARRAYFORMULA — 列全体に一括適用
ARRAYFORMULA は、本来1セルずつ計算する数式を、範囲に対してまとめて適用 するための関数です。1行分の計算式を書けば、それを範囲全体へ展開してくれます。
単価(A列)に消費税を乗せた金額を、2行目以降すべてに一括計算する。
=ARRAYFORMULA(A2:A*1.1) — A2から下のすべてに ×1.1 を適用。1セルに書くだけ
=A2*1.1 を1行ずつコピー — 行が増えるたびにコピーし直しが必要
ポイントは範囲の書き方です。A2:A のように 終端を省いた開いた範囲 を指定すると、後から行を追加しても自動で計算対象に入ります。請求書や売上台帳のように行が増え続ける表で威力を発揮します。
なお、SUMIF や VLOOKUP のように関数によっては内部で配列処理に対応しているものもあり、その場合 ARRAYFORMULA で包むだけで一括展開できます。逆に四則演算や &(連結)は ARRAYFORMULA がないと範囲計算してくれないので、「列全体に式を効かせたいのに1行しか動かない」と感じたら ARRAYFORMULA で包めないか考えてみてください。
3. QUERY — 表を「問い合わせ」で操る
QUERY は本章の主役です。SQL に似た専用言語 を文字列で書き、範囲に対して「抽出・集計・並べ替え・横持ち変換」をまとめて行えます。1本でピボットテーブルに近いことまでこなせる、最も汎用性の高い関数です。
=QUERY(範囲, "クエリ文字列", 見出し行数)
- 範囲 — 対象データ。
A1:Eのように開いた範囲も可。 - クエリ文字列 —
selectwheregroup bypivotorder bylimitlabelformatなどの句を、半角スペース区切りで並べる。 - 見出し行数 — 先頭の見出し行が何行か。
1が一般的。
クエリ言語の正確な仕様は QUERY言語リファレンス(公式) が一次情報です。
列の指定 — Col1 表記と列記号
QUERY のクエリ内では、列を A B C… のシート列記号で指定します。ただし範囲を関数で作った場合など列記号が使えない場面では、Col1 Col2…(範囲の左から数えた番号)で指定します。select A, C と select Col1, Col3 は、同じ意図を別表記で書いたものです。
条件抽出 — where
where で条件に合う行だけを取り出します。
=QUERY(A1:E, "select A, C, E where C > 10000", 1)
A・C・E列を取り出し、C列(金額)が1万を超える行だけに絞ります。文字列の条件は シングルクォート で囲みます。
=QUERY(A1:E, "select A, C where B = '営業部'", 1)
日付の条件 — date ‘yyyy-mm-dd’
日付で絞り込むときは、date キーワードに続けて 'yyyy-mm-dd' 形式の文字列 を書きます。
=QUERY(A1:E, "select A, C where D >= date '2026-01-01'", 1)
D列の日付が2026年1月1日以降の行を抽出します。月日のゼロ埋め(01)と区切りのハイフン、シングルクォートを忘れないでください。
集計 — group by
group by は 指定した列でグループ化し、集計関数(sum avg count max min)で集計 します。select に集計対象と集計関数を書き、group by にグループの基準列を書きます。
=QUERY(A1:E, "select B, sum(C) where C > 0 group by B order by sum(C) desc", 1)
これは「部署(B列)ごとに金額(C列)を合計し、合計の多い順に並べる」クエリです。select に書く列は、集計関数の中にあるか、group by に含まれているか のどちらかである必要があります(これを外すとエラーになります。後述)。
横持ち変換 — pivot
pivot は、ある列の値を 横方向の見出し(列)に展開 します。ピボットテーブルの「列に置く項目」に相当します。
=QUERY(A1:E, "select B, sum(C) group by B pivot D", 1)
部署(B列)を縦、別項目(D列)の値を横に並べ、その交点に金額合計を置いたクロス集計表ができます。縦横の集計を1式で作れるのが pivot の強みです。
並べ替え・件数制限 — order by / limit
order by 列 desc(降順)/asc(昇順)で並べ替え、limit n で先頭 n 件に絞ります。「売上トップ5」のような表が一発で作れます。
=QUERY(A1:E, "select A, C order by C desc limit 5", 1)
列名を変える — label
集計結果の列見出しは sum 金額 のような味気ない自動名になります。label で 任意の見出しに付け替え られます。
=QUERY(A1:E, "select B, sum(C) group by B label B '部署', sum(C) '売上合計'", 1)
format を使えば format sum(C) '#,##0' のように 集計値の表示書式 も指定できます。
エラーの読み解き方
4. FILTER / SORT / SORTN / UNIQUE — 抽出と整理
QUERY ほど多機能でなくても、条件抽出・並べ替え・重複除去 を素早く書ける専用関数群です。組み合わせると読みやすく、用途も明快です。
| 関数 | 用途 | 構文 |
|---|---|---|
| FILTER | 条件に合う行だけ抽出 | FILTER(範囲, 条件1, 条件2, …) |
| SORT | 並べ替え | SORT(範囲, 並べ替え列, 昇順か) |
| SORTN | 上位 n 件だけ取り出す | SORTN(範囲, 件数, 同点の扱い, 並べ替え列, 昇順か) |
| UNIQUE | 重複を除いた一意の値 | UNIQUE(範囲) |
FILTER — AND は *、OR は +
FILTER の複数条件は、見慣れない書き方をします。AND(かつ)は条件どうしを * で掛け、OR(または)は + で足します。 カンマで条件を並べた場合も AND になります。
売上表(B列=部署, C列=金額)から抽出する。
=FILTER(A2:C, (B2:B="営業部")*(C2:C>=10000)) — 営業部 かつ 1万以上(AND=*)
=FILTER(A2:C, (B2:B="営業部")+(B2:B="企画部")) — 営業部 または 企画部(OR=+)
各条件は丸括弧で囲み、それを * か + でつなぐのがコツです。* と + を取り違えると結果が大きく変わるので注意してください。
SORT / SORTN / UNIQUE の組み合わせ
これらは入れ子にして使うと効果的です。たとえば「重複を除いた部署一覧を五十音順で並べる」なら、UNIQUE の結果を SORT で包みます。
=SORT(UNIQUE(B2:B)) — 部署の重複を除き、並べ替える=SORT(FILTER(A2:C, C2:C>=10000), 3, FALSE) — 1万以上を抽出し、3列目(金額)の降順に並べる=SORTN(A2:C, 3, 0, 3, FALSE) — 3列目の降順で上位3件だけ取り出す SORT の第3引数(昇順か)は TRUE が昇順、FALSE が降順です。SORTN の第3引数は同点(タイ)の扱いを番号で指定します(0 が基本)。
5. SEQUENCE / FLATTEN / TRANSPOSE — 形を作る・変える
配列の「形」を扱う3つの道具です。単独でも使えますが、他の関数と組み合わせると真価を発揮します。
| 関数 | 用途 | 構文 |
|---|---|---|
| SEQUENCE | 連番の配列を生成 | SEQUENCE(行数, 列数, 開始値, 増分) |
| FLATTEN | 複数列・行を1列にまとめる | FLATTEN(範囲1, 範囲2, …) |
| TRANSPOSE | 行と列を入れ替える | TRANSPOSE(範囲) |
| ARRAY_CONSTRAIN | 配列を指定した行数・列数に切り詰める | ARRAY_CONSTRAIN(配列, 行数, 列数) |
- SEQUENCE —
=SEQUENCE(10)で1〜10の連番が縦に並びます。日付の連番(=SEQUENCE(30, 1, DATE(2026,6,1))で6月の各日)や、行番号の生成に便利です。なお開始値に日付を与えても 結果は数値(シリアル値) で返るので、表示形式を「日付」にすると各日付として表示されます。 - FLATTEN — 複数列にまたがるデータを 縦1列にまとめ ます。バラバラの列を
UNIQUEで一意化する前処理などに使います。 - TRANSPOSE — 縦持ちの表を横持ちに(またはその逆に)ひっくり返し ます。
QUERYの結果の向きを変えたいときにも重宝します。 - ARRAY_CONSTRAIN — スピルした大きな結果を 先頭の指定行数・列数だけに切り詰め ます。
=ARRAY_CONSTRAIN(SORT(B2:B, 1, FALSE), 5, 1)で「降順の上位5件だけ」のように、結果のサイズを制限したいときに使います。
6. IMPORTRANGE — 別シートから取り込む
IMPORTRANGE は、別のスプレッドシートのデータを現在のシートに取り込む 関数です。マスタ表を1か所で管理し、各所から参照する、といった運用ができます。
=IMPORTRANGE("スプレッドシートのURLまたはID", "シート名!A1:E")
第1引数は取り込み元のURL(または ID)、第2引数は シート名とセル範囲を1つの文字列 にしたものです。
7. LAMBDA と名前付き関数 — やや上級
最後に、より踏み込んだ「自前の処理を組み立てる」関数群を軽く紹介します。今すぐ全部使う必要はありませんが、「こういう世界がある」と知っておく と、複雑な処理に出会ったとき調べる足がかりになります。
LAMBDA は、その場で名前のない関数(自作の計算式)を定義 するための関数です。引数の名前と計算式を書き、後続のヘルパー関数に渡して使います。よく定義した処理は、メニューの「データ → 名前付き関数」で 名前付き関数として登録 すれば、=自作関数名(...) のように再利用できます。
LAMBDA を受け取って範囲に適用する ヘルパー関数 には、次のものがあります。
| 関数 | 用途(概略) |
|---|---|
| MAP | 範囲の各要素に同じ処理を適用して新しい配列を作る |
| REDUCE | 範囲を1つの値に畳み込む(累積計算) |
| SCAN | REDUCE の途中経過も配列で返す(累計列など) |
| BYROW | 行ごとに処理して1列の結果を返す |
| BYCOL | 列ごとに処理して1行の結果を返す |
| MAKEARRAY | 行数・列数を指定して配列を生成する |
| LET | 中間結果に名前を付けて、式を読みやすく・速くする |
=BYROW(B2:D10, LAMBDA(row, SUM(row))) — 各行ごとに合計を計算し、1列に並べて返す =LET(税率, 0.1, 単価, B2, 単価*(1+税率)) — 先に名前を定義してから計算。長い式の可読性と再計算効率が上がる LET は厳密にはヘルパー関数ではありませんが、LAMBDA と並んで「式を読みやすく組み立てる」ための重要な道具です。同じ計算を何度も書く代わりに名前で参照でき、保守しやすくなります。
まとめ — 用途からの逆引き
| やりたいこと | 使う関数 |
|---|---|
| 列全体に同じ計算を一括適用したい | ARRAYFORMULA |
| 条件抽出・集計・並べ替え・横持ちをまとめてやりたい | QUERY |
条件で行を絞りたい(AND=* / OR=+) | FILTER |
| 並べ替え・上位 n 件・重複除去 | SORT / SORTN / UNIQUE |
| 連番を作る/1列化/行列を入れ替える | SEQUENCE / FLATTEN / TRANSPOSE |
| 別スプレッドシートから取り込む | IMPORTRANGE |
| 自前の繰り返し・累積処理を組む | LAMBDA + MAP / REDUCE / BYROW 等 |
まず ARRAYFORMULA と QUERY
列全体の計算と、抽出・集計・横持ちをそれぞれ1式に。手作業のコピペと集計やり直しの大半が消える。
軽い処理は FILTER 系
絞る・並べる・重複を消すだけなら FILTER / SORT / UNIQUE が読みやすい。集計まで踏み込むなら QUERY。
ここまでで「表を一本の式で動かす」配列・スピル系の関数を手にしました。次は、これらを使った実戦的な集計・分析の組み立て方を 第7章 集計・分析の型 で学びましょう。