GoogleスプレッドシートのARRAYFORMULAでSUMIFSが使えない! 代替策を徹底解説

皆さん、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つの数式を入れるだけで実現したいのです。

まさにARRAYFORMULASUMIFSが使いたくなる場面ですよね。

解決策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が使えるの? と思った方、鋭いですね!

実は、MAPBYROWといった新しい関数(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つのパートに分かれています。

  1. LET(shukei, QUERY(...), ...)
    LET関数で、まずQUERYの結果にshukei(集計)という名前を付けています。
    QUERYの中身は「カテゴリ(C列)ごとに、6月中の売上(D列)を合計してね」という命令です。
    この時点で、数式の”内部”に以下のような見えない集計表が作られているイメージです。
カテゴリ合計売上
果物480
飲料270
  1. ARRAYFORMULA(IFERROR(VLOOKUP(A2:A, shukei, 2, FALSE)))
    次に、LETの最後の部分で、先ほどshukeiと名付けた”見えない集計表”を使ってVLOOKUPを実行します。
    • VLOOKUP(A2:A, shukei, ...): A列のカテゴリリストをキーにして、shukeiの中から売上合計を探してきます。
    • ARRAYFORMULAで、この処理をA2以下のすべての行に対して一気に実行しています。

QUERYに慣れている方であれば、集計部分と検索部分が分かれているため、こちらのほうがロジックを追いやすいかもしれません。

まとめ:結局どっちを使えばいい?

作業列を使わない、スマートな解決策を2つご紹介しました。
どちらも強力ですが、あなたの好みやスキルに合わせて選ぶのが一番です。

方法特徴こんな人におすすめ
MAP + SUMIFSARRAYFORMULAの発想に近い
SUMIFSの書き方をそのまま使える
・難しい関数を覚えたくない方
・処理の流れをシンプルに保ちたい方
LET + QUERY + VLOOKUPQUERYで高度な集計が可能
・処理が分割されていて管理しやすい
LETで数式が整理される
QUERY関数の扱いに慣れている方
・集計条件が今後もっと複雑になりそうな方

結論として、まずは「MAP + SUMIFS」の方法をお試しください。

ARRAYFORMULASUMIFSが使えずに困っていた方にとって、ほとんど同じ感覚で、より柔軟に使えるこの方法は、まさに求めていた答えのはずです。

ARRAYFORMULAの壁を越えることで、あなたのスプレッドシートの世界はさらに広がります。面倒な作業は今日で卒業して、スマートなデータ集計を実現しましょう!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

1994年生まれ。福岡出身、福岡育ち、福岡在住。
エンジニアを数年経験し、現在は事業会社でデータ分析業務に従事しています。
好きな物:猫、ラーメン
取得資格:基本情報技術者、G検定、統計検定2級

目次