1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
/*
* download record comments as CSV sample program
* Copyright (c) 2016 Cybozu
*
* Licensed under the MIT License
* https://opensource.org/license/mit/
*/
(() => {
'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);
});
})();
|