お世話になっております。
編集画面にて、ドロップダウンが「現金繰越」を選択されたときに、テーブル外の数値フィールドの値をテーブル内の数値フィールドにコピーしたいと考えております。
(フィールドコード)
ドロップダウン=品目
コピー元=前月繰越
コピー先=金額
(コード)
(function () {
'use strict';
kintone.events.on('app.record.edit.change.品目', () => {
const row = event.changes.row;
const field = event.changes.field;
record['品目'].value = '現金繰越';
let currentRow = event.changes.row.value;
currentRow.金額.value = event.record.前月繰越.value;
return event;
});
})();
nekoko様
コードの問題をお伝えすれば良いですか?
まず、品目フィールドがテーブル外の場合、event.changes.rowはnullになるので使えません。
また、record[‘品目’]のrecordが定義されていないようです。
「品目が現金繰越に変わった」ことを検知するなら、fieldを活かして
if(field.value === '現金繰越'){
//ここにコードをいれる
}
とするのがよいかと思います。
なお、テーブルが何行あるのか、そのすべての数値フィールドに入れるのかがわからないので、
具体的に書いていただけると、的確な回答がつきやすいと思います。
値変更イベント(changeイベント)については、下記を参照ください。
レコード編集画面のフィールド値変更時イベント
TO様
お世話になっております。こちらの質問でのご回答して頂きありがとうございます。
説明不足の質問で申し訳ございません。
コードの問題をお伝えすれば良いですか?>おっしゃる通りでございます。
テーブルは全てで9行ありその中に品目フィールドも含まれております。品目フィールドは三行目で、コピーの金額フィールドは6行目になります。
nekoko様
記載されている「行」は「列」だと解釈して以下記載しますが,
解釈が違っていたらすいません.
※「行」は「縦」,「列」は「横」と解釈しています
(function () {
'use strict';
kintone.events.on('app.record.edit.change.品目', (event) => {
const fldTable = 'テーブル'; //テーブルのフィールドコード
const field = event.changes.field;
const record = event.record; //レコード
const carryOver = record[前月繰越].value; //前月繰越
const myTable = record.value[fldTable].value; //テーブル
//ドロップダウンの値が現金繰越のときに実行
if(field.value === '現金繰越'){
//テーブルの行数分だけ繰り返す
myTable.forEach((row) => {
//テーブルの行内にある「金額」にcarryOverの値を格納
row[金額].value = carryOver;
});
}
return event;
});
})();
上記のコードは,
①ドロップダウンが「現金繰越」になったら
②テーブルの行数分だけ繰返して
③前月繰越の値をテーブル行の「金額」に格納
…ということをやっています.
もし意図違いでしたら,想定している動きを記載ください.
TO様
お世話になっております。
TO様の解釈で間違いありません。
コードのご提示ありがとうございます。
ご提示して頂いたコードを反映させたところいくつかエラーが出てしまったので(おそらく転記する際のミス)修正しております。修正が終わり次第動作の確認をします。
TO様
お世話になっております。
ご教授して頂いたコードのエラーを修正しているのですが修正の仕方がわからないエラーがコンソールに出ております。
定義されてないということはわかるのですが…
Uncaught ReferenceError: 前月繰越 is not defined
助言をして頂けないでしょうか。
nekoko様
すいません.コードに誤りがありました.
constcarryOver = record[前月繰越].value;//前月繰越
ここを,
constcarryOver = record.前月繰越.value;//前月繰越
にしてみてください.
前月繰越の前後の[]を削除して前に.を付けています.
前月繰越が変数扱いになっていたのがエラーの要因と思われます.
TO様
お世話になっております。
書き方が少し変わるだけで変数扱いになってしまうのですね、、、
勉強になりました。
コードをご教授して頂いた通りに修正したところ10行目にてエラーが出ました。
エラー内容が
Uncaught TypeError: Cannot read properties of undefined (reading '入金記録')
と出ているので二回目の読込が出来ていないのかなと思っております。
読込のタイミング等を変えて修正をしていこうと思います。
nekoko様
constmyTable = record.value[fldTable].value;//テーブル
エラーはここで起きているという解釈でよいですか?
解釈に誤りがなければ,ここではテーブルのフィールドコードを変数にしています.
(このコードを書いた当初はわからなかったため)
5行目にテーブルのフィールドコード名を入れる変数を用意していますが,
もしテーブルのフィールドコードが「テーブル」でないなら書き換えてください.
constfldTable ='テーブル';//テーブルのフィールドコード
もしここを「入金記録」に変えているなら,
テーブルのフィールドコード名が「入金記録」になっているか確認ください.
TO様
お世話になっております。
おっしゃる通りの箇所でエラーが出ております。
現在テーブルを入金記録に変更しており、テーブルのフィールドコード名が入金記録であることを確認しました。
JS内のテーブルのフィールドコードとフィールドコード名を両方他の名称(テーブル)に変更して動作の確認をしてみたのですが、エラーは変わらずに出ておりました。
また、小文字、大文字等の確認をしましたが、間違えは見当たらなかったです。
こちら書き換え後のコードになります。
(function () {
'use strict';
kintone.events.on('app.record.edit.change.品目', (event) => {
const fldTable = '入金記録'; //テーブルのフィールドコード
const field = event.changes.field;
const record = event.record; //レコード
const carryOver = record.前月繰越.value; //前月繰越
const myTable = record.value[fldTable].value; //テーブル ここでエラー
//ドロップダウンの値が現金繰越のときに実行
if(field.value === '現金繰越'){
//テーブルの行数分だけ繰り返す
myTable.forEach((row) => {
//テーブルの行内にある「金額」にcarryOverの値を格納
row[金額].value = carryOver;
});
}
return event;
});
})();
nekoko様
たびたびすいません.
constmyTable = record.value[fldTable].value;//テーブル ここでエラー
ここを,
constmyTable = record[fldTable].value;//テーブル ここでエラー
に修正してみてください.加えて,
row[金額].value = carryOver;
ここを,
row.value[金額].value = carryOver;
に修正してみてください.
私がvalueを付けるところを間違っていました.
TO様
お世話になっております。
コードの修正をしたのですが、
row.value[金額].value = carryOver;
にて
Uncaught ReferenceError: 金額 is not defined
というエラーが出ております。
金額が定義されていない というエラーだとおもっております。
また、今回のコードの修正に関してひとつ疑問がありますので、質問させて頂きます。
row.value[金額].value = carryOver;
を
row.record[金額].value = carryOver;
というように record を入れていないのはなぜなのでしょうか。
nekoko 様
row.value[金額].value = carryOver;
は,
row.value.金額.value = carryOver;
でした.
(変数とフィールドコード指定がごっちゃになっていました)
質問にあった,「rowにrecordをいれないのはなぜか」について,以下に回答します.
rowは,関数forEachを使って,「myTable」の要素を順番にrowに格納しています.
myTableは「record.value[fldTable].value(テーブル)」なので,例えばn行あるとしたら,
myTable.forEach((row) => …で,
row = record.value[fldTable].value[0]
row = record.value[fldTable].value[1]
row = record.value[fldTable].value[2]
…
row = record.value[fldTable].value[n]
…というようにプログラムが動いています.これは,例えばforに変えると,
for(let i = 0; i < myTable.length; i++ ){
myTable[i].value.金額.value = carryOver;
}
…と同じ挙動になります.
少し質問の内容からはずれましたが,myTable.forEachでrecord.value[fldTable].valueの要素(各行)を,
繰り返し取得しているので,recordはつけなくてもOKです.
不明点あれば,レスください.
TO様
お世話になっております。
コードを修正したところ、理想の動作をすることが出来ました。
ありがとうございました。
rowにrecordをいれないのはなぜか についての回答ありがとうございます。
プログラムの挙動や例文を用いて丁寧に説明して頂き、ありがとうございます。
他のプログラムでも row を使用しているものがあり、こちらは調べながら作成したため、深く理解していなかったのですが理解することが出来ました。
こちらの質問でも、コードのご教授及び、解説をして頂きありがとうございました。
また、機会がありましたら、その際にはよろしくお願い致します。
system
(system)
クローズされました:
15
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。