ある条件下だと保存ができない

はじめまして。下記のページを参考に、ドロップダウンにてある選択肢を選ぶと項目が現れ、その項目が未記入で保存しようとした場合はエラーを出す、というJavascriptを組んでいるのですが、問題が発生しました。

https://developer.cybozu.io/hc/ja/community/posts/115017510243-%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%83%80%E3%82%A6%E3%83%B3%E3%81%AE%E5%80%A4%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%88%B6%E5%BE%A1-%E5%BF%85%E9%A0%88%E9%A0%85%E7%9B%AE%E5%8C%96-%E3%82%92%E8%A1%8C%E3%81%84%E3%81%9F%E3%81%84-

ドロップダウンで、ある選択肢が選ばれた状態のレコードの編集画面を開き保存しようとすると保存が効きません(無反応)。そのほかの選択肢が選ばれているレコードは編集&保存ができます。コンソール画面で原因を調べたところ、下記が表示されます。

Uncaught TypeError: Cannot set property ‘disabled’ of undefined
at download.do?app=95&contentId=27151&jsType=DESKTOP&hash=8afa09914ed838561fb1d3f4e24fb6d7809721f0:49
at Array.map (<anonymous>)
at download.do?app=95&contentId=27151&jsType=DESKTOP&hash=8afa09914ed838561fb1d3f4e24fb6d7809721f0:48
at show.js:270
at new lk (show.js:130)
at Oda (show.js:270)
at show.js:270
at g.o (show.js:132)
at Ak (show.js:134)
at xk (show.js:134)

Javascript初心者のため原因が全くわからず困っております。なにかわかることがありましたらアドバイスいただけませんでしょうか。宜しくお願い致します。

こんにちは。プロジェクト・アスノートの松田です。
こちらのリンク先の記事を参考に原因を探ってみたらいかがでしょうか?
https://developer.cybozu.io/hc/ja/articles/360038920252-kintone%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E6%B5%81%E3%82%8C%E3%82%92%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%82%88%E3%81%86

また、具体的なアドバイスを求めたい場合は、現在のソースコードやアプリの構成等の情報を記載された方がいいと思います。

こんにちは。コメントいただきありがとうございます。

ご紹介いただいた記事をもとに探ってみたのですが解決できませんでした。

引き続きアドバイスいただけますと大変助かります。どうぞ宜しくお願い致します。

 

構成は、フィールドコード”ニーズ”のドロップダウンから、「ニーズ有り(新規)」または「ニーズ有り(再契約)」が選ばれた時だけ

ランク、案件名、面積_坪、稼働時期、契約期間、マーケット の項目を表示させて、項目が未記入のまま保存するとエラーを出すように

設定しています。

問題は、「ニーズ有り(再契約)」の時だけなぜかエラーが効かない上に保存ボタンも無反応になってしまいます。「ニーズ有り(新規)」を選んだときは

問題なく動作するため、気づくことなくしばらくの間このまま運用しておりました。

 

ーーーーーーーーーー

(function () {
“use strict”;

var fieldsCtl = {
‘ニーズ有り(新規)’: {
‘ランク’: true, ‘案件名’: true, ‘面積_坪’: true, ‘稼働時期’: true, ‘契約期間’: true, ‘マーケット’: true,
},
‘ニーズ有り(再契約)’: {
‘ランク’: true, ‘案件名’: true, ‘面積_坪’: true, ‘稼働時期’: true, ‘契約時期’: true, ‘マーケット’: true,
},
‘ニーズ無し(または継続中)’: {
‘ランク’: false, ‘案件名’: false, ‘面積_坪’: false, ‘稼働時期’: false, ‘契約期間’: false, ‘マーケット’: false,
},
‘コンサルニーズ有り(新規)’: {
‘ランク’: false, ‘案件名’: false, ‘面積_坪’: false, ‘稼働時期’: false, ‘契約期間’: false, ‘マーケット’: false,
},
‘コンサルニーズ無し(または継続中)’: {
‘ランク’: false, ‘案件名’: false, ‘面積_坪’: false, ‘稼働時期’: false, ‘契約期間’: false, ‘マーケット’: false,
},
}

var events = [‘app.record.edit.change.ニーズ’ ,‘app.record.create.change.ニーズ’,‘app.record.index.edit.change.ニーズ’,
‘app.record.edit.show’,‘app.record.create.show’,‘app.record.index.edit.show’
];
kintone.events.on(events, function(event){
var record = event.record;

if (record[‘ニーズ’].value) {
var ctl1 = fieldsCtl[record[‘ニーズ’].value];
var fkeys = Object.keys(ctl1);
fkeys.map(function(fcode) {
record[fcode][‘disabled’] = !ctl1[fcode];
if (!ctl1[fcode]) {
record[fcode].value = ‘’;
}
});
}

return event;
});

kintone.events.on([‘app.record.edit.submit’,‘app.record.create.submit’, ‘app.record.index.edit.submit’], function(event){
var record = event.record;

if (record[‘ニーズ’].value) {
var ctl1 = fieldsCtl[record[‘ニーズ’].value];
var fkeys = Object.keys(ctl1);
fkeys.map(function(fcode) {
record[fcode][‘disabled’] = !ctl1[fcode];
if (ctl1[fcode]) {
if (!record[fcode].value) {
record[fcode][‘error’] = ‘必須項目!’;
event.error = ‘必須項目 エラー’;
}
}
else {
record[fcode].value = ‘’;
}
});
}

return event;
});

})();

追記です。コンソールで確認したところ太字にしたあたりに原因があるようなのですが知識不足でわかりませんでした。

 

ありさん、こんにちは。

問題の選択肢のときだけ、fieldsCtl に定義しているフィールドコードが間違っていませんか?

契約時期 → (正)契約期間

 

エラーメッセージ: Cannot set property ‘disabled’ of undefined

はそのとおり、指定されたオブジェクトに [disabled]というプロパティがありません、というものなので、

真っ先に疑うべきは、正しくフィールドコード等が指定されているかどうか、ですね。

松田様

こんにちは。

ご指摘の通り、その部分を修正すると動作しました!!!

お恥ずかしい限りです。自分ではずっとながめていてもまったく気づくことができなかったので

大変助かりました。またこのようなエラーが出た場合はまず正確なコードが入っているか疑います。

見つけていただき感謝申し上げます。

よかったです。

動作を場合分けしているときに、他は正常動作しているけど1つのパターンだけNGとなる

かつ、今回のエラー内容

というところで、エラー発生箇所を絞り込んでいけるかと思います。

 

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