日付フィールドの入力可否を設定したい。

実現したいこと

新規作成や編集の際に日付A、日付B、日付Cがあった場合、日付Aが入力されたら日付Bと日付Cを入力不可、日付Bが入力されたら日付Aと日付Cを入力不可、日付Cが入力されたら日付Aと日付Bを入力不可、そしてそれぞれ入力した日付を解除したら入力可に戻るという設定をしたいです。

エラー情報

 テストで日付Aを入力したときに日付Bを入力不可には出来たのですが、日付Aの入力を解除した際に日付Bの入力不可が解除できませんでした。

利用したソースコード

(function() {

“use strict”;

//チェックボックスのイベントを取得

var events1 = [‘app.record.create.change.チェックボックス’, ‘app.record.edit.change.チェックボックス’];

kintone.events.on(events1, function(event) {

 

var record = event[‘record’];

 

//チェックボックスの入力値チェック

if (record[‘チェックボックス’][‘value’][0] === “有効にする場合はチェックしてください”) {

 

//チェックなしの場合は"文字列__1行_"を有効にする

record[‘文字列__1行_’][‘disabled’] = false;

}else {

//チェックありの場合は"文字列__1行_"を無効にする

record[‘文字列__1行_’][‘disabled’] = true;

}

return event;

});

 

//ラジオボタンのイベントを取得

var events2 = [‘app.record.create.change.ラジオボタン’, ‘app.record.edit.change.ラジオボタン’];

kintone.events.on(events2, function(event) {

 

var record = event[‘record’];

 

//ラジオボタンの入力値チェック

if (record[‘ラジオボタン’][‘value’] === “有効にする”) {

 

//ラジオボタンが"有効にする"を選択している場合

record[‘文字列__複数行_’][‘disabled’] = false;

}else {

 

//ラジオボタンが"無効にする"を選択している場合

record[‘文字列__複数行_’][‘disabled’] = true;

}

return event;

});

})();

試したこと

 日付Aと日付Bを作成して日付Aを入力した際に日付Bを入力不可

再現条件

  • 画面・イベント:編集画面
  • カスタマイズに関連するフィールド(フィールド種類/フィールド名/フィールドコード):日付フィールド
  • 権限設定:
  • デバイス(PC or モバイル):PC
  • OS・ブラウザ:Windows10 Chrome
  • IP制限などネットワークに特殊なことがあれば:

 

こんにちは。

「実現したいこと」の日付フィールドの入力可否の設定はおそらくできると思いますが、

「利用したソースコード」に記載して頂いたコードに、
日付フィールドに関する処理を見つけられず…見落としがありましたら申し訳ありませんが、
日付フィールドに関する処理も記載していただけますと助かります。

wenxit1218様

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

「利用したソースコード」を参考に設定したら出来るのかと思ったのですが、

それが分からない状況でした。

どういったコードだと実現できるかご教示いただけましたら幸いです。

よろしくお願いいたします。

ku 様

ご確認頂きありがとうございます。状況を理解できました。

「エラー情報」に記載して頂いた、
「日付Aの入力を解除した際に日付Bの入力不可が解除できない」の問題なのですが、
「入力済みの日付フィールドが存在しない場合、全部の日付フィールドを編集可能に変更」
のような処理を追加すれば、解決できる気がします。

一例なのですが、こんなイメージの処理で、
「実現したいこと」の動作はできるかと思います。

(function() {
  'use strict';

  var fieldCode = ['日付A', '日付B', '日付C'];
  var events = fieldCode.map(function(field) {
    return ['app.record.create.change.' + field, 'app.record.edit.change.' + field];
  });

  kintone.events.on(events, function(event) {
    var record = event.record;
    // 日付フィールドA、B、Cの値を配列に格納
    var checkArray = [record['日付A'].value, record['日付B'].value, record['日付C'].value];

    // 入力済みの日付フィールドのインデックスを取得
    var index = checkArray.findIndex(function(item) {
      return item !== undefined;
    });

    // 入力済みの日付フィールドが存在しない場合、全部の日付フィールドを編集可能に設定
    if (index === -1) {
      fieldCode.forEach(function(field) {
        record[field].disabled = false;
      });
} else {
    // 入力済みの日付フィールドが存在する場合、入力済みのフィールド以外を編集不可に変更
      for (var i = 0; i < 3; i++) {
        if (i !== index) {
          record[fieldCode[i]].disabled = true;
        }
      }
    }
    return event;
  });
})();

wenxit1218様

 

お世話になっております。

丁寧なご回答誠にありがとうございます。

