日付フィールド+時刻フィールドを日時フィールドに自動で転記したいです。

こんにちは。

いつも参考にさせていただいております。

休暇申請アプリがあり、レコード内にある時刻フィールドと日付フィールドに値を入力すると

日時フィールドに自動で結合させるコードを作成しました。

PC版のコードは問題なく動いておりますが、モバイル版の方のみエラーが発生するので、

原因をご教授ください。

・エラーが出るフィールド:時刻フィールド

・エラーのタイミング:時刻フィールドに入れた値を一度クリアして、再度入力し直す時

・エラー内容:「時刻の形式が不正です。」

・結果:時刻フィールドの値が入力できない

↓↓↓↓PC版のコードはこちらになります。このコードは正常に動作しています。

(function() {
‘use strict’;

var showEvent = [

‘app.record.create.change.開始時刻’,

‘app.record.create.change.取得開始日’,

‘app.record.edit.change.取得開始日’,

‘app.record.edit.change.開始時刻’

];

kintone.events.on(showEvent, function(event) {
var record = event.record;
var date = record[‘取得開始日’][‘value’];
var time = record[‘開始時刻’][‘value’];

// 日付フィールドと時刻フィールドに値が設定されていれば日時を算出する
if (date !== undefined && time !== undefined) {
record[‘取得開始日時’][‘value’] = date + ‘T’ + time + ‘+09:00’;
}

// 日時フィールドは手入力させない
record[‘取得開始日時’][‘disabled’] = true;

return event;
});

})();

(function () {
  'use strict';

  // スマホ用イベント
  var mobileEvents = [
    'mobile.app.record.create.change.取得開始日',
    'mobile.app.record.create.change.開始時刻',
    'mobile.app.record.edit.change.取得開始日',
    'mobile.app.record.edit.change.開始時刻'
  ];

  kintone.events.on(mobileEvents, function (event) {
    var record = event.record;
    var date = record['取得開始日'].value;
    var time = record['開始時刻'].value;

    // 日付と時刻が両方入っている場合のみ結合
    if (date !== undefined && time !== undefined) {
      record['取得開始日時'].value = date + 'T' + time + '+09:00';
    }

    // 手入力不可にする
    record['取得開始日時'].disabled = true;

    return event;
  });
})();

お世話になります。

mobileの日時の持たせ方でエラーになるのではとパッと見ですが感じました。

undefinedではないなら条件通過しそうなので

値があるかないかにしてみてはどうでしょうか?

if (date && time) {
record[‘取得開始日時’].value = date + ‘T’ + time + ‘+09:00’;
} else {
// どちらか空なら日時もクリア
record[‘取得開始日時’].value = ‘’;
}

スマホ版の時刻フィールドは、 PC 版と違って を別々に選ぶ UI になっています。

で、私も前に引っかかったことがあるのですが、なぜか 時と分どちらかが空欄の場合は undefined になり、なぜか そのまま return event すると undefined が時刻フィールドに再セットされます

つまり、時刻フィールドの変更イベントの最後で return event を必ず行うと、時か分のどちらかを入力したタイミングで常に undefined が設定される = 入力してもすぐクリアされる、という挙動になります。

調べてみたら、過去にも同じ現象で困っていた方がいらっしゃったみたいです。


対処法としては、裏ワザというかあまり推奨される方法ではないのですが、

  • 時刻フィールドの変更時イベントでは、時と分の両方が埋まった (= undefined じゃなかった) 場合のみ return event をする

という方法しかないのではないかと思います。過去の記事でもその方法で対応されているっぽいです。

ただ、日付フィールドはそのような問題が起きないので、ちゃんと最後に return event を行ったほうがいいです。なので日付フィールドと時刻フィールドでイベントハンドラを分けておくのが良いと思います。