アクションボタンで必要なフィールドがコピーされない(二つのプログラムの干渉)

何を実現したいのかを書きましょう

自動採番させるプログラム1(アクションボタンを使用)と
ラジオボタンの選択によって
値をクリアにして非表示させるプログラム2(テーブル有り)の
2つをカスタマイズ。

発生した問題やエラーメッセージを具体的に書きましょう

プログラム2のクリアにさせたい項目にテーブルが含まれており
テーブル以外をクリアさせるのは上手くいくのですが
プログラム2にテーブルをクリアさせるための行を追加すると
テーブルの値は希望通りクリアされてるのですが
アクションボタンによる自動採番がうまく動かなくなります。
自動採番の動きとしては、
アクションボタン「差替え」を押すと全フィールドをコピーし
自動採番させている「管理番号」数値フィールドも引き継ぐ。
新規レコード追加とレコード再利用ボタンのときは
新たに「管理番号」を採番する。というのが正常な動きなのですが
アクションボタン「差替え」を押しても
新規採番されてしまいます。
本来であれば、アクションボタン押した場合管理番号もコピーされて
フィールドに値が入っているはずなのですが
空白で値がコピーされないので
自動採番のプログラム2では
新規採番の条件と合致して、新規採番されています。
プログラム1のテーブルの値(飛行機)をクリアさせる行を
コメントアウトすると自動採番が正常に動きます。

アクションボタンを押したときの
コンソールのエラーメッセージは
edit.js:1544 Uncaught TypeError: Cannot read properties of null (reading ‘Qa’)
と出ますが、意味を理解できておりません。
テーブルをクリアする行が
アクションボタンの動きとどうして干渉しているのか・・・・?
どなたかご教示ください。
よろしくお願いします。

実行したコードをコピー&ペーストしましょう

/////////////// プログラム1 表示非表示と値クリア //////////////////////
(() =>{
    'use strict';

//各種イベント取得    
    let checkEv = ['app.record.create.show',
                    'app.record.edit.show']; //追加・編集画面
    let radiobuttonEv = ['app.record.edit.change.切符手配','app.record.create.change.切符手配']; //切符手配が変更されたとき ラジオボタン

//入力制限関数
    function advance (event) {
        const record = event.record;
        const radiobutton2 = record['切符手配'].value;
        const Fieldcodes2 = ['チケット手配者','飛行機','列車','兼松負担者','負担理由'];  

        //チケット手配無しが選択されたら情報を非表示
        Fieldcodes2.forEach(function(fieldcode2){    
            if(radiobutton2 === '無'){
                console.log('チケット無し:クリア');
                record.飛行機.value = [];    //飛行機はテーブルフィールドコード
                record.チケット手配者.value = [];
                record.兼松負担者.value = '';
                record.兼松負担者.value = null;
                record.負担理由.value = '';
                record.負担理由.value = null;  
                kintone.app.record.setFieldShown(fieldcode2,false);  //チケット手配無しの場合非表示
            }else{
                kintone.app.record.setFieldShown(fieldcode2,true);
            }
        });                         
        return event;
    }  

//イベント発生
    kintone.events.on(checkEv,advance);
    kintone.events.on(radiobuttonEv,advance);  
            
})();  

////////////////////// プログラム2 自動採番 /////////////////////////////////
(() => {
    'use strict';

    let reuse;
    let kanriNo;

kintone.events.on('app.record.create.show', function(event)  {  //追加画面イベント
    const record = event.record;
    reuse = event.reuse;   //レコード再利用の時reuse=true
    kanriNo = record['管理番号'].value;
    console.log('追加画面管理番号'+kanriNo);    
    return event;      
}); 

kintone.events.on('app.record.create.submit',function(event){     //保存時のイベント            
    const record = event.record;
    console.log('保存イベント管理番号'+kanriNo);
    console.log(record);

    const body = {    //クエリで取得データの指定 管理番号を降順で一番大きい数字を1件
    app: event.appId,
    fields:['管理番号'],  //欲しいデーターの場所を指定
    query:'order by 管理番号 desc limit 1'   //「order by  管理番号 desc」で並び順を変える
    };
    
    return kintone.api(kintone.api.url('/k/v1/records',true),'GET',body).then(function(resp){ 

    if(resp.records.length === 0) {
        event.record['管理番号']['value'] = 1;    //レコード1個目の時初期値設定
        } else if (!kanriNo ||(reuse === true)){
        console.log('新番号取得');  
        const newUid = Number(resp.records[0].管理番号.value) + 1;
        event.record['管理番号']['value'] = newUid;
        console.log('新番号'+newUid); 
    }else{
        console.log('差替え');
    }        

    return event;
    }).catch(function(error){
        console.log(error);  //error
    });    
});
  
})();
  

