テーブルに行を追加した後に、項目をクリアすると直前の行もクリアされてしまう

テーブルの指定した行をコピーした後に、コピーした行のある項目のみクリアしたいのですが、コピー元の項目もクリアされてしまいます。

具体的には、「コピー」フィールドにチェックが入っていた場合、チェックした行をコピーして行を追加した後、追加した行の「数量」をクリアしたら、同時にコピー元の「数量」もクリアされてしまいます。

以下のスクリプトの「addRowData.value.数量.value = “”;」を行うと、コピー元の行の数量もクリアされてしまいます。コピー元の数量をクリアされない方法はどのようにすればいいのでしょうか。

(function () {
    "use strict";
    const table = '運行記録TBL';
    const events = [
        'app.record.create.change.コピー',
        'app.record.edit.change.コピー',
        'mobile.app.record.create.change.コピー',
        'mobile.app.record.edit.change.コピー'
    ];
    kintone.events.on(events, function(event) {
        const record = event.record;
        // チェックボックスがチェックされた場合に作動させる
       if (event.changes.field.value.length !== 0) {
            // コピー挿入するテーブル行のデータ作成
            const addRowData = { "value": event.changes.row.value };
            //
            addRowData.value.数量.value = "";
            // 指定された行のデータをeventオブジェクトの既存テーブル最下行に挿入
            var newRow = event.record[table]['value'].push(addRowData);
            // チェックボックスのクリアー
            event.changes.field.value = [];
            return event;
            //
        };
    });
})();

hirofuさん こんにちは。下記にていかがでしょうか?

追記した部分は ★ でコメントいたしました! 

(function () {
    "use strict";
   const table = '運行記録TBL';
    const events = [
        'app.record.create.change.コピー',
        'app.record.edit.change.コピー',
        'mobile.app.record.create.change.コピー',
        'mobile.app.record.edit.change.コピー'
    ];
    kintone.events.on(events, function(event) {
        const record = event.record;
        // チェックボックスがチェックされた場合に作動させる
        if (event.changes.field.value.length !== 0) {
           // ⭐️ 先にコピー元のチェックボックスを空にする
          event.changes.row.value.コピー.value = [];
         // ⭐️ コピー元のデータを一度文字列に変換する         
            const originData = JSON.parse(JSON.stringify(event.changes.row.value));
          // コピー挿入するテーブル行のデータ作成 ⭐️↓変換したデータを投入する
            const addRowData = { "value": originData };
            //
            addRowData.value.数量.value = "";
            // 指定された行のデータをeventオブジェクトの既存テーブル最下行に挿入
            var newRow = event.record[table]['value'].push(addRowData);
          // チェックボックスのクリアー ⭐️↓こちらはなくても大丈夫だと思いますのでコメントアウトしました
          // event.changes.field.value = [];
            return event;
            //
        }
      return event; // ⭐️老婆心ながら最後にも return event; 置かせていただきました
    });
})();

らむ様

実行した結果、以下のようなエラーが発生しました。

カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。

  • event.record[‘運行記録TBL’].value[4][‘メッセージ’].value が不正です。
  • event.record[‘運行記録TBL’].value[4][‘ルックアップ’].value が不正です。

デバッグで見たところ、return event までのステップはエラーなく通過したのですが、その後上記のようなエラーが発生しました。
添付は4行あるデータの内、最後の4行目をコピーする動作を使用としている画面です。

らむ様

原因が分かりました。

ルックアップが空白だとエラーが出るようです。
業務上、コピーする時点では空白のことがあるので、ルックアップが空白でもエラーがでないようにする方法はありますか?

hirofuさん

詳細ありがとうございます!一度JSONにしたことによって、空文字のvalue情報がなくなってしまっていたようです。

originDataの作成の後に、以下のif文を追加してみてもらって、いかがでしょうか?

ルックアップに限らず、値が空のフィールドに対して処理が走るようにいたしました。

const originData = JSON.parse(JSON.stringify(event.changes.row.value));
// ⭐️ ↓ 値がなかったらvalue情報を空文字で作ってあげる
Object.keys(originData).forEach((code) => {
  if(!originData[code].value){
       originData[code].value = "";
  }
});

// ⭐️ もしルックアップだけ!であれば下記でも動きます
// (他のフィールドは絶対情報が埋まっている前提です、ご参考までに..)
if(!originData[ルックアップフィールドコード].value){
  originData[ルックアップフィールドコード].value = "";
}

らむ様

できました!

本当にありがとうございました。

らむ様

元のチェックボックスの値を空白にしないで残すようにするため、
event.changes.row.value.コピー.value = [];
この行をコメントにしたら、画面が固まってしまいました。

そのため、今度はこの行を空白にするのではなく、値をセットしようとして
event.changes.row.value.コピー.value = [‘:heavy_check_mark:︎’];
チェックマークを設定してみましたが、同様に画面が固まってしまいました。

元の行のチェックマークを残すようにするには、どのように変更すればいいのでしょうか?

らむ様

event.changes.row.value.コピー.value = [‘:heavy_check_mark:︎’];
上記のように変更して、

addRowData.value.コピー.value = [];
を追加したら、できました。
なぜ、この行を追加したら、画面が固まらなくなるのでしょうか?
理由がお分かりになれば教えてください。

今後は新たな問題が発生しました。

スマホで使用する場合、数字フィールドは自動的にテンキーが立ち上がるように以下のスクリプトを実装していますが、機能しなくなってしまいました。どのように直せばいいのでしょうか?

jQuery.noConflict();
(function($) {
 "use strict";
 kintone.events.on(["mobile.app.record.edit.show","mobile.app.record.create.show","mobile.app.record.create.change.運行記録TBL","mobile.app.record.edit.change.運行記録TBL",'mobile.app.record.edit.change.コピー'], function(event) {
 $('.gaia-ui-decimal-input-input input').attr('type', 'number');
 return event;
 });
})(jQuery);

追加情報です。

イベントを以下のように変更しましたが、push して行を追加したときに、これらのイベントが発生していないのではないかと思われます。

“mobile.app.record.edit.show”,
“mobile.app.record.create.show”,
“mobile.app.record.create.change.運行記録TBL”,
“mobile.app.record.edit.change.運行記録TBL”,
“mobile.app.record.edit.change.コピー”,
“mobile.app.record.create.change.コピー”,
“mobile.app.record.create.submit”,
“mobile.app.record.create.submit.success”

var newRow = event.record[table][‘value’].push(addRowData);

上記、行を追加したあとに、以下のスクリプトにより数字モードにできました。

setTimeout(() => {
                jQuery('.gaia-ui-decimal-input-input input').attr('type', 'number');
            },0);

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