CSV下载记录的回复信息的方法

cybozu发表于:2017年02月23日 11:42:38更新于:2023年09月22日 16:36:12

开发者中心包含此范例的模板(回复记录CSV下载),请前往开发者中心下载学习。

概要

这次的范例,我们将使用 批量获取记录的回复 的API,以CSV形式下载记录的回复信息。
大家不妨在自己的环境里尝试看看。

完成的样子

CSV输出用的按钮设置和输出对象的回复列表。

00158b917b0e3c85a0a399a5334ef33

输出后的CSV文件范例

00158b917b3ae5b62e5345e1fc5eb67

自定义

我们将通过以下的三个步骤进行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;
  });
};

参考:使用Promise来获取应用所有数据的高技能!

②格式变更

接下来将获取到的回复数据变换成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输出用的按钮的设置和输出对象的回复列表

00158b919219a97339f3ddf15932f99

CSV输出范例

00158b9192ca34bd87e87cee09c8922

范例代码

(() => {
  '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万条,请对程序进行修改。

详情请参考存在offset限制值的前提下批量获取记录

关联Tips

如何将汇总后的数据下载到CSV文件?

最后

这次使用批量获取记录的回复,给大家介绍了导出回复信息的自定义范例。
可以导入导出回复信息后,也为数据的移行和备份带来的方便。

这个Tips是在确认了2022年12月版基础上做的。