添付ファイルフィールドに添付ファイルが1個以上入っているフィールドの個数を取得

添付ファイルフィールドが、複数あり(最終的には20個ほど)添付ファイルが登録されているフィールドの個数を取得したくて下記のフィールドをテストで作成しました。

有効添付数(数値フィールド)
添付頁資料PDF00a,添付頁資料PDF00b,添付頁資料PDF01(添付ファイルフィールド)

添付ファイルを登録しても、総数0となります。

修正箇所を教えてください。

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

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

コードを(function() {‘use strict’;

// 【設定】テスト中の添付ファイルフィールドの「フィールドコード」を正確に並べますconst TARGET_FIELDS = [‘添付頁資料PDF00a’,‘添付頁資料PDF00b’,‘添付頁資料PDF01’];

const COUNT_FIELD = ‘有効添付数’;

kintone.events.on([‘app.record.create.submit.success’, ‘app.record.edit.submit.success’], function (event) {let record = event.record;let attachedFieldCount = 0;

// 各フィールドコードをもとに、画面上の要素を1つずつ直接狙い撃ちで調べます
TARGET_FIELDS.forEach(function(fieldCode) {
  
  // kintoneの入力画面における、各フィールドの固有クラス(.field-フィールドコード)を指定
  const fieldClassName = 'field-' + fieldCode;
  const fieldElements = document.getElementsByClassName(fieldClassName);

  if (fieldElements && fieldElements.length > 0) {
    // そのフィールドの枠の中に、ユーザー様が成功した「plupload_file_name」が1つ以上あるか確認
    const files = fieldElements[0].getElementsByClassName("plupload_file_name");
    
    if (files && files.length > 0) {
      console.log('【ファイル発見】フィールドコード:', fieldCode);
      attachedFieldCount++;
    }
  } else {
    console.log('【警告】画面上にこのフィールドのクラスが見つかりません:', fieldClassName);
  }
});

console.log('ファイルが登録されているフィールドの総数:', attachedFieldCount);

// 数値フィールドに合計数をセット
if (record[COUNT_FIELD]) {
  record[COUNT_FIELD].value = attachedFieldCount;
}

return event;

});

// 画面表示時の非表示処理(テストのために一旦コメントアウトしています)/*kintone.events.on([‘app.record.detail.show’, ‘app.record.create.show’, ‘app.record.edit.show’], function(event) {kintone.app.record.setFieldShown(COUNT_FIELD, false);return event;});*/

})();ここに入力または貼り付け

こんにちは。アスノートの松田です。
ちょっと前の記事になりますが、以下の記事の考え方の応用でいけると思います。参考になれば幸いです。

ポイントとしては、

  • submitイベントでは添付ファイルフィールドの情報が取れない
  • successイベントでDOMから取得可能(非推奨ではあるが)
  • しかし、successイベントで、eventオブジェクトによるフィールド値更新はできない

(松田さんからのご指摘のとおり、successイベントでフィールドの値更新はできませんね、
どのイベントで何ができて何ができない、などはリファレンスにまとまっておりますのでご参考までに :folded_hands:

松田様

回答ありがとうございます。

そちらの記事を参照していたのですが、

  • successイベントでDOMから取得可能(非推奨ではあるが)

  • しかし、successイベントで、eventオブジェクトによるフィールド値更新はできない

なのですね。

Geminiに頼りつつ、下記の内容で一覧に表示させることに成功しました。

(function() {
‘use strict’;

const COUNT_FIELD = ‘有効添付数’;

kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’], function (event) {
let record = event.record;

// 1. ユーザー様が成功した、画面内のすべての「ファイル名要素」を掴む
var fileElements = document.getElementsByClassName("plupload_file_name");

// 2. ファイルが所属している「添付ファイルフィールドの枠」を特定するためのセット(重複を排除する箱)を用意
var attachedFields = new Set();

for (var i = 0; i < fileElements.length; i++) {
  // 核心:ファイル名要素から、kintoneの「添付ファイルフィールド枠」の本体(.kintone-app-record-attachments)まで上方向に遡る
  var parentField = fileElements[i].closest('.kintone-app-record-attachments, .field-attachments, td, div[class*="field-"]');
  
  if (parentField) {
    // 見つかった親要素(フィールド枠)をセットに放り込む(同じ枠に2個ファイルがあっても、セットなので1つにまとまります)
    attachedFields.add(parentField);
  }
}

// 3. セットに溜まった「ファイルが入っていたフィールドの数」が、求めたい総数です
var attachedFieldCount = attachedFields.size;

console.log('ファイルが登録されているフィールドの総数:', attachedFieldCount);

// 数値フィールドに合計数をセット
if (record[COUNT_FIELD]) {
  record[COUNT_FIELD].value = attachedFieldCount;
}

return event;

});

// 画面を開いた時の非表示処理
kintone.events.on([‘app.record.detail.show’, ‘app.record.create.show’, ‘app.record.edit.show’], function(event) {
kintone.app.record.setFieldShown(COUNT_FIELD, false);
return event;
});

})();

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

参考にさせていただきます。