[GAS] オブジェクトの配列をreduceでGroupByのように集計する
はじめに
前回、GASで、Googleスプレッドシートの表のデータを集計する際、配列のreduceを使用して実装しました。
今回は、同じ表のデータを使用して、カテゴリーごとに集計します。
SQLで言うと、下記のようなSQL文になります。
SELECT category, Sum(price)
FROM "salesData"
GROUP BY category
条件
データは、Googleスプレッドシートから取得します。A列「name」、B列「category」、C列「price」のテーブル形式のデータです。
実装
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const values = sheet.getDataRange().getValues();
values.shift();
const salesData = [];
for (const value of values ) {
const [name,category,price] = value;
salesData.push({
name : name,
category : category,
price : price
});
}
console.log(salesData);
const groupby = salesData.reduce((acc,cur) => {
const found = acc.find(value => value.category === cur.category);
if ( found ){
found.price += cur.price;
}else{
acc.push({
category: cur.category,
price: cur.price,
});
}
return acc;
}, []);
console.log(groupby);
reduceメソッドのcallback関数内で、第2引数で渡された要素のcategoryが、第1引数の結果を蓄積するオブジェクトの配列内に存在するかどうか?を確認します。
存在する場合、そのオブジェクトのpriceに第2引数の要素のpriceを足し込みます。
存在しない場合、新規でオブジェクトを作成し、第1引数に追加します。
実行結果
category毎に集計結果が取得できています!
まとめ
今回は、GASで、Googleスプレッドシートの表のデータを、reduceでGroupByのように集計する実装方法について記載しました。
今回はcategory毎に金額を集計しましたが、個数を集計するなど、応用できます。
参考