GAS reduce完全ガイド|Google Apps Scriptの集計処理・グルーピング・実務テクニックを徹底解説

2026年5月22日金曜日

GAS JavaScript プログラミング

t f B! P L

GAS reduce完全ガイド|Google Apps Scriptの集計処理・グルーピング・実務テクニックを徹底解説

Google Apps Script(GAS)を書いていると、ある瞬間から「for文ばかり書いている自分」に気づきます。

旅行中に現地のバス路線を覚えると、一気に移動がラクになる感覚がありますよね。 GASにも同じような「一段上の景色」があります。

その代表格がreduce(集計処理)です。

reduceを使いこなせるようになると、単なる配列処理から一歩抜け出し、売上集計、レポート作成、データ分析、グルーピングなど、実務に近いコードを書けるようになります。

今回はGAS実務で頻出するreduceを、初心者でも理解しやすいよう体系的に整理していきます。


reduceとは?Google Apps Scriptで重要な集計処理

reduceは簡単に言うと、

配列を「1つの結果」にまとめるメソッド

JavaScript標準機能なので、Google Apps Scriptでもそのまま利用できます。

reduceのイメージ

[1,2,3,4]
↓
10(合計)

配列全体を順番に処理しながら、1つの結果へ圧縮していくイメージです。

reduce基本構文

array.reduce(function(acc, cur){

 return acc + cur;

}, 初期値);
引数 意味
acc 累積値(これまでの集計結果)
cur 現在処理している値
初期値 最初のスタート地点
ポイント
reduceは「現在の値」と「今までの結果」を合体させ続ける仕組みです。

GAS reduce基本例|合計・平均を作る

合計を求める

let list=[10,20,30];

let sum=list.reduce((acc,cur)=>{

 return acc+cur;

},0);

Logger.log(sum);

//60

最初はacc=0から始まり、

  • 0+10=10
  • 10+20=30
  • 30+30=60

という流れで処理されます。

平均値を求める

let avg=
list.reduce(
(acc,cur)=>acc+cur,
0
)/list.length;

合計を出して要素数で割るだけです。


Google Apps Script実務|スプレッドシート集計にreduceを使う

GASを書いていると避けて通れないのがスプレッドシート処理。 ここでreduceが真価を発揮します。

const data=
sheet.getRange("B2:B10")
.getValues();

const sum=
data.reduce((acc,row)=>{

 return acc+row[0];

},0);
重要
getValues()は2次元配列になります。
そのため row ではなく row[0] を使います。

初心者時代、この2次元配列で何度もハマりました。 「数字なのに足せない…」と思ったら、大体ここです。


GAS reduce実務コア|2次元配列の売上集計

実務で最も多いのが「一覧データから数字を集計する」ケースです。

const data=[

["商品","売上"],
["A",100],
["B",200]

];

const total=
data.slice(1)
.reduce((acc,row)=>{

 return acc+row[1];

},0);

slice(1)でヘッダーを除外しているのがポイントです。

これを覚えるだけで、売上管理やCSV処理が一気にラクになります。


map・filter・reduceの違い

メソッド 用途
map 変換
filter 絞り込み
reduce 集約・集計

イメージとしては、

  • map → 1件ずつ加工
  • filter → 条件で選別
  • reduce → 全体を設計する

reduceは「全部できる万能ナイフ」のような存在です。


reduce実務パターン集|GASで頻出する書き方

件数カウント

const count=
data.reduce((acc,row)=>{

 if(row[1]>=30){

  acc++;

 }

 return acc;

},0);

最大値取得

const max=
list.reduce((acc,cur)=>{

 return acc>cur
 ?acc
 :cur;

},list[0]);

条件付き合計

const sum=
data.reduce((acc,row)=>{

 if(row[0]==="A"){

  return acc+row[1];

 }

 return acc;

},0);

カテゴリ別集計や部署別売上で頻出します。


reduceでグルーピングする|SQL GROUP BYの代替

ここから一気に実務レベルです。

const grouped=
data.reduce((acc,row)=>{

 const key=row[0];

 if(!acc[key]){

  acc[key]=0;

 }

 acc[key]+=row[1];

 return acc;

},{});

結果

{

"A":300,

"B":200

}

SQLを書いたことがある人なら気づくと思います。

GROUP BYとほぼ同じ考え方

reduceを使える人は、データ構造を組み立てる力が強くなります。


GAS売上集計テンプレート

function summary(){

 const sheet=
 SpreadsheetApp
 .getActiveSpreadsheet()
 .getActiveSheet();

 const data=
 sheet.getDataRange()
 .getValues();

 const result=
 data.slice(1)
 .reduce((acc,row)=>{

 const category=row[0];
 const amount=row[1];

 if(!acc[category]){

  acc[category]=0;

 }

 acc[category]+=amount;

 return acc;

 },{});

 Logger.log(result);

}

実務ではこの形をベースに、日別集計や商品別分析へ発展させるケースが多いです。


reduceの初期値設計パターン

初期値 用途
0 数値集計
[] 配列生成
{} グルーピング

初期値をどう設計するか。 ここがreduce理解の核心です。


reduce応用テクニック

配列生成

let result=
list.reduce((acc,cur)=>{

 if(cur>10){

  acc.push(cur);

 }

 return acc;

},[]);

2次元配列を1次元へ変換

let flat=
data.reduce((acc,row)=>{

 return acc.concat(row);

},[]);

統計情報をまとめて取得

const stats=
data.reduce((acc,row)=>{

 acc.count++;

 acc.sum+=row[1];

 if(row[1]>acc.max){

  acc.max=row[1];

 }

 return acc;

},{

count:0,
sum:0,
max:0

});

件数・合計・最大値を1回のループで取得できます。 実務でかなり強力です。


reduceで初心者がハマるミス3選

初期値を書かない

reduce((acc,cur)=>{})

バグの原因になります。 必ず初期値を意識しましょう。

return忘れ

acc+cur

returnがないとaccが更新されません。

2次元配列を忘れる

row[1] ← OK

row ← NG

まとめ|GASで強い人はreduceでデータ構造を作れる

reduceの本質はシンプルです。

配列 → 1つの結果へ集約する

しかし実務では単なる合計では終わりません。

  • 売上集計
  • グルーピング
  • レポート生成
  • 統計処理
  • 分析データ作成

GASが強い人ほど、reduceを自然使っています。

mapが「1行処理」なら、 reduceは「全体設計」。

旅行で地図全体を見渡せる人ほど移動が上手いように、GASでもデータ全体を組み立てられる人ほどコードは洗練されていきます。

まずは合計処理から。 慣れてきたらグルーピングへ。 そこまで行けると、GAS実務の景色がかなり変わります。

このブログを検索

Blog Archive

Welcome



旅するWebライター「Hide」のブログへようこそ!

2年間の世界一周を終え、今は旅の思い出を言葉にしながら、AIやプログラミングという新しい冒険を楽しんでいます。最新技術を味方につけて、もっと自由でクリエイティブな発信を続けていきます!

人気の投稿

QooQ