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実務の景色がかなり変わります。







0 件のコメント:
コメントを投稿