サブテーブルの条件付き合計

Javascript初心者です。

色々試しても全くできなかったので質問させてください。

実現したい事:当月支払済明細 テーブルにある 税込 フィールド の1行目から24行目までの合計を

P1小計 というテーブル外にある文字列フィールドに出力したい

デベロッパーツールのエラー:Uncaught TypeError: Cannot read properties of undefined (reading ‘value’)

試したコードは下記です。

(function() {
  ‘use strict’;
  kintone.events.on(‘app.record.edit.submit’, function(event) {
    const tableRecords = event.record.当月支払済明細.value;
    
    let sum = 0;
    for(let i = 0; i <= 23; i++){
      sum += tableRecords[i].value[‘税込’].value;
    }
    event.record.P1小計.value = sum;
    return event;
  });
})();

 

どなたか、ご教授いただけないでしょうか?

Cannot read properties of undefined (reading ‘value’) のエラーが出る場合、valueまでアクセスできないという意味なので、慣れない内はreading 'value’となっている部分の手前の部分が存在していないと捉えると良いでしょう。早い話が存在しないフィールドコードを指定した時に出るエラーで、どこかのフィールドコード指定が間違っています。デベロッパーツールのエラー箇所をクリックするとエラーを起こしている場所を表示できるので、その部分のフィールドコードに問題があると思います。

考え方として、レコード(オブジェクト)は

event: {
record: {
'フィールド1': {
type: '',
value: ''
},
'フィールド2': {
type: '',
value: ''
}
}
}

こんな形になっていて、フィールド1のvalueにアクセスしたい場合は「event.record.フィールド1.value」と1階層ずつ指定してvalueまでアクセスしていくことになるんですが、例えばフィールド3というフィールドがないにも関わらず「event.record.フィールド3.value」と書いた場合、「event.record.フィールド3」の時点でundefined(未定義/存在しない)になり、その存在しないものに対して更にvalueを参照しようとしてエラーが起きている、という状態です。

 

また、

    for(let i = 0; i <= 23; i++){
      sum += tableRecords[i].value['税込'].value;
    }

この部分も次の問題になると思います。

フィールドの値は数値フィールドでも文字列になるので、このまま実装するとP1小計には計算した数字ではなく結合した文字列が出力されます(1~24行目全てに1を入れた場合は24ではなく111111111111111111111111になります)。

回避方法は調べると色んな方法が出て来ると思いますが、こちらのスレッドが参考になるかもしれません。

 

次に、必ず1~24行までの全ての数値フィールドに値が入っていれば問題なく動くと思いますが、1行でも空白行があった場合はNaN(数字ではないという意味で、数字に対してundefinedを加算しようとするためこうなります)になると思います。

空白の場合に無視する方法や、値がある場合のみ加算するといった方法を取る必要があります。undefinedと空文字のスマートな判定が参考になると思います。

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