説明不足で申し訳ございませんでした、「実現したいこと」の動作が出来ました誠にありがとうございます。

勉強不足で申し訳ございません。

 

それから実装予定のアプリで確認したのですが、度々説明不足で申し訳ございません。

運用として、日付Aに値が入っている場合、日付A、日付Bに値が入っている場合、日付A、日付B、日付Cに値が入っている場合もあります。

申し訳ございません。すべてに値がない状態であれば問題なかったのですが、日付が入力された状態の場合もございます。

日付Aに入力したあと日付Bを追加しようとすると日付Bと日付Cが入力不可になります。

その場合日付Aを選択解除すると日付Aも日付Bも日付Cも入力不可となります。

誠に申し訳ございません、設定上そうなると思いますが、これを解消する方法はございますでしょうか?

ご迷惑をおかけして申し訳ございませんがお知恵をお借りできますと幸いです。

よろしくお願いいたします。

ku 様

>日付Aに値が入っている場合、日付A、日付Bに値が入っている場合、日付A、日付B、日付Cに値が入っている場合もあります。

説明頂きありがとうございます。
一つ以上の日付フィールドに値が入っている状況も含めて運用したい、という理解で合ってますでしょうか?

その場合、一つの日付フィールドのみ入力できるように制御する仕組みでの運用では難しいので、
他の方法を考えたほうが良いかと思いましたが、

日付のどれかが入力された場合に、他の日付フィールドを入力不可にしたい、
という仕組みにしたい目的は何でしょうか?

wenxit1218様

 

お世話になっております。

色々とご対応いただき誠にありがとうございます。

内容ご認識の通りでございます。

それから必ずこの方法でないと駄目だということではありません。

 

目的としましては少々長くなりますが、このA、B、Cの日付が入力された際に通知を送信したいのですが、

Kintone標準の通知設定だと文章が送れないため、kMailerというツールを使用しているのですが個々に日付を入れて通知を送信する場合は、

通知後編集設定というものがあり、それを設定しておくとその後日付が変更にならない限り通知が送られないフラグを設定できるのですが、

例えばAとBの2つの日付やA、B、Cの3つの日付を同時入力して編集を保存した際に通知は送信されるのですが、通知後編集の設定がループしてるのかエラーとなりその後送信しないための送信後編集のフラグが切り替わらないという状況です。

ですので運用でカバーしようと日付AとBとCのそれぞれ1つずつしか日付を入れれないようにして、送信後編集フラグが設定されるようにしたいのが目的となります。

本来日付を入れた際にメールで通知が送信できて、その後日付が変更されなければ通知が送信されないようにして日付がまた変更された場合は通知を送るという設定にできればいいのですが。

分かりづらい説明を長々とお書きして申し訳ございません。

よろしくお願いいたします。

ku 様

>日付AとBとCのそれぞれ1つずつしか日付を入れれないように

一度のレコード保存において一つの日付フィールドのみ変更可能にしたい、という理解が問題なければ、
日付フィールドの入力制御より、レコード保存時での制御のほうが仕組みとしてシンプルな気がします。

具体的に、「一つ以上の日付フィールドの変更をした場合にレコードを保存させない」仕組みになりますが、
結果的に、同時編集によるエラーを避けられるのではないかと思いました。

実際に試していないので間違いがありましたら申し訳ありませんが、
イメージとして、下記のような感じの処理になるのではないかなと思います。

①編集不可の3つのフィールドを用意する

②app.record.edit.submitイベントで、日付フィールドと編集不可の3つのフィールドの値を比較する

→編集不可の3つのフィールドが未入力(初回)の状態であれば、
日付の値をフィールドに反映して、レコードを保存。

→編集不可の3つのフィールドに前回の値があり、新しい日付フィールドからの変更が一つ以下であれば、
編集不可の3つのフィールドの値を更新し、レコードを保存。

→編集不可の3つのフィールドに前回の値があり、新しい日付フィールドからの変更が2つ以上ある場合、
エラーメッセージ出して保存させない。

よろしくお願いいたします。

wenxit1218様

お世話になっております。

いつもご丁寧なご回答誠にありがとうございます。

すみません、編集の際もなのですが日付を入力する際もA、B、Cいずれか一つの日付しか入力できないようにしたいです。

日付を入力するたびに通知が送信されるようにしたいので、新規で日付を入力する場合も日付フィールドに値が入っている状態で日付変更で修正する場合も1つの日付しか入力できないようにしたいです。

イメージを形にしようと思ったのですが、コード作成が出来ませんでした。

引き続き試行錯誤したいと思います。

もし可能であればご教示いただけましたら幸いです。

よろしくお願いします。