新規投稿
フォローする

レコード複写時のフィールド操作とchangeイベントの実行

以下の2つを同時に実現したいです。

➀レコード複写時(create.showイベント)にコピー先のいくつかのフィールドを編集またはクリアしたい。
➁changeイベントで上記クリア対象のひとつであるフィールド(日時)が変更された場合、
 その値から算出した日時を別の日時フィールド設定したい。

それぞれ別ファイルのJSに記載されているコードを引き継いだのですが
上手く動作していません。create.showで表示されたフィールドに値が中途半端に残っています。
実行順がchageイベント→create.showなのでしょうか。
changeイベントで引き渡されるレコードの内容を見ると、create.showで値を変更している
フィールドもあるのですが、日時はコピー元の値が入ったままになっています。ここが
クリアされていれば、changeイベントで判定を追加し逃げれるのかなと思ったのですが。
アドバイスをいただけると助かります。

 

0

4件のコメント

Avatar
mionix

実際のコードを見てみないと何とも言えませんが、

①は以下の様に「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;
0
Avatar
マチ

コメントありがとうございます。
実現したいことがうまく説明できていないにも関わらず、お時間いただき申し訳ございません。

まずは複写時の部分になります。複写時にフィールドをクリアしています。

   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の処理をかみ合っていません。

 

マチにより編集されました
0
Avatar
mionix

検証してみましたがクリアされない現象にはなりませんでした。

そのためエラーの原因はわかりませんが、検証した際のコードを添付しておきます。

私が書きやすいように整形してしまっています。ご了承ください。

また、使用されている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;
  });

 

1
Avatar
マチ

検証までしていただき、ありがとうございます。
数年前のソースを引き継いだので、現状に合わない部分も多そうです。
いただきましたソースを参考に再度検証したいと思います。

 

0
サインインしてコメントを残してください。