サブテーブルの内容をCSVでダウンロードしたい

レコード一覧をCSVでタウンロードする方法は多く紹介されているのですが、

レコード内にリンクを作成し、サブテーブル内容をCSV保管する方法で参考になるものがあまりなく困っております。

 

いろいろものを参考にし、継ぎ接ぎしてみたのですが、リンクの表示、

CSVへの値の代入まではデバッガで確認が出来ました。

ただ、CSVのダウンロードが出来ずに困っております。(ダウンロードウィンドウが出ません。)

なにかヒントを頂けないでしょうか。

↓レコードではなく、レコード内のサブテーブルの内容をエクスポートしたいです。

 

jQuery.noConflict();
(function($) {
"use strict";

// 一覧ビューの表示イベント
kintone.events.on('app.record.detail.show', function(event) {
// メニュ右側の空白部分にボタンを設置

var $link = $('#download-csv');
$link = $('<a id="download-csv" href="#">CSVでダウンロード</a>');

var elem = document.createElement("a");
elem.href = "#";
elem.id = "download-csv";
var str = document.createTextNode("CSVでダウンロード");
elem.appendChild(str);

kintone.app.record.getHeaderMenuSpaceElement().appendChild(elem);

// エスケープ
var escapeStr = function(value) {
return '"' + (value? value.replace(/"/g, '""'): '') + '"';
};

if ((window.URL || window.webkitURL).createObjectURL === null) {
// サポートされていないブラウザ
return;
}

// CSVデータを作成
var csv = [];
var row = ['ID','column1','column2','column3','column4'];
csv.push(row);

var tableRecords = event.record['商談履歴'].value;
for (var j = 0; j < tableRecords.length; j++) {
row = [];
row.push(escapeStr(tableRecords[j].value['対応状況'].value));
row.push(escapeStr(tableRecords[j].value['課題'].value));
row.push(escapeStr(tableRecords[j].value['対象'].value));
row.push(escapeStr(tableRecords[j].value['現状'].value));
row.push(escapeStr(tableRecords[j].value['ToDo'].value));
csv.push(row);
}

// BOM付でダウンロード
var csvbuf = csv.map(function(e){return e.join(',')}).join('\r');

var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
var blob = new Blob([bom, csvbuf], { type: 'text/csv' });

var url = (window.URL || window.webkitURL).createObjectURL(blob);

var fileName = "download.csv";
if (window.navigator.msSaveOrOpenBlob) {
// for IE
$link.unbind();
$link.click(function() {
var retVal = window.navigator.msSaveOrOpenBlob(blob, fileName);
});
} else {
$link.attr('download', fileName);
$link.attr('href', url);
}
});
})(jQuery);

 

大西 範知さん

こんにちは。

以下のページの (おまけ)ダウンロードしたファイルをローカルに保存する の項目が参考になるかと思います。

作成したCSVをリンクに貼り付けてそのリンクをクリックするというものです。

https://cybozudev.zendesk.com/hc/ja/articles/200814380

ご回答ありがとうございます。

すこし変更してみましたが、やはりリンクやダウンロードウィンドウが出ずでした。

csvbuf、blobUrlには値がセットされているのですが、フィールドにリンクを表示する際には

特殊な方法を取らなければならないのでしょうか・・・。

 

jQuery.noConflict();
(function($) {
"use strict";

// 一覧ビューの表示イベント
kintone.events.on('app.record.detail.show', function(event) {

// エスケープ
var escapeStr = function(value) {
return '"' + (value? value.replace(/"/g, '""'): '') + '"';
};

if ((window.URL || window.webkitURL).createObjectURL === null) {
// サポートされていないブラウザ
return;
}

// CSVデータを作成
var csv = [];
var row = ['ID','column1','column2','column3','column4'];
csv.push(row);

var tableRecords = event.record['商談履歴'].value;
for (var j = 0; j < tableRecords.length; j++) {
row = [];
row.push(escapeStr(tableRecords[j].value['対応状況'].value));
row.push(escapeStr(tableRecords[j].value['課題'].value));
row.push(escapeStr(tableRecords[j].value['対象'].value));
row.push(escapeStr(tableRecords[j].value['現状'].value));
row.push(escapeStr(tableRecords[j].value['ToDo'].value));
csv.push(row);
}

// BOM付でダウンロード
var csvbuf = csv.map(function(e){return e.join(',')}).join('\r');
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
var blob = new Blob([bom, csvbuf], { type: 'text/csv' });
var url = window.URL || window.webkitURL;

//BlobURLの取得
var blobUrl = url.createObjectURL(blob);

//リンクを作成し、そこにBlobオブジェクトを設定する
var alink = document.createElement("a");
var linkFileName = "ダウンロードファイル.txt";
alink.innerHTML = 'ダウンロード';

//マウスイベントを設定
var e = document.createEvent("MouseEvents");
e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

//aタグのクリックイベントをDispatch起動
alink.dispatchEvent(e);

});
})(jQuery);

大西 範知さん

こちらでいかがでしょうか?

 

jQuery.noConflict();
(function($) {
 "use strict";

 // 一覧ビューの表示イベント
 kintone.events.on('app.record.detail.show', function(event) {

  // エスケープ
  var escapeStr = function(value) {
   return '"' + (value ? value.replace(/"/g, '""') : '') + '"';
  };

  if ((window.URL || window.webkitURL).createObjectURL === null) {
   // サポートされていないブラウザ
   return;
  }

  // CSVデータを作成
  var csv = [];
  var row = ['ID', 'column1', 'column2', 'column3', 'column4'];
  csv.push(row);

  var tableRecords = event.record['商談履歴'].value;
  for (var j = 0; j < tableRecords.length; j++) {
   row = [];
   row.push(escapeStr(tableRecords[j].value['対応状況'].value));
   row.push(escapeStr(tableRecords[j].value['課題'].value));
   row.push(escapeStr(tableRecords[j].value['対象'].value));
   row.push(escapeStr(tableRecords[j].value['現状'].value));
   row.push(escapeStr(tableRecords[j].value['ToDo'].value));
   csv.push(row);
  }

  // BOM付でダウンロード
  var csvbuf = csv.map(function(e) {
   return e.join(',')
  }).join('\r');
  var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
  var blob = new Blob([bom, csvbuf], {
   type: 'text/csv'
  });
  var url = window.URL || window.webkitURL;

  //BlobURLの取得
  var blobUrl = url.createObjectURL(blob);

  //リンクを作成し、そこにBlobオブジェクトを設定する
  var alink = document.createElement("a");
  var linkFileName = "ダウンロードファイル.txt";
  alink.href = blobUrl;
  alink.innerHTML = 'ダウンロード';
  
  //マウスイベントを設定
  var e = document.createEvent("MouseEvents");
  e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  
  //aタグのクリックイベントをDispatch起動
  alink.dispatchEvent(e);

 });
})(jQuery);

ありがとうございます。

 

ただ頂いた方法ですと、どうしてもリンクが表示されず。

以下の方法であればリンクが表示されました。

kintone.app.record.getHeaderMenuSpaceElement().innerHTML = '<a id="download-csv" href="#" download="download.csv">CSVでダウンロード</a>';

 

リンクは表示されてコンテンツも落ちてくるのですが、

CSVデータではなく、表示されているページのHTMLがダウンロードされるので、

blobのデータがうまくダウンロードに対して渡っていないのでは、と調べています。

 

大西 範知さん

 

おっしゃるように、サンプル自体はリンクを表示させないで自動でファイルをDLする仕組みとなっていました。

リンクを表示させる場合はBlobを以下のようにaタグに設定してみてください。

  // BOM付でダウンロード
  var csvbuf = csv.map(function(e) {
   return e.join(',')
  }).join('\r');
  var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
  var blob = new Blob([bom, csvbuf], {
   type: 'text/csv'
  });
  var url = window.URL || window.webkitURL;

   //BlobURLの取得
  var blobUrl = url.createObjectURL(blob);

   //リンクを作成し、そこにBlobオブジェクトを設定する
  var alink = document.createElement("a");
  var linkFileName = "ダウンロードファイル.txt";
  alink.href = blobUrl;
  alink.id = 'download-csv';
  alink.download = 'download.csv';
  alink.textContent = 'CSVでダウンロード';
// メニュースペースにリンクを表示
  kintone.app.record.getHeaderMenuSpaceElement().appendChild(alink);

ありがとうございます。

やっと意図する仕組みが完成しました。

少し見直し、フォームで「csv_download」というスペースを作成しておき、

そこに「CSVをダウンロード」というリンクを表示するようにしてみました。

 

jQuery.noConflict();
(function($) {
"use strict";

// 一覧ビューの表示イベント
kintone.events.on('app.record.detail.show', function(event) {

// エスケープ
var escapeStr = function(value) {
return '"' + (value? value.replace(/"/g, '""'): '') + '"';
};

if ((window.URL || window.webkitURL).createObjectURL === null) {
// サポートされていないブラウザ
return;
}

// CSVデータを作成
var csv = [];
var row = ['対応状況','課題','対象システム','現状','ToDo'];
csv.push(row);

var tableRecords = event.record['商談履歴'].value;
for (var j = 0; j < tableRecords.length; j++) {
row = [];
row.push(escapeStr(tableRecords[j].value['対応状況'].value));
row.push(escapeStr(tableRecords[j].value['課題'].value));
row.push(escapeStr(tableRecords[j].value['対象'].value));
row.push(escapeStr(tableRecords[j].value['現状'].value));
row.push(escapeStr(tableRecords[j].value['ToDo'].value));
csv.push(row);
}

  // BOM付でダウンロード
  var csvbuf = csv.map(function(e) {
   return e.join(',')
  }).join('\r');
  var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
  var blob = new Blob([bom, csvbuf], {
   type: 'text/csv'
  });
  var url = window.URL || window.webkitURL;

   //BlobURLの取得
  var blobUrl = url.createObjectURL(blob);

   //リンクを作成し、そこにBlobオブジェクトを設定する
  var alink = document.createElement("a");
  var linkFileName = "ダウンロードファイル.txt";
  alink.href = blobUrl;
  alink.id = 'download-csv';
  alink.download = 'download.csv';
  alink.textContent = 'CSVでダウンロード';
kintone.app.record.getSpaceElement('csv_download').appendChild(alink);
});
})(jQuery);