編集画面、新規作成画面にてフィールドの値が変更された場合対象のフィールドの値を変更した

レコードの新規作成画面、編集画面にて請求日、完了予定日付フィールドの値が変更された場合、整合性チェックフィールドの値も反映されるようにしたいです。

コンソールを見る限りでは判定はできているようですが、編集画面や新規作成画面では値が変更されません。

予想ですが、const events の行の書き方が違うのかなと思いますがどなたか原因と解決策

をご教示いただけますと幸いです。

(function() {
“use strict”;
const events =[‘app.record.edit.show’,‘app.record.create.show’,‘app.record.detail.show’,‘app.record.create.change.請求日付’,‘app.record.edit.change.請求日付’,‘app.record.create.change.完了予定日’,‘app.record.edit.change.完了予定日’];
kintone.events.on(events,(event) => {
const record = event.record;
console.log(event);
if (record[‘請求月’].value === record[‘完了予定月’].value) {
record[‘整合性チェック’].value = ‘適正’;
console.log(“true”);

} else {
  record['整合性チェック'].value = '不適正';
  console.log("false");
 
}
 return event;

});
})();

ledas 様

ご期待に応えた回答にならず申し訳ありませんが、

こちらで簡単に似たプログラムを書いてみましたが、普通に動きました。

それぞれ編集画面と新規作成画面で確認されたのでしょうか?

手元確認用のソースコード:

(function() {
  'use strict';
  const events = ["app.record.create.show","app.record.edit.show","app.record.edit.change.date1","app.record.edit.change.date2"];
  kintone.events.on(events, (event) => {
    const record = event.record;
    if (record.date1.value === record.date2.value) {
      record.text.value = "yes";
    }else {
      record.text.value = "no";
    }
    return event;
  });
  
})();

akika様

ご回答ありがとうございます。

対象フィールドdate1,date2を変更した場合でもリアルタイムでtextフィールドにyes,noが表示されますでしょうか?
私の場合はeventの種類が多すぎて競合しているのかリアルタイムに変更されず、なぜか2回目のフィールド変更でようやく整合性チェックフィールドに適正,不適正が表示される状況です。

ledas 様

お試しにledas 様と同じイベントを設定しました。

const events = ["app.record.create.show","app.record.edit.show","app.record.edit.change.date1","app.record.create.change.date1","app.record.edit.change.date2","app.record.create.change.date2","app.record.detail.show"];

それぞれ編集画面と新規作成画面で問題なく動くことを確認しました。

ledas 様の環境ではもしそれ以外のJSを適用されている場合、それから影響を受ける可能性があると思います。

また、ご存じかと思いますが、Changeイベントは値を変更したタイミングで発火するのではなく、

フォーカスを失ったタイミングで発火するので、

日付を変更した後に、日付以外のところでクリックしたら「text」フィールドに反映されます。

 

 

見た限りだと、changeイベントは日付フィールドであるのに対し、イベント内で参照しているのが「その日付フィールドを元に計算した計算フィールド(月)」だからではないかと推測します(Iedasさまのコードが2回目以降のフィールド変更で動くのはそのためで、akikaさまのコードが正常に動くのは日付フィールドを参照しているためでしょうか)。

計算フィールドもまたフィールドのフォーカスが外れた時に計算しますので、正常に動作させるのであれば
①計算フィールドは使用せず、JS内でそれぞれの月を求めて比較
②setTimeout等を使って計算のタイミングをずらす

辺りでしょうか。

mls-hashimoto 様

>changeイベントは日付フィールドであるのに対し、イベント内で参照しているのが「その日付フィールドを元に計算した計算フィールド(月)」だ

こちらに気づきませんでした。

ご指摘ありがとうございます。

 

ledas 様

changeイベントに指定したフィールドとイベント内のフィールドは違うフィールドになっていることに気づかず回答してしまって、失礼しました。

 

mls-hashimoto 様

ご回答ありがとうございます。

①計算フィールドは使用せず、JS内でそれぞれの月を求めて比較

=>具体的にはどのようなコードを書けばよろしいでしょうか?

②setTimeout等を使って計算のタイミングをずらす

=>公式ドキュメントを見ましたが実際にどのように適用すればよろしいでしょうか?

jsに関しての知識が不足しており申し訳ありません。

 

ledas さま

①についてはこちらで実装できるかと思います(本来であればLuxonやDay.js等の日付操作ライブラリを導入して月を求めるのが良いですが、単体で動作するようにしてあります)。

  kintone.events.on([
    'app.record.create.show', 'app.record.edit.show',
    'app.record.create.change.請求日付', 'app.record.edit.change.請求日付',
    'app.record.create.change.完了予定日', 'app.record.edit.change.完了予定日'
  ], (event) => {
    let record = event.record;
  let billingMonth = record['請求日付'].value?.split(/-/g)[1];
  let completionMonth = record['完了予定日'].value?.split(/-/g)[1];

    if (billingMonth && completionMonth) {
      if (billingMonth == completionMonth) {
        record['整合性チェック'].value = '適正';
      } else {
        record['整合性チェック'].value = '不適正';
      }
    } else {
    record['整合性チェック'].value = '-';
    }

    return event;
  });

②については以下のような形でできますが、計算フィールドの計算にかかる速度が確実ではないためおすすめしません。

  kintone.events.on([
    'app.record.create.show', 'app.record.edit.show',
    'app.record.create.change.請求日付', 'app.record.edit.change.請求日付',
    'app.record.create.change.完了予定日', 'app.record.edit.change.完了予定日'
  ], (event) => {
    let record = event.record;

    setTimeout(() => {
      let recordData = kintone.app.record.get(), rec = recordData.record;

      if (rec['請求月'].value == rec['完了予定月'].value) {
        rec['整合性チェック'].value = '適正';
      } else {
        rec['整合性チェック'].value = '不適正';
      }

      kintone.app.record.set(recordData);
    }, 1000);

    return event;
  });