テーブルフィールド値の合計を計算し表示したい。

下図の通り、テーブルの時間フィールド、"TIME_1およびTIME_2の値が入力或いは変更された場合、TIME_1とTIME_2の合計値を再計算しテーブル下段の合計時間フィールド"TIME_1_TOTALおよびTIME_2_TOTALに表示したい。
このとき、TIME_1, TIME_2, TIME_1_TOTAL, TOME_2_TOTALは数値フィールドとして定義され、小数点第1位まで入力されることを想定している。

下記のコードを作成し、実行すると、以下のエラーが発生しています。

カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。

  • event.record[‘TIME_1_TOTAL’].value が不正です。
  • event.record[‘TIME_2_TOTAL’].value が不正です。

問題の原因と修正コード例をご教示頂けますと助かります。

(function() {
    "use strict";

    // フィールドが変更されたときのイベント
    kintone.events.on(['app.record.create.change.OT_1', 'app.record.create.change.OT_2', 'app.record.create.change.OT_3', 'app.record.create.change.OT_4', 'app.record.edit.change.OT_1', 'app.record.edit.change.OT_2', 'app.record.edit.change.OT_3', 'app.record.edit.change.OT_4'], function(event) {
        // 合計を計算して再表示する
        updateTotalAndRefresh(event);

        return event;
    });

    // 合計を計算して表示を更新する関数
    function updateTotalAndRefresh(event) {
        // テーブルのレコードデータを取得
        var ot1Total = 0;
        var ot2Total = 0;
        var ot3Total = 0;
        var ot4Total = 0;

        // 各OTの合計値を計算
        event.record.employeeTable.value.forEach(function(row) {
            ot1Total += parseFloat(row.value.OT_1.value);
            ot2Total += parseFloat(row.value.OT_2.value);
            ot3Total += parseFloat(row.value.OT_3.value);
            ot4Total += parseFloat(row.value.OT_4.value);
        });

        // 合計値をレコードにセット(数値に変換してからセット)
        event.record['OT_1_TOTAL'] = { 'value': parseFloat(ot1Total.toFixed(2)), 'type': 'NUMBER' };
        event.record['OT_2_TOTAL'] = { 'value': parseFloat(ot2Total.toFixed(2)), 'type': 'NUMBER' };
        event.record['OT_3_TOTAL'] = { 'value': parseFloat(ot3Total.toFixed(2)), 'type': 'NUMBER' };
        event.record['OT_4_TOTAL'] = { 'value': parseFloat(ot4Total.toFixed(2)), 'type': 'NUMBER' };
    }
})();

実際、フィールドにいれようとしている値がどうなっているのか、は確認されましたでしょうか?

event.record[‘TIME_1_TOTAL’].value が不正です。
event.record[‘TIME_2_TOTAL’].value が不正です。

気になったのは、
parseFloat(row.value.OT_1.value) などは、 row.value.OT_1.value が空欄だと NaN になってしまいそうな気がします。
Number(row.value.OT_1.value) などであればそれは回避できると思いますが一度どういう値がはいっているかはデバックしてみると良いと思います)

ご指摘ありがとうございました。
ot1Total += !isNaN(parseFloat(row.value.OT_1.value)) ? parseFloat(row.value.OT_1.value) : 0;のように空欄でNaNになる場合は、強制的に"0"を設定するようにすると、うまく行きました。

(function() {
    "use strict";

    // フィールドが変更されたときのイベント
    kintone.events.on(['app.record.create.change.OT_1', 'app.record.create.change.OT_2', 'app.record.create.change.OT_3', 'app.record.create.change.OT_4', 'app.record.edit.change.OT_1', 'app.record.edit.change.OT_2', 'app.record.edit.change.OT_3', 'app.record.edit.change.OT_4'], function(event) {
        // 合計を計算して再表示する
        updateTotalAndRefresh(event);

        return event;
    });

    // 合計を計算して表示を更新する関数
    function updateTotalAndRefresh(event) {
        // テーブルのレコードデータを取得
        var ot1Total = 0;
        var ot2Total = 0;
        var ot3Total = 0;
        var ot4Total = 0;

        // テーブルが空でないことを確認
        if (event.record.employeeTable.value.length > 0) {
            // 各OTの合計値を計算
            event.record.employeeTable.value.forEach(function(row) {
                // OTの値が数値であることを確認し、NaNの場合は0として扱う
                ot1Total += !isNaN(parseFloat(row.value.OT_1.value)) ? parseFloat(row.value.OT_1.value) : 0;
                ot2Total += !isNaN(parseFloat(row.value.OT_2.value)) ? parseFloat(row.value.OT_2.value) : 0;
                ot3Total += !isNaN(parseFloat(row.value.OT_3.value)) ? parseFloat(row.value.OT_3.value) : 0;
                ot4Total += !isNaN(parseFloat(row.value.OT_4.value)) ? parseFloat(row.value.OT_4.value) : 0;
            });
        }

        // 合計値をレコードにセット(文字列としてセット)
        event.record['OT_1_TOTAL'] = { 'value': ot1Total.toFixed(1), 'type': 'NUMBER' };
        event.record['OT_2_TOTAL'] = { 'value': ot2Total.toFixed(1), 'type': 'NUMBER' };
        event.record['OT_3_TOTAL'] = { 'value': ot3Total.toFixed(1), 'type': 'NUMBER' };
        event.record['OT_4_TOTAL'] = { 'value': ot4Total.toFixed(1), 'type': 'NUMBER' };
    }
})();

「いいね!」 1

Numberの暗黙的な変換に頼らず、 isNaNなら0だよ、という自明で、硬派で非常にいいと感じました!!!!!!!

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