seaflour
(seaflour)
1
テーブルからテーブルにコピーしたいのです.
チェックボックスフィールドに✓が入ったのをトリガーとして
テーブル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;
});
mura
2
.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がそれぞれ違う場合はうまくいかなさそうにみえますね(必ず同じ前提とかであれば別ですが)
seaflour
(seaflour)
3
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;
});
mura
4
気づくのがおくれてしまいました。
table2Values[i][table2materialCode]ここを触るとundefinedになります。
という事は[table2materialCode]の指定の仕方が間違っているのでしょうか?
そうですね、 table2materialCode
、つまり、 table2に商品コード_0
のフィールドコードがないということではないでしょうかね。
⇒確かにおっしゃる通り、ほとんどの場合はテーブル2の方が行数が多いはずです。なのでループの条件をテーブル2の行数に変えてみました。
これだと、テーブル1側で今度はエラーがでるので、それはそれで問題かなとおもいます。
一つのforの中で無理やり2つのテーブルを触ることをやらないほうがいいかなとおもいますね。
seaflour
(seaflour)
5
ありがとうございます。
色々調べたところ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;
});
system
(system)
クローズされました:
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。