新規投稿
フォローする

CSV出力をカスタマイズ

kintoneの標準機能で出力したCSVファイルは、チェックボックスフィールドや複数選択フィールドの表示が特殊で、集計しにくい場合があります。 今回は、CSV出力を自作する例を紹介します。

サンプル

一覧のメニューの右側の空白部分に自作のCSV出力ボタンを実装します。 チェックボックスフィールドや複数選択フィールドの値は、カンマ区切りで出力します。

コード

本サンプルでは、encoding.jsを利用しています。 「encoding.min.js」を読み込み後、下記「sample.js」を読み込みます。

・sample.js

(function () {
  "use strict";
  kintone.events.on('app.record.index.show', function(event){
    var encoding = 'SJIS'; // https://github.com/polygonplanet/encoding.js/blob/master/README_ja.md
    var outputfields = [ //出力するフィールドのフィールドコード
      'レコード番号',
      '文字列',
      '数値',
      'チェックボックス'
    ];
    var getRecords = function(app, fields, tmpRecords){
      var limit = 500;
      var tmpRecords = tmpRecords || [];
      return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
        app: app,
        fields: fields,
        query: 'order by レコード番号 asc limit ' + limit +' offset ' + tmpRecords.length
      }).then(function(response){
        tmpRecords = tmpRecords.concat(response.records);
        return response.records.length === limit ? getRecords(app, fields, tmpRecords) : tmpRecords;
      });
    };
    var csvButton = document.createElement('a');
    csvButton.innerText = 'CSVダウンロード';
    kintone.app.getHeaderMenuSpaceElement().appendChild(csvButton);
    csvButton.addEventListener('click', function(){
      getRecords(kintone.app.getId(), outputfields).then(function(records){
        var a = document.createElement('a');
        a.href = URL.createObjectURL(new Blob([
          new Uint8Array(Encoding.convert(Encoding.stringToCode(outputfields.map(function(outputfield){
            return '"' + outputfield + '"';
          }).join(',') + "\r\n" +
          records.map(function(record){
            return outputfields.map(function(outputfield){
              var value = record[outputfield].value;
              return '"' + (Array.isArray(value) ? value.join(',') : value) + '"';
            }).join(',');
          }).join("\r\n")), encoding))
        ], {type: 'text/csv'}));
        a.download = 'data.csv';
        document.body.appendChild(a);
        a.click();
        a.parentNode.removeChild(a);
      });
    });
  });
})();
4

3件のコメント

Avatar
SHOH

江田様

こちらのスクリプトでレコード一括取得をしていると思いますが、これは何件まで取得しCSV出力できるのでしょうか。

 

0
Avatar
江田篤史

SHOHさん

お世話になっております.
返信が遅くなり申し訳ございません.

APIのoffsetの上限があるため,10000レコードが上限となります.
https://developer.cybozu.io/hc/ja/articles/202331474#step2

10000レコードを超える場合は,カーソルAPIを利用したコードに変更するとよいかと思います.
https://developer.cybozu.io/hc/ja/articles/360029152012

0
Avatar
SHOH

江田様

10000レコード取得できれば問題ないのですが、それ以上取得する要件が出てきましたら、カーソルAPIを利用したコードに変更してみたいと思います。

ご返答ありがとうございました。

1
サインインしてコメントを残してください。