皆さん、Googleスプレッドシートを使いこなしているでしょうか?
データ集計に欠かせない関数の一つにSUMIFSがありますが、「これをARRAYFORMULAで一括処理したいのにできない!」と頭を抱えた経験はありませんか?
そうなんです。残念ながら、GoogleスプレッドシートのSUMIFS関数は、単体ではARRAYFORMULAに対応していません。これは、SUMIFSが内部で複数のセル範囲を個別に評価するため、ARRAYFORMULAのような配列処理と相性が悪いためです。
// やりたいけど、エラーになる数式
=ARRAYFORMULA(SUMIFS(合計範囲, 条件範囲1, 検索したい値の範囲, ...))
でも、ご安心ください! SUMIFSがARRAYFORMULAで直接使えなくても、同じような処理を実現する方法はいくつか存在します。
この記事を読めば、もう手動で一つ一つSUMIFSを入力する必要はありません!
スプレッドシート作業の効率が格段にアップすること間違いなしです。
なぜARRAYFORMULAとSUMIFSは相性が悪いのか?
まずは、なぜこの二つがうまく連携できないのかを簡単に理解しておきましょう。
SUMIFS関数は、複数の条件に基づいて合計を計算する非常に便利な関数です。例えば、「商品Aの売上かつ地域が東京」といった複数の条件を満たすデータを合計したい場合に重宝します。
しかし、SUMIFSは指定された条件範囲と合計範囲を「行ごと」に評価し、その結果を一つずつ合計していく構造になっています。ARRAYFORMULAは、関数全体を一気に配列として処理しようとするため、SUMIFSのこの「行ごとの評価」という特性とぶつかってしまうのです。
簡単に言うと、ARRAYFORMULAは「まとめてドン!」と処理したいのに、SUMIFSは「一つずつ丁寧に計算させて!」と主張しているイメージですね。

今回のシナリオ:商品マスタに「カテゴリ別」かつ「期間内」の売上を自動集計したい
今回は、より実践的な以下のシナリオで解説を進めます。
【シート1:売上データ】 日々のデータが以下のシートに入力されているとします。
日付 | 商品名 | カテゴリ | 売上 |
---|---|---|---|
6/1 | りんご | 果物 | 100 |
6/5 | 牛乳 | 飲料 | 150 |
6/10 | みかん | 果物 | 200 |
6/12 | お茶 | 飲料 | 120 |
6/15 | りんご | 果物 | 180 |
7/5 | 牛乳 | 飲料 | 160 |
【シート2:集計シート】 このシートのC列に、「カテゴリごと」の「6月分」の売上合計をARRAYFORMULA
で一気に表示させたい、というのが今回のゴールです。
カテゴリ | 担当 | 6月売上合計 |
---|---|---|
果物 | 佐藤 | (ここに自動計算) |
飲料 | 鈴木 | (ここに自動計算) |
菓子 | 高橋 | (ここに自動計算) |
この「月次レポート」シートのA列のカテゴリリスト(果物, 飲料, 菓子)を参照し、それぞれのカテゴリに合致し、かつ売上データの日付が6月のものだけを合計する。これをC2セルに1つの数式を入れるだけで実現したいのです。
まさにARRAYFORMULA
とSUMIFS
が使いたくなる場面ですよね。
解決策1:MAP関数を使う(一番シンプルで直感的!)
最初にご紹介するのはMAP
関数です。これが一番ARRAYFORMULA
の考え方に近く、直感的に理解できるので、まずはこちらから試してみてください。
MAP
関数は、「指定した範囲(今回はカテゴリリスト)を1つずつ取り出して、それぞれに同じ処理をしてね」という命令ができる関数です。
▼集計シートのC2セルに、この数式を入力するだけ!
=MAP(A2:A, LAMBDA(category,
IF(category = "",,
SUMIFS('売上データ'!D:D, '売上データ'!C:C, category, '売上データ'!A:A, ">=2025-06-01", '売上データ'!A:A, "<=2025-06-30")
)
))
あれ?SUMIFS
が使えるの? と思った方、鋭いですね!
実は、MAP
やBYROW
といった新しい関数(LAMBDAヘルパー関数と呼ばれます)の中でなら、SUMIFS
は各行ごとに計算されるため、期待通りに動いてくれるんです。これはARRAYFORMULA
にはない大きなメリットです。
▼実行結果 この数式だけで、以下のように表示されます。

