関連レコードのフィールドを含めてCSV出力したい

kintoneアプリの文字列フィールドに社員番号があり、関連レコードで、社員の氏名や所属コードなどを表示しています。
このアプリを表示したときに、CSVボタンを表示させて、関連フィールドを含めた項目をふぃある出力したいです。

<発生した問題やエラーメッセージ>
以下のサイトを参考に、初心者ながらJavaScriptを作成してみたのですが、エラーがでてしまいました。

<実行したコード>

// csvデータの作成
  const getMakeCsv = (appId, customerRecords) => {
    // 同じ会社名の関連レコードを取得
    const fetchRelatedRecords = (opt_index, opt_data) => {
      const index = opt_index || 0;
      const data = opt_data || [];
      const customerRecord = customerRecords[index];

      const bango = customerRecord.請求営業社員番号.value;
      const sosiki = customerRecord.組織コード.value;
      const query = `社員番号 = "${bango}"`; // 番号をキーに該当関連レコードを取得

      const params = {
        app: appId,
        query: query
      };
      return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params)
        .then((resp) => {
          const row = [sosiki, bango];
          const relatedRecords = resp.records;
          if (relatedRecords.length > 0) {
            relatedRecords.forEach((relatedRecord) => {
              const sales = relatedRecord.氏名.value;
              const center = relatedRecord.センターコード.value;
              row.push(sales);
              row.push(center);
            });
          }
          data.push(row.join(','));
          if (customerRecords.length > index + 1) {
            return fetchRelatedRecords(index + 1, data);
          }
          return data;
        });
    };

社員番号のキーがうまくリンクしていないようなのですが、エラー内容をみても修正箇所が分かりません。助けていただけないでしょうか。

コードが一部しか書かれていませんが、全容はこんな感じでしょうか。

これだと、フィールドが全て文字列(1行)で、下図のように配置されていれば
CSV出力できましたが、エラーが出るなら、こういう配置ではないんですよね?

どのフィールドコードが、どのフィールドの種類で、どのアプリにありますか?

(() => {
  'use strict';

  // CSV出力用ボタンを一覧画面に追加
  kintone.events.on('app.record.index.show', (event) => {
    if (document.getElementById('btn-export-csv')) return;

    const button = document.createElement('button');
    button.id = 'btn-export-csv';
    button.textContent = 'CSV出力';
    button.style.marginRight = '10px';

    kintone.app.getHeaderMenuSpaceElement().appendChild(button);

    button.addEventListener('click', () => {
      const customerRecords = event.records;
      const relatedAppId = n; // ← 実際のアプリIDに書き換える

      getMakeCsv(relatedAppId, customerRecords).then((csvData) => {
        downloadCsv(csvData);
      }).catch((error) => {
        console.error('CSV生成中にエラー:', error);
        alert('CSV出力中にエラーが発生しました。詳細はコンソールを確認してください。');
      });
    });

    return event;
  });

  // ↓ 元コードに、Promiseのreturnと、ヘッダー追加を足しただけ
  const getMakeCsv = (appId, customerRecords) => {
    const fetchRelatedRecords = (opt_index, opt_data) => {
      const index = opt_index || 0;
      const data = opt_data || [];
      const customerRecord = customerRecords[index];

      const bango = customerRecord.請求営業社員番号.value;
      const sosiki = customerRecord.組織コード.value;
      const query = `社員番号 = "${bango}"`;

      const params = {
        app: appId,
        query: query
      };

      return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params)
        .then((resp) => {
          const row = [sosiki, bango];
          const relatedRecords = resp.records;

          if (relatedRecords.length > 0) {
            relatedRecords.forEach((relatedRecord) => {
              const sales = relatedRecord.氏名.value;
              const center = relatedRecord.センターコード.value;
              row.push(sales);
              row.push(center);
            });
          }

          data.push(row.join(','));

          if (customerRecords.length > index + 1) {
            return fetchRelatedRecords(index + 1, data);
          }

          return data;
        });
    };

    // 最初にヘッダー行を追加
    const header = ['組織コード', '請求営業社員番号', '氏名', 'センターコード'].join(',');
    let csvData = [header];

    return fetchRelatedRecords().then((rows) => {
      return csvData.concat(rows); // ヘッダー + データ行
    });
  };

  // CSVをダウンロードする関数
  const downloadCsv = (data) => {
    const csv = data.join('\r\n');
    const bom = new Uint8Array([0xef, 0xbb, 0xbf]);
    const blob = new Blob([bom, csv], { type: 'text/csv' });
    const url = URL.createObjectURL(blob);

    const a = document.createElement('a');
    a.href = url;
    a.download = `export_${getTimeStamp()}.csv`;
    a.click();
    URL.revokeObjectURL(url);
  };

  // タイムスタンプ生成
  const getTimeStamp = () => {
    const now = new Date();
    const pad = (n) => n.toString().padStart(2, '0');
    return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}_${pad(now.getHours())}${pad(now.getMinutes())}`;
  };

})();

もみじさん
早速の返信をありがとうございます。
画面もありがとうございます。参照するアプリは、関連レコードで表示しているものを出力希望でした。

そして、改めて、先頭からコードを確認していたところ、関連レコード一覧のフィールドコードをサンプルのコードから修正しておらず、そちらを正しく修正しましたら、正常に動きました!

お騒がせいたしました。解決しております。

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