条件付きでテーブルからテーブルにコピー

テーブルからテーブルにコピーしたいのです.
チェックボックスフィールドに✓が入ったのをトリガーとして
テーブル1の商品コードがテーブル2の商品コードと同じだった場合
テーブル1の数量をテーブル2の数量にコピーしたいと考えています。
以下のコードを作成してみましたが
if (table1Values[i][table1materialCode].value === table2Values[i]
以下のエラーが出ます。
Uncaught TypeError: Cannot read properties of undefined (reading ‘value’)
どうすればよいのかアドバイスいただけますでしょうか?

kintone.events.on(['app.record.edit.change.コピー', 'app.record.create.change.コピー'], function (event) {
    // レコードの値を取得
    var record = event.record;

    // テーブル1とテーブル2のフィールドコード
    var table1 = 'テーブル';
    var table2 = 'テーブル_0';
    var table1materialCode = '商品コード';
    var table2materialCode = '商品コード_0';
    var table1num = '数値';
    var table2num = '数値_0';
    var table1Values = record[table1].value;
    var table2Values = record[table2].value;
    var check = record['コピー'].value;

    // チェックボックスの値が✓の場合のみ処理を実行
    if (record['コピー'].value[0] === '✓') {
        // 商品コードが一致する場合、テーブル1の数量をテーブル2の数量にコピー
        for (var i = 0; i < table1Values.length; i++) {
            if (table1Values[i][table1materialCode].value === table2Values[i][table2materialCode].value) {
                table2Values[i][table2num].value = table1Values[i][table1num].value;
            }
        }
    }

    // コピー先テーブルを初期化
    record[table2].value = [];
    // コピー先テーブルの各行に新しいレコードを追加
    for (var j = 0; j < table1Values.length; j++) {
        var newRow = {};
        newRow[table2materialCode] = { value: table1Values[j][table1materialCode].value };
        newRow[table2num] = { value: table1Values[j][table1num].value };
        record[table2].value.push(newRow);
    }

    return event;
});


.value を読み込もうとしたが、読み込めないということでして
例えば、

table2Values[i][table2materialCode].value の箇所がおかしい場合は、table2Values[i][table2materialCode] まででundefinedになってるなどがありうるとお思います。
Devtoolsなどでブレイクポイントをはって、本当にデータがあるのかは実たほうがいいかと思います。
https://cybozu.dev/ja/id/42b1d7ce01fd5d9b53dbf4df/#methods-list-4

現時点で気になるのは、テーブル1のlengthをつかってテーブル2をループしようとしていますが、
テーブル1と2のlengthがそれぞれ違う場合はうまくいかなさそうにみえますね(必ず同じ前提とかであれば別ですが)

mura様
アドバイスありがとうございます!
ブレイクポイントで確認したところ、
おっしゃる通りundefinedになっていました。
table2Values[i]ここまでを触るとテーブルの要素が出てきて、
商品コードに確かに値があることが確認できました。
table2Values[i][table2materialCode]ここを触るとundefinedになります。
という事は[table2materialCode]の指定の仕方が間違っているのでしょうか?

現時点で気になるのは、テーブル1のlengthをつかってテーブル2をループしようとしていますが、
テーブル1と2のlengthがそれぞれ違う場合はうまくいかなさそうにみえますね
⇒確かにおっしゃる通り、ほとんどの場合はテーブル2の方が行数が多いはずです。なのでループの条件をテーブル2の行数に変えてみました。
これでどうでしょうか?

kintone.events.on(['app.record.edit.change.コピー', 'app.record.create.change.コピー'], function (event) {
    // レコードの値を取得
    var record = event.record;

    // テーブル1とテーブル2のフィールドコード
    var table1 = 'テーブル';
    var table2 = 'テーブル_0';
    var table1materialCode = '商品コード';
    var table2materialCode = '商品コード_0';
    var table1num = '数値';
    var table2num = '数値_0';
    var table1Values = record[table1].value;
    var table2Values = record[table2].value;
    var check = record['コピー'].value;

    // チェックボックスの値が✓の場合のみ処理を実行
    if (record['コピー'].value[0] === '✓') {
        // 商品コードが一致する場合、テーブル1の数量をテーブル2の数量にコピー
        for (var i = 0; i < table2Values.length; i++) {
            //console.log(table1Values[i][商品コード].value)
            //console.log(table1Values[i][table1materialCode].value);
            if (table1Values[i][table1materialCode].value === table2Values[i][table2materialCode].value) {
                table2Values[i][table2num].value = table1Values[i][table1num].value;
            }
        }
    }

    // コピー先テーブルを初期化
    record[table2].value = [];
    // コピー先テーブルの各行に新しいレコードを追加
    for (var j = 0; j < table1Values.length; j++) {
        var newRow = {};
        newRow[table2materialCode] = { value: table1Values[j][table1materialCode].value };
        newRow[table2num] = { value: table1Values[j][table1num].value };
        record[table2].value.push(newRow);
    }

    return event;
});

気づくのがおくれてしまいました。

table2Values[i][table2materialCode]ここを触るとundefinedになります。
という事は[table2materialCode]の指定の仕方が間違っているのでしょうか?

そうですね、 table2materialCode 、つまり、 table2に商品コード_0 のフィールドコードがないということではないでしょうかね。

⇒確かにおっしゃる通り、ほとんどの場合はテーブル2の方が行数が多いはずです。なのでループの条件をテーブル2の行数に変えてみました。

これだと、テーブル1側で今度はエラーがでるので、それはそれで問題かなとおもいます。
一つのforの中で無理やり2つのテーブルを触ることをやらないほうがいいかなとおもいますね。

ありがとうございます。
色々調べたところMapオブジェクトを使用するとよいとの事なので
以下の様に修正いたしました。

kintone.events.on(['app.record.edit.change.コピー', 'app.record.create.change.コピー'], function (event) {
    var record = event.record;

    var table1 = 'テーブル';
    var table2 = 'テーブル_0';
    var table1materialCode = '商品コード';
    var table1num = '数値';
    var table2materialCode = '商品コード_0';
    var table2num = '数値_0';

    var table1Values = record[table1].value;
    var table2Values = record[table2].value;

    // チェックボックスに✓が含まれる場合のみ処理を実行
    if (record['コピー'].value.includes('✓')) {
        // テーブル1のデータをマップに格納
        const productMap = new Map();
        table1Values.forEach(row => {
            productMap.set(row.value[table1materialCode].value, row.value[table1num].value);
        });

        // テーブル2の各行を走査して、マップに基づいて数量を更新
        table2Values.forEach(row => {
            const productCode = row.value[table2materialCode].value;
            if (productMap.has(productCode)) {
                // マップに商品コードが存在する場合、数量を更新
                row.value[table2num].value = productMap.get(productCode);
            } else {
                // マップに商品コードが存在しない場合、数量を空欄にする
                row.value[table2num].value = "";
            }
        });
    }

    return event;
});

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