ダウンロード機能の実装
にメンテナンス済み
突然ですが、みなさんが kintone を使う上で「これは使いづらいな」と感じる機能はありますか?
僕が kintone 上でアプリを開発する上で最もよく聞いた意見が、
「ダウンロード(CSV 出力)が使いづらい」
でした。
アプリを管理している方はダウンロード画面と似た UI を他の機能でも見かけるため、なんとなくわかるかと思いますが、ほとんどの方は 1 ヵ月に 1 度あるかないかぐらいだと思います。(本来はダウンロード自体しなくていいように業務フローを改善するべきかもしれませんが…)
なので今回は、煩雑なダウンロード機能を解決するため、独自で簡単にダウンロード機能を実装する方法をご紹介します。
ソースコード
今回の実装の中心となるコードです。
const downloadAsCsv = (name, records) => {
const keys = Object.keys(records[0]);
const data = [keys, ...records.map((record) => keys.map((key) => record[key].value))];
return download(name, data);
};
const download = (name, array) => {
const bom = new Uint8Array([0xef, 0xbb, 0xbf]);
const blob = new Blob([bom, array], { type: 'text/csv' });
const url = (window.URL || window.webkitURL).createObjectURL(blob);
const link = document.createElement('a');
link.download = name + '.csv';
link.href = url;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
return true;
};
実装例
画面表示時にダウンロード
あまり使う機会はないかもしれませんが、最もシンプルな実装です。
kintone.events.on('app.record.index.show', (event) => {
downloadAsCsv('test.csv', event.records);
return event;
});
ダウンロードボタンを設置
アプリのヘッダーにボタンを設置し、クリックされた際に処理を実行します。
kintone.events.on(['app.record.index.show', 'mobile.app.record.index.show'], (event) => {
const app = kintone.app || kintone.mobile.app;
const headerMenuSpace = app.getHeaderMenuSpaceElement() || app.getHeaderSpaceElement();
const button = document.createElement('button');
button.textContent = 'csv';
headerMenuSpace.append(button);
button.onclick = (clicked) => {
downloadAsCsv('test.csv', event.records);
};
return event;
});
#kintone
#JavaScript