初めて投稿させていただきます。
cybozu developer networkのレコード編集イベントの
フィールドの値を書き換える
フィールドにエラーを表示する
を両方同時に行いたいのですが、値の書き換えがうまくいきません。
(() => {
'use strict';
//「状況」を「提出」にした時、「要確認」に「入力ミス」が入っていたら、「状況」を「エラー発生中」にする
kintone.events.on('app.record.edit.change.状況',(event)=>{
const record = event.record;
if(record['状況'].value == '提出'){
if(record['要確認'].value == '入力ミス'){
//値変更
record['状況'].value = 'エラー発生中'; //←これがreturnされません
//フィールドエラー
record['要確認'].error = 'ちゃんと入力してください';
}
}
return event;
});
})()
アプリに「状況」と「要確認」の2つのフィールドがあります。
「状況」の値を「提出」にした時に、「要確認」の値が「入力ミス」だったら
①「状況」の値を「エラー発生中」に変更
②「要確認」フィールドにエラーを表示
を両方実行したいのですが、①の変更ができず、「提出」のままになってしまいます。
②のフィールドエラーを表示させなければ、①の値変更はうまくいくのですが、同時に実行させる方法はないでしょうか?
12/6追記
コンソールにエラーは表示されません。
最後の「return event;」の所でブレークしてみると、
①「状況」も②「要確認」も書き換えはできているのに、
①「状況」だけreturnされないようです。
ご教授よろしくお願いします!
試してみた限り、値を書き換える単体は動く、エラー表示単体をした時に動く
同時に実行した場合はエラー表示が優先されていて、それが仕様という気がします。
公式に問い合わせて見るしかないと思います。
代替手段としては、状況フィールドにエラー表示で「エラー発生中」と要確認フィールドに「ちゃんと入力してください」とエラー表示を2つ出すのはどうでしょうか?
状況フィールドに「エラー発生中」という選択肢を置いている理由がなにかあるかもしれませんが。
①と②、それぞれ単体では動くので、ものすごく初歩的な所でつまづいているのかと思っていました。
「仕様」なら仕様がないですね。
念のため公式に問い合わせてみたいと思います。
ご確認ありがとうございました!
状況フィールドに「エラー発生中」という選択肢を置いたのは、エラーが起きている時は「提出」にできないようにしたかったからでした。
いろいろ試してみたところ、「フィールドエラーを表示」させようとすると
「フィールドの値変更」や「編集可/不可の切り替え」がreturnされなくなるみたいです。
そこで、同時に実行するのではなく、別々に実行させる方法を考えてみました。
「Fエラー発火装置」というフィールドを追加し、これの値変更をきっかけにしてエラー表示を実行しました。
(() => {
'use strict';
//「状況」を「提出」にした時、「要確認」に「入力ミス」が入っていたら、「状況」を「エラー発生中」にする
//値の変更
kintone.events.on('app.record.edit.change.状況',(event)=>{
const record = event.record;
if(record['状況'].value == '提出'){
if(record['要確認'].value == '入力ミス'){
//値変更
record['状況'].value = 'エラー発生中';
record['Fエラー発火装置'].value = '要確認';
}
}
return event;
});
//フィールドエラー表示
kintone.events.on('app.record.edit.change.Fエラー発火装置',(event)=>{
const record = event.record;
if(record['Fエラー発火装置'].value == '要確認'){
//フィールドエラー
record['要確認'].error = 'ちゃんと入力してください';
}
return event;
});
})();
これでなんとか期待どおりの動作になりました。
本当にここまでしないといけないものなのか、ちょっと疑問ですが…。
公式よりお返事いただきました。
ここに書いてあるように、「フィールドにエラーを表示」させようとすると、「値の書き換え」と「編集可/不可」はキャンセルする仕様だそうです。
お返事の中にも解決方法として、「別のイベントでエラーメッセージを表示させる処理を追加する」事をお勧めされたので、上記の発火装置のやり方は間違っていないようです。
レコード編集イベント – cybozu developer network
https://developer.cybozu.io/hc/ja/articles/202166270#step6
「以下のフィールドは、エラー値を設定しても、フィールドにエラーは表示されません。
レコード番号
作成者
作成日時
更新者
更新日時
ステータス
作業者
計算」
ばかり見ており見逃しておりました。
私も、動かないのは①値の変更だからと、そちらばかり見ていました。
あと、developer networkの文章はちょっと私には難しくて、読んでもすぐに理解できない事が多いです。
公式に問い合わせしたら、とても分かりやすく教えてもらえました。
haradaさん、アドバイスありがとうございました。
こんにちは!
もう一つフィールドを追加するの素敵な方法ですね!思いつかなかったです
解決されているみたいですが、こんな方法もあるので↓ご参考になればとおもいます
↓await してget&set動かす方法(個人的にはおすすめです)
https://qiita.com/t_numata/items/bc6f302fc2664b47385f
↓苦しまぎれの0.1秒待つ方法
https://developer.cybozu.io/hc/ja/community/posts/900001893826
なるほど、こういう事ですね!(juridonさんおすすめの方法)
(() => {
'use strict';
//「状況」を「提出」にした時、「要確認」に「入力ミス」が入っていたら、「状況」を「エラー発生中」にする
//値の変更
kintone.events.on('app.record.edit.change.状況',(event)=>{
setError();
const record = event.record;
if(record['状況'].value == '提出'){
if(record['要確認'].value == '入力ミス'){
//値変更
record['状況'].value = 'エラー発生中';
}
}
return event;
});
//フィールドエラー表示
const setError = async() => {
await Promise.resolve();
const event = kintone.app.record.get();
const record = event.record;
if(record['要確認'].value == '入力ミス'){
record['要確認'].error = 'ちゃんと入力してください';
}
kintone.app.record.set(event);
}
})();
Promiseを使う方法は私も検討してみたのですが、知識と経験不足で一人ではどうにもならなかったです。
正直今でも、どうして「Promise.resolve()をawaitする事でイベントハンドラが終了するまで待つ事ができる」のかさっぱりですが、やりたかった事は実現できました。
juridonさん、ありがとうございました!
無事、本番環境に実装する事ができました\(^o^)/
移植してみて思ったのですが、チェック項目が多くなると「値変更」と「フィールドエラー表示」の表示が離れてしまい、可読性が悪くなります。
フィールドコードやエラーメッセージの内容は引数にしてsetErrorに持たせた方が、全ての条件をイベントハンドラ内に書けるので分かりやすいなと思いました。
(() => {
'use strict';
//「状況」を「提出」にした時、「要確認」に「入力ミス」が入っていたら、「状況」を「エラー発生中」にする
//値の変更
kintone.events.on('app.record.edit.change.状況',(event)=>{
const record = event.record;
if(record['状況'].value == '提出'){
if(record['要確認1'].value == '入力ミス'){
record['状況'].value = 'エラー発生中'; //値の変更
setError('要確認1','ちゃんと入力してください'); //フィールドエラー表示
}
if(!record['要確認2'].value){
record['状況'].value = 'エラー発生中'; //値の変更
setError('要確認2','何か入力してください'); //フィールドエラー表示
}
}
return event;
});
//フィールドエラー表示
const setError = async(fieldCode,errorMessage) => {
await Promise.resolve();
const event = kintone.app.record.get();
event.record[fieldCode].error = errorMessage;
kintone.app.record.set(event);
}
})();
system
(system)
クローズされました:
11
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。