テーブル内のレコードをカテゴリ別に合計し、カテゴリ別のフィールドに合計値を入れる

何を実現したいのかを書きましょう

テーブル内のレコードをカテゴリ別に合計し、カテゴリ別のフィールドに合計値を入れたいと思っています
第6回 テーブルの値を利用する(条件付きでデータを集計) – cybozu developer network (zendesk.com)
を参考にコードを書いてみました

「テーブル」というテーブル内に「区分」という文字列フィールドと「小計」という数値フィールドがあります
「区分」の値が「A」であれば、テーブル外のフィールド「A合計」という数値フィールドに区分Aのときの小計の合計値を
「区分」の値が「B」であれば、テーブル外のフィールド「B合計」という数値フィールドに区分Bのときの小計の合計値を
・・・・
「区分」の値が「F」であれば、テーブル外のフィールド「F合計」という数値フィールドに区分Fのときの小計の合計値を
それぞれ詳細画面を表示したときに代入したい

発生した問題やエラーメッセージを具体的に書きましょう

console.log(event)
を実行すると
undefined
になります

consoleでevent.record[‘テーブル’].value
を実行すると
VM1184:1 Uncaught TypeError: Cannot read properties of undefined (reading ‘record’)
at :1:7
になります

実行したコードをコピー&ペーストしましょう

(function() {
    'use strict';

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

        // テーブル内の各レコードを所属部署名ごとに集計する
        for (let i = 0; i < tableRecords.length; i++) {
            const department = tableRecords[i].value['区分'].value;
            if (!subTotals[department]) {
                subTotals[department] = 0;
            }
            const workCost = parseFloat(tableRecords[i].value['小計'].value);
            subTotals[department] += workCost;
        }

        // 集計結果を指定のフィールドに表示する
        const record = kintone.app.record.get();
        record.record['A合計'].value = subTotals['A'] || 0;
        record.record['B合計'].value = subTotals['B'] || 0;
        record.record['C合計'].value = subTotals['C'] || 0;
        record.record['D合計'].value = subTotals['D'] || 0;
        record.record['E合計'].value = subTotals['E'] || 0;
        record.record['F合計'].value = subTotals['F'] || 0;

        kintone.app.record.set(record);
    });
})();

どうして動作されないのかわからなく、アドバイスいただきたいです
よろしくお願いします

  • コードの内容について
    パッと拝見したところこのコードは動作しないと思います。理由は、レコード詳細画面表示イベントでkintone.app.record.set() で値を入れようとしてるからですね。
    リファレンスをみていただきたいのですが追加画面や編集画面でしか動作しません。
    詳細画面で値を変更するにはREST APIでやれなくはないですが、やりたいことを鑑みるとJSカスタマイズとしては保存するときのイベントで処理するのが定石だと思います。一度検討してみてください。
    (これだと return event時に値をセットできてればいいので楽です。)

  • undefinedになる件
    console.log(event) ですらundefinedになるとのことですが、これはちゃんとイベントハンドラ内に定義して動かしてますか?(consoleウィンドウで実行してもブレークポイントを設定するなり一時停止してない限り、イベントハンドラの処理が終了してしまってるので動作しないと思います。)
    デバッグの方法全般については一度この記事をみてみてくださいね。
    https://cybozudev.zendesk.com/hc/ja/articles/4977994758297-kintone-JavaScript-カスタマイズデバッグまとめ#introduction

「いいね!」 1

追加画面や編集画面でしか動作しないということで解決しました
ただ、kintoneの標準計算フィールドのように詳細画面や一覧画面の表示で反映させたいと思っていますが、不可能なことなのでしょうか?

よく見てもらえるとわかるかと思いますが、計算フィールドはむしろ、同様に作成画面・編集画面で動作しています。(作成・編集画面で入力が変わると計算される)
詳細画面と一覧画面は保存された値が表示されているだけです。

kintoneカスタマイズにおいては基本的に、レコード作成時・編集時・一覧画面からの編集時、など作成・編集状態やその保存直前にタイミングで値を操作することがほとんどです。
詳細画面からでもREST APIを利用することで変更ができます、前述の通り保存された値が表示されているだけなので、変更後リロードが必要です。

「いいね!」 2

横からすみません~!

詳細画面だったら、
スペースフィールド使っってみるとかいかがでしょう。
↓こちら参考になるかもしれません:eyes:

一覧画面だったら

一覧画面の行全部にボタン取り付けるカスタマイズとか、ぐぐってみたらあるので、探してみてください。
できないこともないかと思います。

ちなみに、不可能かもと思っても、あきらめないでやってます:pleading_face::v:

「いいね!」 2

jurippe様
アドバイスありがとうございます
スペースフィールドいいですね!
技のひとつとして覚えておきます
関連フィールドのカテゴリ別合計値を出せたらいいのですが、方法がわからなくテーブルに書き出してそのテーブル内のカテゴリ別合計値をフィールドに書き出し、カテゴリ別に出した合計値を使ってグラフなどに使用したいと思い今回このようにしました。
はじめて2年ほどたちますがまだまだ難しいことが多く頭を抱えています
ありがとうございました

「いいね!」 1

関連フィールドのカテゴリ別はカテゴリで集計するクエリを入れたら・・・できると思います。
↓〇〇別の集計だと、こちら、都道府県ごとに集計するコードがあったので参考になるかもしれません。

テーブルのカテゴリ別集計は標準機能でやるなら
↓こういうやり方もあります。

いろいろ試してみてください:laughing:

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