开发者中心包含此范例的模板(回复记录CSV下载),请前往开发者中心下载学习。
概要
这次的范例,我们将使用 批量获取记录的回复 的API,以CSV形式下载记录的回复信息。
大家不妨在自己的环境里尝试看看。
完成的样子
CSV输出用的按钮设置和输出对象的回复列表。
输出后的CSV文件范例
自定义
我们将通过以下的三个步骤进行JavaScript自定义,CSV下载记录的回复信息。
① 获取回复数据
② 更改CSV回复数据的格式
③ 将①、②步骤中作成的CSV文件下载到本地
①获取回复数据
使用批量获取记录的回复 一次最多获取的回复数为10条。
因此,为了拿到记录里的全部回复,就需要重复处理。
const getCommentsData = (opt_offset, opt_comments) => { const offset = opt_offset || 0; const body = { 'app': kintone.app.getId(), 'record': kintone.app.record.getId(), 'offset': offset }; let comments = opt_comments || []; return kintone.api(kintone.api.url('/k/v1/record/comments.json', true), 'GET', body).then((resp) => { comments = comments.concat(resp.comments); if (resp.older === true) { return getCommentsData(offset + 10, comments); } return comments; }); };
②格式变更
接下来将获取到的回复数据变换成CSV形式。
// 转义 const escapeStr = (value) => { return '"' + (value ? value.replace(/"/g, '""') : '') + '"'; } const createCSVData = (comments) => { const comments_csv = []; // CSV文件的各列的名称 const column_row = ['回复ID', '回复内容', '回复时间', '回复人的登录名', '回复人的显示名称', '@对象', '@类型']; comments_csv.push(column_row); for (let i = 0; i < comments.length; i++) { const row = []; const mentions_code = []; const mentions_type = []; if (comments[i].mentions[0] === undefined) { comments[i].mentions.code = null; } for (let k = 0; k < comments[i].mentions.length; k++) { mentions_code.push(comments[i].mentions[k].code); mentions_type.push(comments[i].mentions[k].type); } row.push(escapeStr(comments[i].id)); // 回复ID row.push(escapeStr(comments[i].text)); // 回复内容 row.push(escapeStr(comments[i].createdAt)); // 回复时间 row.push(escapeStr(comments[i].creator.code)); // 回复人的登录名 row.push(escapeStr(comments[i].creator.name)); // 回复人的显示名称 row.push(escapeStr(mentions_code.join(','))); // @对象 row.push(escapeStr(mentions_type.join(','))); // @类型 comments_csv.push(row); } return comments_csv; }
③下载
头部添加按钮,下载文件。
// 记录详情页面 kintone.events.on(['app.record.detail.show'], (event) => { // 在页面头部里插入按钮 const header_element = kintone.app.record.getHeaderMenuSpaceElement(); const csv_button = document.createElement('button'); csv_button.id = 'download-comment-csv'; csv_button.innerText = '使用CSV下载回复'; csv_button.onclick = function() { getCommentsData().then((comments) => { // 生成CSV数据 const csv = createCSVData(comments); // 以BOM形式下载 const csvbuf = csv.map((e) => { return e.join(','); }).join('\r\n'); const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const blob = new Blob([bom, csvbuf], {type: 'text/csv'}); const url = (window.URL || window.webkitURL).createObjectURL(blob); // 文件名:应用编号_记录编号.csv const appId = kintone.app.getId(); const recordId = kintone.app.record.getId(); const fileName = appId + '_' + recordId + '_comments.csv'; const link = document.createElement('a'); const e = new MouseEvent('click', {view: window, bubbles: true, cancelable: true}); link.download = fileName; link.href = url; link.dispatchEvent(e); }); }; header_element.appendChild(csv_button); return event; });
从应用记录列表页面获得所有记录的回复信息
这次作为应用篇
在记录列表页面里放置 “CSV下载” 按钮,点一下便执行下载操作
执行了CSV文件字段里添加记录编号的操作(为了知道哪条记录的回复)。
完成的样子
CSV输出用的按钮的设置和输出对象的回复列表
CSV输出范例
范例代码
(() => { 'use strict'; // 转义 const escapeStr = (value) => { return '"' + (value ? value.replace(/"/g, '""') : '') + '"'; }; // 下载CSV文件 const downloadCSV = (csv) => { const csvbuf = csv.map((e) => { return e.join(','); }).join('\r\n'); const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const blob = new Blob([bom, csvbuf], {type: 'text/csv'}); const url = (window.URL || window.webkitURL).createObjectURL(blob); // 文件名:应用编号_comments.csv const appId = kintone.app.getId(); const fileName = appId + '_comments.csv'; const link = document.createElement('a'); link.id = 'cscDownLoad'; const e = new MouseEvent('click', {view: window, bubbles: true, cancelable: true}); link.download = fileName; link.href = url; link.dispatchEvent(e); }; // 获取记录列表 const fetchRecords = (appId, opt_offset, opt_limit, opt_records) => { const offset = opt_offset || 0; const limit = opt_limit || 100; let allRecords = opt_records || []; const params = {app: appId, query: 'order by $id asc limit ' + limit + ' offset ' + offset}; return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then((resp) => { allRecords = allRecords.concat(resp.records); if (resp.records.length === limit) { return fetchRecords(appId, offset + limit, limit, allRecords); } return allRecords; }); }; // 从记录列表获取回复信息 const getCommentCsv = (records, opt_comments, opt_i, opt_offset) => { let i = opt_i || 0; // 对记录进行计数 const comments = opt_comments || []; const offset = opt_offset || 0; const appId = kintone.app.getId(); // 应用ID const recordId = records[i].$id.value; // 记录ID const params = { 'app': appId, 'record': recordId, 'offset': offset }; // 从记录列表获取回复 return kintone.api( kintone.api.url('/k/v1/record/comments', true), 'GET', params).then((resp) => { // 生辰CSV数据 for (let j = 0; j < resp.comments.length; j++) { const row = []; const mentions_code = []; const mentions_type = []; if (resp.comments[j].mentions[0] === undefined) { resp.comments[j].mentions.code = null; } for (let k = 0; k < resp.comments[j].mentions.length; k++) { mentions_code.push(resp.comments[j].mentions[k].code); mentions_type.push(resp.comments[j].mentions[k].type); } row.push(escapeStr(recordId)); // 记录ID row.push(escapeStr(resp.comments[j].id)); // 回复ID row.push(escapeStr(resp.comments[j].text)); // 回复内容 row.push(escapeStr(resp.comments[j].createdAt)); // 回复时间 row.push(escapeStr(resp.comments[j].creator.code)); // 回复人的登录名 row.push(escapeStr(resp.comments[j].creator.name)); // 回复人的显示名称 row.push(escapeStr(mentions_code.join(','))); // @对象 row.push(escapeStr(mentions_type.join(','))); // @类型 comments.push(row); } // 判断是否参照了所有回复 if (resp.older) { return getCommentCsv(records, comments, i, offset + 10); } i += 1; // 判断是否参照了所有记录 if (records.length !== i) { return getCommentCsv(records, comments, i); } return comments; }); }; // 生成回复列表的CSV文件 const createCSVData = (records) => { getCommentCsv(records).then((comments) => { const comments_csv = []; // CSVファイルの列名 const column_row = ['记录ID', '回复ID', '回复内容', '回复时间', '回复人的登录名', '回复人的显示名称', '@对象', '@类型']; if (comments.length === 0) { alert('暂无回复'); return; } comments_csv.push(column_row); for (let i = 0; i < comments.length; i++) { comments_csv.push(comments[i]); } // 以BOM形式下载 downloadCSV(comments_csv); }); }; // 记录列表页面 kintone.events.on(['app.record.index.show'], (event) => { // 防止增生 if (document.getElementById('download-comment-csv') !== null) { return; } // 在页面头部生成按钮 const header_element = kintone.app.getHeaderMenuSpaceElement(); const csv_button = document.createElement('button'); csv_button.id = 'download-comment-csv'; csv_button.innerText = '使用CSV下载回复'; csv_button.onclick = function() { fetchRecords(kintone.app.getId()).then((records) => { if (records.length === 0) { alert('暂无记录'); return; } // 生成CSV数据 createCSVData(records); }); }; header_element.appendChild(csv_button); }); })();
※ 如已经应用到您环境中的程序,其批量获取记录时,结果会超过1万条,请对程序进行修改。
关联Tips
最后
这次使用批量获取记录的回复,给大家介绍了导出回复信息的自定义范例。
可以导入导出回复信息后,也为数据的移行和备份带来的方便。
这个Tips是在确认了2022年12月版基础上做的。