サブテーブルのフィールドを非活性にしたい

サブテーブルのフィールドを非活性にしたいが、サブテーブルが0行のレコードを編集する場合にサブテーブルのフィールドが非活性にならない

上ソースではサブテーブルが0行のためfor文に入らず、仮にfor文を外したとしてもtableValueが存在しないというエラーになります(サブテーブルが0行だから存在しないのも当たり前)

そのため、changeイベントで引っかかるのではないかと考えた(下ソース)のですが、こちらはイベント自体拾われませんでした。。。

調べたところ同じような悩みの質問が見当たらないため、質問させていただきます。ソースは関係ない部分を端折っているため、もしかしたら必要な部分も消してしまっている場合があります。

解決策・おすすめプラグイン(無償)等ございましたら教えていただきたいです。

javascript初心者ですが、よろしくお願いいたします。

(() => {
// おまじない
'use strict';
 // レコード編集画面を表示した後、現所有者の情報を更新する
kintone.events.on(['app.record.edit.show'],event => {
  // サブテーブルを取得
  const tableValue = event.record.サブテーブル.value;
   // サブテーブルフィールドを非活性化
  for (let i = 0; i < tableValue.length; i++){
  event.record.サブテーブル.value[i].value.サブテーブルフィールド.disabled = true;
 }
// イベントを返す
return event;
})
})()

 

(function() {
  'use strict';
    kintone.events.on(["app.record.edit.change.サブテーブル"],(event) => {
      // 行を削除した時はエラーが出ないようにevent.changes.rowが存在しているかどうか確認。
      if (event.changes.row) {
      event.changes.row.value.サブテーブルフィールド.disabled = true;
      }
      return event;
    });
})();

0行のサブテーブルの1行目は、edit.showと同じタイミングで生成されるようです。

そのため、setTimeout()を使うことで、イベント(edit.show)が終わってからサブテーブルを参照させることができます。ただしイベントが終わっているので、event.recordを参照することはできません。kintone.app.record.get()kintone.app.record.set()を使う必要があります。

    kintone.events.on(['app.record.edit.show'], event => {
        setTimeout(() => {
            let recordData = kintone.app.record.get(), rec = recordData.record;

            for (let i = 0; i < rec['サブテーブル'].value.length; i++){
                rec['サブテーブル'].value[i].value['サブテーブルフィールド'].disabled = true;
            };

            kintone.app.record.set(recordData);
        }, 0);

        return event;
    });

mls-hashimoto

ソースを修正したところ無事フィールドが非活性になりました。

生成のタイミングやevent.recordを参照することができないなど細かく教えていただきありがとうございました。

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