数式の解説(やっていることは超シンプル!)
MAP(A2:A, ...)
A2から下の範囲(果物, 飲料, 菓子…)を上から順番に見ていきます。LAMBDA(category, ...)
MAP
が見ている値を、ここではcategory
という名前で扱いますよ、という宣言です。(1周目はcategory
に”果物”が、2周目は”飲料”が入るイメージ)IF(category = "",, ...)
もしカテゴリ名が空欄だったら、何もせずに次へ進んでね、というお決まりのエラー処理です。SUMIFS(...)
ここが処理の心臓部です。売上データ!D:D
: 合計したい売上列売上データ!C:C, category
: 条件1。売上データのカテゴリが、今MAP
が見ているcategory
(”果物”など)と一致するもの。売上データ!A:A, ">=2025-06-01", 売上データ!A:A, "<=2025-06-30"
: 条件2,3。日付が6月1日以降、かつ6月30日以前のもの。
つまり、「カテゴリリストを1行ずつ見ながら、その行のカテゴリ名を使ってSUMIFS
を実行する」という処理を自動で繰り返しているだけなんです。とてもシンプルですよね!


解決策2:LET + QUERY + VLOOKUP(QUERYに慣れている方向け)
QUERY
関数のSQLライクな書き方が好き!という方には、LET
関数と組み合わせる方法も非常にスマートです。
LET
関数は、数式内で使える「一時的な作業台(変数)」のようなものです。これを使えば、作業列を作らずに複雑な処理を組み立てられます。
▼レポートシートのC2セルに、この数式を入力!
=LET(
shukei, QUERY(売上データ!A:D, "SELECT C, SUM(D) WHERE A >= date '2025-06-01' AND A <= date '2025-06-30' GROUP BY C"),
ARRAYFORMULA(IFERROR(VLOOKUP(A2:A, shukei, 2, FALSE)))
)
▼実行結果 この数式だと以下のように表示されます。

数式の解説(2ステップで理解しよう!)
この数式は、2つのパートに分かれています。
LET(shukei, QUERY(...), ...)
LET
関数で、まずQUERY
の結果にshukei
(集計)という名前を付けています。QUERY
の中身は「カテゴリ(C列)ごとに、6月中の売上(D列)を合計してね」という命令です。
この時点で、数式の”内部”に以下のような見えない集計表が作られているイメージです。
カテゴリ | 合計売上 |
---|---|
果物 | 480 |
飲料 | 270 |
ARRAYFORMULA(IFERROR(VLOOKUP(A2:A, shukei, 2, FALSE)))
次に、LET
の最後の部分で、先ほどshukei
と名付けた”見えない集計表”を使ってVLOOKUP
を実行します。VLOOKUP(A2:A, shukei, ...)
: A列のカテゴリリストをキーにして、shukei
の中から売上合計を探してきます。ARRAYFORMULA
で、この処理をA2以下のすべての行に対して一気に実行しています。
QUERY
に慣れている方であれば、集計部分と検索部分が分かれているため、こちらのほうがロジックを追いやすいかもしれません。
まとめ:結局どっちを使えばいい?
作業列を使わない、スマートな解決策を2つご紹介しました。
どちらも強力ですが、あなたの好みやスキルに合わせて選ぶのが一番です。
方法 | 特徴 | こんな人におすすめ |
---|---|---|
MAP + SUMIFS | ・ARRAYFORMULA の発想に近い・ SUMIFS の書き方をそのまま使える | ・難しい関数を覚えたくない方 ・処理の流れをシンプルに保ちたい方 |
LET + QUERY + VLOOKUP | ・QUERY で高度な集計が可能・処理が分割されていて管理しやすい ・ LET で数式が整理される | ・QUERY 関数の扱いに慣れている方・集計条件が今後もっと複雑になりそうな方 |
結論として、まずは「MAP
+ SUMIFS
」の方法をお試しください。
ARRAYFORMULA
でSUMIFS
が使えずに困っていた方にとって、ほとんど同じ感覚で、より柔軟に使えるこの方法は、まさに求めていた答えのはずです。
ARRAYFORMULA
の壁を越えることで、あなたのスプレッドシートの世界はさらに広がります。面倒な作業は今日で卒業して、スマートなデータ集計を実現しましょう!