アクションボタンを押すと初期値が入力された状態でレコード作成画面が表示される、ということになりますので、
プログラム1が先に動作し、テーブルの削除が動作してしまっている、ことだとおもいますがどうでしょうか

対応策として、こちらの記事にあるように、アクションボタンをおして作成されたデータか?を判定できるようにして、コードを分岐させるのが一番楽かなとはおもいます

mura様

お返事ありがとうございます。

自動採番の条件として
新規採番
①管理番号フィールド初期値「空白」の時(←レコード追加ボタン)
②reuse === trueの時(←レコード再利用ボタン)
新規採番しない
①管理番号に値が入っているとき(←アクションボタン使用時)
とし、添付して頂いた参考リンクの機能を使っております。

本来、上記条件でアクションボタンで
「管理番号」に初期値が入力された状態に
したかったのですが、現状アクションボタンを押すと「管理番号」に
初期値が入力されずに空白の状態になってしまいます。
よって、自動採番のプログラムの条件で新規採番と判断されて
管理番号が更新されてしまうという意図しない動きになっております。

どうして、アクションボタンを押しているのに
初期値が入力(データがコピー)されないのか?
を探る為に追加したプログラムを部分的にコメントアウトしていく中で
テーブル値をクリアする行をコメントアウトすると
意図した動ができる事がわかりました。

テーブル値をクリアさせる方法が間違っているのか?
自動採番のプログラムの非同期処理のようなものがわるさをしているのか?
どうしてテーブル値クリアの部分が影響してくるのかが分からず困っております。

ちなみに、値をクリアさせるテーブルは「管理番号」フィールドとは無関係で管理番号フィールドは数値フィールドです。

問題の切り分けのためにききたいんですが

  1. アクションボタンの設定で、管理番号がコピーされる設定にしてある
  2. にも関わらずアクションボタンを押下し追加画面が表示されたタイミングですでに管理番号がリセットされてしまう

であってますか?
submitのときにきえる、など誤解があったらおしえてください。

mura様

ご質問の1.2はその通りです。

・アクションボタンでの動き
アクションボタンで管理番号をコピーしてレコード追加画面が表示。
→保存した時に、コピーされた管理番号がそのまま保存される。
結果、管理番号に変更なし

・レコード追加ボタン・レコード再利用ボタンでの動き
各々のボタンでレコード追加画面が表示されるが、管理番号フィールドは空白。
→保存した時に管理番号が更新される。
結果、管理番号が新規採番される。

以上が想定している動きとなります。

なるほど
問題の切り分けのために、ブレークポイントを設定して、コードをステップ実行してみるとどうでしょうか?
どこかのタイミングで消えてしまってるはずなので改めてみてみるとなにかわかるかもしれません。

あと、ここまでかいてちょっとおもったんですが
ここのコード行があるなしで結果がかわるならむしろ、あるときに実行できてない=エラーでとまってしまっている ということはありえませんかね?

            record.飛行機.value = [];    //飛行機はテーブルフィールドコード

たとえば 飛行機 というフィールドコードはじつは無い、とかですね。
(まぁどちらにせよステップ実行すればわかることではあります

mura様

ありがとうございます。
確認してみます。

該当箇所でエラーがでているがゆえに return event までたどり着かず、アクションでコピーされてほしい値が保持されない(消えるわけではなくそもそもコピー自体されてない)可能性があるのかなと、試してないですけど予想です

mura様

質問ですが
テーブルの値をクリアしたい場合は
record.飛行機.value = [];
の書き方で合ってるでしょうか?
飛行機はテーブルのフィールドコードでして
テーブル全体を指定してクリアしてる感じなのですが
テーブルの表示非表示の時の様に
forEachでテーブル内のそれぞれのフィールドコードを指定して
クリアしていかなくてはいけないのでしょうか?
この行が何か悪さをしている気がしてならないのですが・・・。
一旦、教えていただいた参考リンクを見ながら確認してみます。

それでできるはずですね。
フィールドコードはただしいということでしょうか?
一度エラーがでてないかまずはみてみるのはどうでしょうか…?

もしくはそのテーブルが影響するほかのJSやプラグインとかがある、など…?

「いいね!」 1