# テーブルのデータを商品ごとに集計しテーブルに出力したい

**URL:** https://community.cybozu.dev/t/topic/8526
**Category:** kintone 開発相談
**Created:** [2023 年 12 月 27 日午前 7:16 UTC](https://community.cybozu.dev/t/topic/8526 "2023-12-27T07:16:44Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![seaflour](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/seaflour/32/1958_2.png) [@seaflour](https://community.cybozu.dev/u/seaflour)
#### Post date: [2023 年 12 月 27 日午前 7:16 UTC](https://community.cybozu.dev/t/topic/8526/1 "2023-12-27T07:16:44Z")

</div>

テーブルのデータを商品ごとに集計しテーブル2に出力したいのですが  
いくつか試してみましたがconsole.log(テーブル2)で確認したところテーブル2は空でした。お力添えをお願いいたします。

```javascript
(() => {
  'use strict';

  kintone.events.on(
    [
      'app.record.create.show',
      'app.record.detail.show',
      'app.record.edit.show',
      'app.record.print.show',
    ], function (event) {
      const subTotals = {};
      const tableRecords = event.record.テーブル.value;

      // テーブル内の各レコードを商品名ごとに集計する
      for (let i = 0; i < tableRecords.length; i++) {
        const productName = tableRecords[i].value['商品名'].value;
        if (!subTotals[productName]) {
          subTotals[productName] = 0;
        }

        subTotals[productName] += parseFloat(tableRecords[i].value['数量'].value);
      }

      // 集計結果を新しいテーブルレコードにセットする
      const table2Records = [];
      for (const productName in subTotals) {
        if (Object.prototype.hasOwnProperty.call(subTotals, productName)) {
          const record = {
            value: {
              '品名': {
                value: productName,
                type: 'SINGLE_LINE_TEXT',
              },
              '合計数量': {
                value: subTotals[productName],
                type: 'NUMBER',
              },
            },
          };
          table2Records.push(record);
        }
      }
      console.log(テーブル2)
      // 新しいテーブルレコードを更新する
      record.テーブル2.value.push(table2Records);

      return event;
    });
})();

```

---

<div class="post-metadata">

### Author: ![pomo](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/pomo/32/465_2.png) [@pomo](https://community.cybozu.dev/u/pomo)
#### Post date: [2023 年 12 月 28 日午前 12:43 UTC](https://community.cybozu.dev/t/topic/8526/2 "2023-12-28T00:43:05Z")

</div>

> console.log(テーブル2)

を

```javascript
console.log(table2Records)

```

ということでしょうかね

---

<div class="post-metadata">

### Author: ![seaflour](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/seaflour/32/1958_2.png) [@seaflour](https://community.cybozu.dev/u/seaflour)
#### Post date: [2023 年 12 月 28 日午前 2:25 UTC](https://community.cybozu.dev/t/topic/8526/3 "2023-12-28T02:25:32Z")

</div>

pomo様  
そうです！少し手を加えたときに修正ミスしてしまいました。  
何故かtable2Recordsが空データなのです。

---

<div class="post-metadata">

### Author: ![pomo](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/pomo/32/465_2.png) [@pomo](https://community.cybozu.dev/u/pomo)
#### Post date: [2023 年 12 月 28 日午前 3:19 UTC](https://community.cybozu.dev/t/topic/8526/4 "2023-12-28T03:19:37Z")

</div>

最後のテーブル2への展開だけ変更しました。  
追加と編集でしかデータ変更はできないのでeventsのdetailとprintは外しました。こちらでいかがでしょうかね

```javascript
  (() => {
    'use strict';

    kintone.events.on(
      [
        'app.record.create.show',
        'app.record.edit.show',
      ], function (event) {
        const subTotals = {};
        const tableRecords = event.record.テーブル.value;

        // テーブル内の各レコードを商品名ごとに集計する
        for (let i = 0; i < tableRecords.length; i++) {
          const productName = tableRecords[i].value['商品名'].value;
          if (!subTotals[productName]) {
            subTotals[productName] = 0;
          }

          subTotals[productName] += parseFloat(tableRecords[i].value['数量'].value);
        }

        // 集計結果を新しいテーブルレコードにセットする
        const table2Records = [];
        for (const productName in subTotals) {
          if (Object.prototype.hasOwnProperty.call(subTotals, productName)) {
            const record = {
              value: {
                '品名': {
                  value: productName,
                  type: 'SINGLE_LINE_TEXT',
                },
                '合計数量': {
                  value: subTotals[productName],
                  type: 'NUMBER',
                },
              },
            };
            table2Records.push(record);
          }
        }
        console.log(table2Records)

        // 新しいテーブルレコードを更新する
        event.record.テーブル2.value = [...event.record.テーブル2.value, ...table2Records]
        return event;
      });
  })();

```

---

<div class="post-metadata">

### Author: ![seaflour](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/seaflour/32/1958_2.png) [@seaflour](https://community.cybozu.dev/u/seaflour)
#### Post date: [2023 年 12 月 28 日午前 7:14 UTC](https://community.cybozu.dev/t/topic/8526/5 "2023-12-28T07:14:40Z")

</div>

pomo様  
ご提示ありがとうございます！  
テーブルにデータを表示する事は出来ましたが  
保存する度にテーブル行数が増えてしまうのでテーブル2にデータを追加する前に  
初期化するコードを入れてみたのですがうまく動きませんでした。  
どうすればよいでしょうか？

```javascript
(() => {
    'use strict';

    kintone.events.on(
      [
        'app.record.create.show',
        'app.record.edit.show',
      ], function (event) {
        const subTotals = {};
        const tableRecords = event.record.テーブル.value;

        // テーブル内の各レコードを商品名ごとに集計する
        for (let i = 0; i < tableRecords.length; i++) {
          const productName = tableRecords[i].value['商品名'].value;
          if (!subTotals[productName]) {
            subTotals[productName] = 0;
          }

          subTotals[productName] += parseFloat(tableRecords[i].value['数量'].value);
        }

        // 集計結果を新しいテーブルレコードにセットする
        const table2Records = [];
        for (const productName in subTotals) {
          if (Object.prototype.hasOwnProperty.call(subTotals, productName)) {
            const record = {
              value: {
                '品名': {
                  value: productName,
                  type: 'SINGLE_LINE_TEXT',
                },
                '合計数量': {
                  value: subTotals[productName],
                  type: 'NUMBER',
                },
              },
            };
            table2Records.push(record);
          }
        }
        console.log(table2Records)

       // コピー先テーブルを初期化
        initRow("テーブル2");

        // 新しいテーブルレコードを更新する
        event.record.テーブル2.value = [...event.record.テーブル2.value, ...table2Records]
        return event;
      });
  })();

// テーブル初期化関数
    function initRow(table_name) {
        let record = kintone.app.record.get().record;
        for(let i = record[table_name].value.length; i >= 0; i--){
            record[table_name].value.splice(i, 1);
        }
        kintone.app.record.set({record: record});
    }

```

---

<div class="post-metadata">

### Author: ![pomo](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/pomo/32/465_2.png) [@pomo](https://community.cybozu.dev/u/pomo)
#### Post date: [2024 年 1 月 5 日午前 12:22 UTC](https://community.cybozu.dev/t/topic/8526/6 "2024-01-05T00:22:32Z")

</div>

initRow実行時にコンソールのエラーにkintone.app.record.get()できないよと出てると思うので、initRowにイベントのrecordを渡して、処理終わったら返してあげてください。

```javascript
 (() => {
    'use strict';

    kintone.events.on(
      [
        'app.record.create.show',
        'app.record.edit.show',
      ], function (event) {
        const subTotals = {};
        const tableRecords = event.record.テーブル.value;

        // テーブル内の各レコードを商品名ごとに集計する
        for (let i = 0; i < tableRecords.length; i++) {
          const productName = tableRecords[i].value['商品名'].value;
          if (!subTotals[productName]) {
            subTotals[productName] = 0;
          }

          subTotals[productName] += parseFloat(tableRecords[i].value['数量'].value);
        }

        // 集計結果を新しいテーブルレコードにセットする
        const table2Records = [];
        for (const productName in subTotals) {
          if (Object.prototype.hasOwnProperty.call(subTotals, productName)) {
            const record = {
              value: {
                '品名': {
                  value: productName,
                  type: 'SINGLE_LINE_TEXT',
                },
                '合計数量': {
                  value: subTotals[productName],
                  type: 'NUMBER',
                },
              },
            };
            table2Records.push(record);
          }
        }
        console.log(table2Records)

       // コピー先テーブルを初期化
        event.record = initRow("テーブル2", event.record);

        // 新しいテーブルレコードを更新する
        event.record.テーブル2.value = [...event.record.テーブル2.value, ...table2Records]
        return event;
      });
  })();

// テーブル初期化関数-イベントのレコードを渡す
    function initRow(table_name,record) {
        for(let i = record[table_name].value.length; i >= 0; i--){
            record[table_name].value.splice(i, 1);
        }
        return record
    } 

```

---

<div class="post-metadata">

### Author: ![seaflour](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/seaflour/32/1958_2.png) [@seaflour](https://community.cybozu.dev/u/seaflour)
#### Post date: [2024 年 1 月 9 日午前 4:40 UTC](https://community.cybozu.dev/t/topic/8526/7 "2024-01-09T04:40:53Z")

</div>

pomo様  
ご丁寧に教えていただきありがとうございます！  
前回のイベントだと追加したデータの数量が集計されなかった為  
保存時に行う様修正いたしました。  
おかげさまで無事集計する事が出来ました！  
本当にありがとうございました。

```javascript
(() => {
    'use strict';

    kintone.events.on(
      [
        'app.record.create.submit',//レコード追加画面で保存する時
        'app.record.edit.submit'//レコード詳細画面で保存するとき
      ], function (event) {
        const subTotals = {};
        const tableRecords = event.record.テーブル.value;

        // テーブル内の各レコードを商品名ごとに集計する
        for (let i = 0; i < tableRecords.length; i++) {
          const productName = tableRecords[i].value['商品名'].value;
          if (!subTotals[productName]) {
            subTotals[productName] = 0;
          }

          subTotals[productName] += parseFloat(tableRecords[i].value['数量'].value);
        }

        // 集計結果を新しいテーブルレコードにセットする
        const table2Records = [];
        for (const productName in subTotals) {
          if (Object.prototype.hasOwnProperty.call(subTotals, productName)) {
            const record = {
              value: {
                '品名': {
                  value: productName,
                  type: 'SINGLE_LINE_TEXT',
                },
                '合計数量': {
                  value: subTotals[productName],
                  type: 'NUMBER',
                },
              },
            };
            table2Records.push(record);
          }
        }
        console.log(table2Records)

       // コピー先テーブルを初期化
        event.record = initRow("テーブル2", event.record);

        // 新しいテーブルレコードを更新する
        event.record.テーブル2.value = [...event.record.テーブル2.value, ...table2Records]
        return event;
      });
  })();

// テーブル初期化関数-イベントのレコードを渡す
    function initRow(table_name,record) {
        for(let i = record[table_name].value.length; i >= 0; i--){
            record[table_name].value.splice(i, 1);
        }
        return record
    }

```

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)
#### Post date: [2024 年 1 月 12 日午前 4:41 UTC](https://community.cybozu.dev/t/topic/8526/8 "2024-01-12T04:41:31Z")

</div>

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。
