一覧画面インライン編集時に、時刻フィールドに値を格納する機能の不具合を修正したい

kintone カスタマイズ

機能詳細

チーム内で業務工数を登録できる日報アプリを作成し、一覧画面でインライン編集時に、時刻フィールドでそれぞれ設定した作業完了、中断開始、中断終了を個々で時刻を選択した際に「現在時刻を登録しますか?」というダイアログを表示させて、OKを選択した際は現在時刻を、キャンセルの場合は選択した時刻を値に格納する機能を以下のソースコードにて実装しています。

ソースコード

(() => {
    'use strict';

    /** JavaScriptを実行する対象となるイベントを指定(レコード一覧:作業完了、中断開始、中断終了) */ 
    //作業完了
    kintone.events.on('app.record.index.edit.change.end', function(event){// 処理をイベントに登録します
        
        const record = event.record;
        /**時刻 */
        let data = new Date();
        let hour = data.getHours();
        let min = data.getMinutes();
        let time = hour + ':' +(('0' +  min).slice(-2));

        if(record['end']['value'] != time){
            
            if(confirm("現在時刻を設定しますか?")){
                record['end']['value'] = time;
            }else{
                record['end']['value'];
            }
        }
        return event;
    });

    //中断開始
    kintone.events.on('app.record.index.edit.change.break_start', function(event){// 処理をイベントに登録します
        const record = event.record;
        /**時刻 */
        let data = new Date();
        let hour = data.getHours();
        let min = data.getMinutes();  
        let time = hour + ':' +(('0' +  min).slice(-2));
        
        if(record['break_start']['value'] != time){
            
            if(confirm("現在時刻を設定しますか?")){
                record['break_start']['value'] = time;
            }else{
                record['break_start']['value'];
            }
        }
        return event;
    });

    //中断終了
    kintone.events.on('app.record.index.edit.change.break_end', function(event){// 処理をイベントに登録します
        const record = event.record;
        /**時刻 */
        let data = new Date();
        let hour = data.getHours();
        let min = data.getMinutes();
        let time = hour + ':' +(('0' +  min).slice(-2));
        
        if(record['break_end']['value'] != time){
            
            if(confirm("現在時刻を設定しますか?")){
                record['break_end']['value'] = time;
            }else{
                record['break_end']['value'];
            }
        }
        return event;

    });

})();

問題点

インライン編集時にフィールドで時刻を選択し、ダイアログからクリック後、操作していない他のフィールドイベントもソースコードが動作してしまい、値が格納されてしまいます。

画像

手順①

手順②

手順③

  • 上記では、作業完了を選択時の動作結果です。作業完了のみ値が格納されるのが正ですが、中断開 始、中断終了にも処理が走って値が格納されてしまいます。
  • 「キャンセル」を押下した際も同様の処理になります。
  • 上記は、特にインライン編集をし始めに発生し、複数回クリック動作をやり直すと発生しない場合もあります。

発生した時期・影響について

  • 機能実装時には問題なく運用できていましたが、数日前からチーム内で説明した動作が発生しています。
  • 環境はwindows、ブラウザはchromeになります。
  • 開発情報等、参照し記載の見直しを行ったりしましたが解決に至っておりません。

技術的に実現したいこと

  • 選択した時刻フィールド以外のjavascriptの、kintone event処理が走らないようにしたいです。
    デバックをかけたところ、一度ひとつのフィールドイベントからreturn eventまで実行すると、ほかのkintone eventの処理も自動的に走ってしまうことが確認できました。
  • 対処方法やソースコードの記載の仕方について、ご教示いただきたいです。

どうやら空白だとindex.edit.show(編集開始時)にnullだったのがkintoneの機能で空文字(‘’)に書き換わるためにchangeイベントが発生するようです。

nullにしてreturn eventしても空文字になってしまい変わらなかったので、対策としては新規作成時(create.show)で0:00を代入しておくとかでしょうか。

「いいね!」 1

ご連絡ありがとうございます。
試しに作業完了、中断開始、中断終了に初期値を0:00に設定して実行したところ、解消されました。

開発情報にも記載がなく、路頭に迷っていたため一旦原因がはっきりして助かりました!
一旦こちらに関してはクローズさせていただきます。

「いいね!」 1

このトピックは最後の返信から 60 分が経過したので自動的にクローズされました。新たに返信することはできません。