見出し画像

[GAS] オブジェクトの配列をreduceを使って集計する

はじめに

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

うまく動作しなかったコード、修正して正しく動作したコードを、備忘録として載せていきます。

条件

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

画像1

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 total = salesData.reduce((acc, cur) => acc.price + cur.price);
 console.log(total);

実行結果

画像2

ログを見ると、「NaN」となっています。
計算されない理由は、reduceの第1引数の渡し方。第1引数は、「callbackの戻り値を蓄積する」変数です。前回の配列のpriceを渡しているため、正しく計算できませんでした。

実装(修正後)

 const total = salesData.reduce((acc, cur) => acc + cur.price,0);

修正したのは、
・reduceの第1引数をcallback関数内で設定する箇所を変更
・reduceメソッドに初期値を設定
の2箇所です。

実行結果

画像3

合計が「1000」と出力されています。集計できました!

まとめ

下記サイトに、「オブジェクトの配列の値の合計値を出す」というサンプルコードが載ってます。



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