LoginSignup
1
0

More than 1 year has passed since last update.

kintoneで他アプリのレコードデータをcsv化して添付ファイルフィールドに保存する

Last updated at Posted at 2021-10-03

本記事の目的

kintoneには、アプリのレコードデータをファイルに書き出してダウンロードできる標準機能があります。
kintoneヘルプ-ファイルにデータを書き出す

今回は、任意アプリのレコードデータをcsvファイルに書き出して添付ファイルフィールドに保存する、という機能をボタン1つで実行できるアプリをJavaScriptで作ってみます。

準備するもの

アプリを新規作成し、下記フィールドを追加します。
・ボタン配置用の「スペース」フィールド
・csvファイル保存先の「添付ファイル」フィールド
・ダウンロード実行日時を登録するための「日時」フィールド

またサンプルデータ用にkintoneアプリストアより「営業支援パック」を追加します。
スクリーンショット 2021-10-04 5.21.27.jpg

JavaScript記述

「JSEdit for kintone」でJavaScriptを書いていきます。
あらかじめ下記ライブラリを追加しておきましょう。
・kintoneUtility.min.js
・jQuery
・Moment.js

ボタンの設置

ダウンロード機能実行用のボタンを設置します。

    var mySpaceFieldButton = document.createElement('button');
    mySpaceFieldButton.id = 'my_space_field_button';
    mySpaceFieldButton.innerText = 'ダウンロード'; //画面に表示される文字
    kintone.app.record.getSpaceElement('my_space_field').appendChild(mySpaceFieldButton);//要素ID「my_space_field」

スクリーンショット 2021-10-04 5.19.26.jpg

データ取得

次に、データを取得します。

  // ボタン押下時のイベント
    mySpaceFieldButton.onclick = function(){
      var input_appid = 182; //取得先アプリID
      var outputfields = [
        '顧客名',
        '案件名',
        '確度',
        '受注予定日',
      ];  //出力フィールドのフィールドコード
      var filename = "download" + moment().format("YYYYMMDDHHmmss");
      var getinfo = {
        app: input_appid,
        query: '',
        fields: outputfields
      };

      kintoneUtility.rest.getAllRecordsByQuery(getinfo).then(function(resp) {
        var tmpRecords = resp.records;
        var totalCount = resp.records.length;
        console.log('tmpRecords');
        console.log(tmpRecords);

スクリーンショット 2021-10-04 5.26.41.jpg

データ整形

取得データを整形します。
フッター的なものも追加してみましょう。

var csvdata_raw = outputfields.map(function(outputfield){
          return '"' + outputfield + '"';
        }).join(',') + "\n" +
        tmpRecords.map(function(record){
          return outputfields.map(function(outputfield){
            var value = record[outputfield].value;
            return '"' + (Array.isArray(value) ? value.join(',') : value) + '"';
          }).join(',');
        }).join("\n");
        console.log('csvdata_raw');
        console.log(csvdata_raw);

      // フッター情報追加
        var user = kintone.getLoginUser();
        var row_count = (csvdata_raw.match( /\n/g) || [] ).length;
        var csvdata_footer = csvdata_raw + "\n\n"
                            + '抽出日時' + ',' + moment().format("YYYYMMDDHHmmss") + "\n"
                            + '抽出ユーザー' + ',' + user.name + "\n"
                            + '件数' + ',' + Number(totalCount);
        console.log('csvdata_footer');
        console.log(csvdata_footer);

スクリーンショット 2021-10-04 5.46.56.jpg

csv化して添付ファイルフィールドに保存

var bom  = new Uint8Array([0xEF, 0xBB, 0xBF]); //文字コード
        var blob = new Blob([bom, csvdata_footer], {type: 'text\/csv'});
        var formData = new FormData();
        var date = new Date();
        var date_today = moment(date).format('YYYYMMDD');
        var current_time = moment().format("YYYY-MM-DDTHH:mm:ssZ"); //実行日時

        formData.append('__REQUEST_TOKEN__', kintone.getRequestToken());
        formData.append('file', blob, filename + '.csv');

        var url = 'https://サブドメイン名.cybozu.com/k/v1/file.json'; //環境
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url);
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.onload = function() {
          if (xhr.status === 200) {
            // success
            console.log(JSON.parse(xhr.responseText));
          } else {
            // error
            window.alert("予期せぬエラーが発生しました。システム管理者まで問合せ下さい。");
            console.log(JSON.parse(xhr.responseText));
          }
        };
        xhr.send(formData);
        console.log(xhr.status);
        xhr.onload = function() {
          if (xhr.status === 200) {
            var key = JSON.parse(xhr.responseText).fileKey;
            console.log("ファイルキー");
            console.log(key);
            var json = {
              app: kintone.app.getId(),
              id: kintone.app.record.getId(),
              record: {
                添付ファイル: {
                  value: [{fileKey: key}]
                },
                実行日時: {
                  value: current_time
                },
              }
            };
            kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', json);
          }
        };
        setTimeout("location.reload()",1000);

スクリーンショット 2021-10-04 5.51.58.jpg

添付ファイルフィールドに保存することが出来ました。

スクリーンショット 2021-10-04 5.53.06.jpg

中身も良い感じです。

まとめ

今回は出来るだけシンプルな機能としましたが、作り込むことで機能性の向上や、データの細かい整形など色々カスタマイズすることが可能です。

参考

cybozu developer network:CSV出力をカスタマイズ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0