[GAS] オブジェクトの配列をreduceを使って集計する
はじめに
GASで、Googleスプレッドシートの表のデータを集計する際、配列のreduceを使用して実装しました。
うまく動作しなかったコード、修正して正しく動作したコードを、備忘録として載せていきます。
条件
データは、Googleスプレッドシートから取得します。A列「name」、B列「category」、C列「price」のテーブル形式のデータです。
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);
実行結果
ログを見ると、「NaN」となっています。
計算されない理由は、reduceの第1引数の渡し方。第1引数は、「callbackの戻り値を蓄積する」変数です。前回の配列のpriceを渡しているため、正しく計算できませんでした。
実装(修正後)
const total = salesData.reduce((acc, cur) => acc + cur.price,0);
修正したのは、
・reduceの第1引数をcallback関数内で設定する箇所を変更
・reduceメソッドに初期値を設定
の2箇所です。
実行結果
合計が「1000」と出力されています。集計できました!
まとめ
下記サイトに、「オブジェクトの配列の値の合計値を出す」というサンプルコードが載ってます。
この記事が気に入ったらサポートをしてみませんか?