日時の入力について

やりたいこと:
日時フィールド(開始日時・終了日時)を使って、あるレコードで指定された時間帯と重複する時間帯を、別のレコードで入力できないように制御したいと考えています。

前提条件:

「開始日時」と「終了日時」という2つの日時フィールドがあります。

すでに登録されているレコードの時間帯と重複する時間帯は、次のレコードでは選択できないようにしたいです。

例:
あるレコードで以下の時間が登録されていたとします:

開始日時:5月20日 10:00

終了日時:5月20日 12:00

この場合、次のレコードを作成する人は、「10:00~12:00」の時間帯を開始日時にも終了日時にも指定できないようにしたいです。
ただし、それ以外の日時は自由に選択できるようにしておきたいと考えています。

ご質問:
このような重複チェック・入力制限を、プラグインやJavaScriptで実現することは可能でしょうか?
もし可能であれば、具体的にどのような設定やカスタマイズを行えば良いか教えていただけますと幸いです。
よろしくお願いいたします:woman_bowing:

kintone REST API Client を導入の上、レコードを全件取得
取得したレコードと、レコード追加画面で、時間帯の重複がないか
for – of文でチェックする感じになると思います。

あと、下記サンプルには書いてませんが[開始日時]が[終了日時]より
後の日時になっていないかのチェックも入れた方がいいでしょう。

(() => {
  'use strict';

  // レコード追加画面で保存がクリックされたら発火
  kintone.events.on('app.record.create.submit', async (event) => {
    const record = event.record;

    try {
      const client = new KintoneRestAPIClient();

      // 既存の全レコードの[開始日時][終了日時]を取得
      const records = await client.record.getAllRecords({
        app: kintone.app.getId(),
        fields: ['開始日時', '終了日時'],
      });

      // レコード追加画面で入力した[開始日時][終了日時]を Date オブジェクトに変換
      const startDate = new Date(record['開始日時'].value);
      const endDate = new Date(record['終了日時'].value);

      // 取得したレコードに対して、レコード追加画面と時間帯の重複がないかチェック
      for (const existing of records) {
        const existingStart = new Date(existing['開始日時'].value);
        const existingEnd = new Date(existing['終了日時'].value);
        const noOverlap = (endDate <= existingStart) || (startDate >= existingEnd);

        // 重複があったらエラーを出して保存しない
        if (!noOverlap) {
          event.error = 'この時間帯は既存レコードと重複しています。';
          return event;
        }
      }

      return event;

    } catch (error) {
      console.error('重複チェック中にエラーが発生:', error);

      return event;
    }
  });

})();

ご回答いただき有難うございます。
教えていただいたコードを参考にして、修正を加え無事にできました。

有難うございました:woman_bowing:

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