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;
});
};
社員番号のキーがうまくリンクしていないようなのですが、エラー内容をみても修正箇所が分かりません。助けていただけないでしょうか。
Maple
(もみじ)
2
コードが一部しか書かれていませんが、全容はこんな感じでしょうか。
これだと、フィールドが全て文字列(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())}`;
};
})();
もみじさん
早速の返信をありがとうございます。
画面もありがとうございます。参照するアプリは、関連レコードで表示しているものを出力希望でした。
そして、改めて、先頭からコードを確認していたところ、関連レコード一覧のフィールドコードをサンプルのコードから修正しておらず、そちらを正しく修正しましたら、正常に動きました!
お騒がせいたしました。解決しております。
system
(system)
クローズされました:
4
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。