以下の2つを同時に実現したいです。
➀レコード複写時(create.showイベント)にコピー先のいくつかのフィールドを編集またはクリアしたい。
➁changeイベントで上記クリア対象のひとつであるフィールド(日時)が変更された場合、
その値から算出した日時を別の日時フィールド設定したい。
それぞれ別ファイルのJSに記載されているコードを引き継いだのですが
上手く動作していません。create.showで表示されたフィールドに値が中途半端に残っています。
実行順がchageイベント→create.showなのでしょうか。
changeイベントで引き渡されるレコードの内容を見ると、create.showで値を変更している
フィールドもあるのですが、日時はコピー元の値が入ったままになっています。ここが
クリアされていれば、changeイベントで判定を追加し逃げれるのかなと思ったのですが。
アドバイスをいただけると助かります。
実際のコードを見てみないと何とも言えませんが、
①は以下の様に「event.reuse」で再利用であれば「true」そうでなければ「false」を返します。
「true」の時に処理をするというように記述できます。
const record = event.record;
const reuse = event.reuse;
if(reuse) {
record['フィールド名']['value'] = '';
}
return event;
②に関してですがchangeイベントを使用しないといけないのでしょうか?
①処理の後にフィールド情報を取得し、別フィールドに反映する流れで良いように感じます。
想像する処理とかけ離れていたら申し訳ないですが、以下のような処理でしょうか?
const record = event.record;
const reuse = event.reuse;
if(reuse) {
if(record['A']['value']) {
// Aフィールドに値が入っていたらクリア
record['A']['value'] = '';
} else {
// Aフィールドが空だったら'A'を入力
record['A']['value'] = 'A'
}
// Aフィールドの値をBフィールドに反映
record['B']['value'] = record['A']['value']
}
return event;
コメントありがとうございます。
実現したいことがうまく説明できていないにも関わらず、お時間いただき申し訳ございません。
まずは複写時の部分になります。複写時にフィールドをクリアしています。
kintone.events.on(["app.record.create.show"],function(event) {
if(event.reuse){
var record = event.record;
kintone.app.record.setFieldShown("check_box",false);
// 複写時クリア
var reset_code = ['a','b','c','d'];
for (var i = 0; i < reset_code.length; i++){
var code = reset_code[i];
record[code]['value'] = "";
}
}
return event;
});
次にフィールド変更時です。日時フィールドaを変更した際、日時フィールドbにaの2時間後を設定します。
ソースはもっと長いのですが、割愛しております。
kintone.events.on(["app.record.create.change.a","app.record.edit.change.a"],
function(e) {
// フィールドAの日時が変更された場合、その2時間後をフィールドBに設定
var record = e.record;
var syuko_bi = record.a.value;
var day_later = syuko_bi;
var i = 1;
while (new UltraDate(day_later).isWeekday(0, LOCALE) === false) {
i++;
day_later = moment(day_later).add(i, "days").format("YYYY-MM-DD HH:mm");
}
record.a.value = day_later;
day_later = moment(day_later).add(2, "hours").format("YYYY-MM-DD HH:mm");
record.b.value = day_later;
return e;
});
上記がそれぞれ別JSファイルに記載されてアプリ適用されております。
実行すると複写イベント時にフィールドaにコピー元の値が残ってしまいます。
複写と同時にchangeイベントが動作しているように見えます。
changeイベントの中で既にフィールドaがクリアされていればいいのですが、デバックモードで値を
見ると、コピー元の日時が残っており、うまくcreate.showの処理をかみ合っていません。
検証してみましたがクリアされない現象にはなりませんでした。
そのためエラーの原因はわかりませんが、検証した際のコードを添付しておきます。
私が書きやすいように整形してしまっています。ご了承ください。
また、使用されているmomentですが現在非推奨となっています。luxonをお使いいただいた方がよいかと思います。
問題解決の参考になれば幸いです。
// show
kintone.events.on('app.record.create.show', event => {
const reuse = event.reuse;
const record = event.record;
// チェックボックス表示設定
kintone.app.record.setFieldShown('check_box', !reuse);
if (reuse) {
// 複写時クリア
const reset_code = ['a', 'b'];
reset_code.forEach(e => record[e]['value'] = '');
}
return event;
});
// change
kintone.events.on(events, event => {
const record = event.record;
// aが空だったら何もしない
if (!record['a']['value']) return event;
let syuko_bi = luxon.DateTime.fromISO(record['a']['value']);
// aが休日であれば営業日をセット bにaの2時間後をセット
while (!new UltraDate(syuko_bi).isWeekday(0)) {
syuko_bi = syuko_bi.plus({
days: 1
});
}
record['a']['value'] = syuko_bi.toFormat('yyyy-MM-dd HH:mm');
record['b']['value'] = syuko_bi.plus({
hours: 2
}).toFormat('yyyy-MM-dd HH:mm');
return event;
});
検証までしていただき、ありがとうございます。
数年前のソースを引き継いだので、現状に合わない部分も多そうです。
いただきましたソースを参考に再度検証したいと思います。
system
(system)
クローズされました:
2023 年 12 月 5 日午前 6:53
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。