見出し画像

[GAS] オブジェクトの配列をreduceでGroupByのように集計する

はじめに

前回、GASで、Googleスプレッドシートの表のデータを集計する際、配列のreduceを使用して実装しました。

今回は、同じ表のデータを使用して、カテゴリーごとに集計します。
SQLで言うと、下記のようなSQL文になります。

SELECT category, Sum(price)
FROM "salesData"
GROUP BY category

条件

データは、Googleスプレッドシートから取得します。A列「name」、B列「category」、C列「price」のテーブル形式のデータです。

画像1

実装

 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引数に追加します。

実行結果

画像2

category毎に集計結果が取得できています!

まとめ

今回は、GASで、Googleスプレッドシートの表のデータを、reduceでGroupByのように集計する実装方法について記載しました。

今回はcategory毎に金額を集計しましたが、個数を集計するなど、応用できます。

参考




この記事が気に入ったらサポートをしてみませんか?