新規投稿
フォローする

CSV出力にアプリIDを追加したい

JS初心者です。

一覧からコメントのみを抽出し、CSVでダウンロードをする際に、

アプリIDも一緒にCSV出力をしたいのですが、うまくいきません。

CSVのA列に、アプリIDを追加で出力したいです。

恐らくですが、下記コードに問題があるようです。

row.push(escapeStr(kintone.app.getId();)); //アプリID

 

元となるサンプルコードは下記の通りです。

なお下記サンプルコードは問題なく、実装でき、CSVもダウンロードできています。

応用 レコード一覧画面から全レコードのコメント情報を取得する ※2016/09/21追記

(function() {
"use strict";

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

//CSVファイルをダウンロード
function downloadCSV(csv) {
var csvbuf = csv.map(function(e) {return e.join(','); }).join('\r\n');
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
var blob = new Blob([bom, csvbuf], { type: 'text/csv' });
var url = (window.URL || window.webkitURL).createObjectURL(blob);

//ファイル名:アプリ番号_comments.csv
var appId = kintone.app.getId();
var fileName = appId + '_comments.csv';

if (window.navigator.msSaveOrOpenBlob) {
// ブラウザがIEの場合
window.navigator.msSaveOrOpenBlob(blob, fileName);
} else {
// ブラウザがIE以外の場合
var link = document.createElement('a');
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
link.download = fileName;
link.href = url;
link.dispatchEvent(e);
}
}

//レコード一覧を取得する
function fetchRecords(appId, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
var 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(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, offset + limit, limit, allRecords);
}
return allRecords;
});
}

//レコード一覧からコメント情報を取得する
function getCommentCsv(records, opt_comments, opt_i, opt_offset) {

var i = opt_i || 0; //レコードのカウント
var comments = opt_comments || [];
var offset = opt_offset || 0;

var appId = kintone.app.getId(); //アプリID
var recordId = records[i]['$id']['value']; //レコードID

var params = {
'app': appId,
'record': recordId,
'offset': offset
};

//一覧画面からコメント取得
return kintone.api(
kintone.api.url('/k/v1/record/comments', true), 'GET', params).then(function(resp) {

//CSVデータの作成
for (var j = 0; j < resp.comments.length; j++) {
var row = [];
var mentions_code = [];
var mentions_type = [];

if (resp.comments[j].mentions[0] === undefined) {
resp.comments[j].mentions.code = null;
}
for (var 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(kintone.app.getId();)); //アプリID
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 = i + 1;
//レコードを全て参照したか判定
if (records.length !== i) {
return getCommentCsv(records, comments, i);
}
return comments;
});
}

//コメント一覧のCSVファイルを作成
function createCSVData(records) {
getCommentCsv(records).then(function(comments) {

var comments_csv = [];
//CSVファイルの列名
var column_row = ['アプリID', 'レコードID', 'コメントID', 'コメント内容',
'投稿日時', '投稿者ログイン名', '投稿者表示名',
'メンション宛先', 'メンションタイプ'];
if (comments.length === 0) {
alert('コメントが登録されていません');
return;
}
comments_csv.push(column_row);
for (var i = 0; i < comments.length; i++) {
comments_csv.push(comments[i]);
}
// BOM付でダウンロード
downloadCSV(comments_csv);
});
}

// レコード一覧画面
kintone.events.on(['app.record.index.show'], function(event) {
// 増殖バグを防ぐ
if (document.getElementById('download-comment-csv') !== null) {
return;
}
// ヘッダの要素にボタンを作成
var header_element = kintone.app.getHeaderMenuSpaceElement();
var csv_button = document.createElement('button');
csv_button.id = 'download-comment-csv';
csv_button.innerText = 'コメントをCSVでダウンロード';

csv_button.onclick = function() {
fetchRecords(kintone.app.getId()).then(function(records) {

if (records.length === 0) {
alert('レコードが登録されていません');
return;
}
// CSVデータを作成
createCSVData(records);

});
};
header_element.appendChild(csv_button);
});
})();

よろしくお願い致します。

0

13件のコメント

Avatar
村濱一樹
row.push(escapeStr(kintone.app.getId();)); //アプリID

ここですが、余分なセミコロンはいってませんかね

 

row.push(escapeStr(kintone.app.getId();)); //アプリID

↓に変更してみてください

row.push(escapeStr(kintone.app.getId())); //アプリID
0
Avatar
林賢太郎

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

ご指摘の通り、修正してみましたが、やはりダメです。

下記のようなエラーが出ております。

Uncaught (in promise) TypeError: value.replace is not a function
at escapeStr (download.do:7)
at download.do:84

やはり、row.pushでは、アプリIDを取得出来ないのでしょうか。

row.push(escapeStr(kintone.app.getId())); //アプリID

よろしくお願い致します。

0
Avatar
村濱一樹

あー escapeStr が不要ですね。これはフィールドに対して行われるつもりでつくられてるので

 

row.push(kintone.app.getId()); //アプリID
1
Avatar
林賢太郎

無事に実装できました!!

誠にありがとうございます。

今後とも、よろしくお願い致します。

0
Avatar
林賢太郎

追加でお願いです。

 

CVSへの出力時に、レコード作成者も対象にしたいのですが、

下記ではエラーとなります。

恐れ入りますが、ご教示頂けますよう、お願い致します。

row.push(escapeStr(record['creator'].value));          //作成者
0
Avatar
村濱一樹

row.push(escapeStr(record['作成者'].value));

 

じゃないですか?(デフォルトだとそうなってるはずです

一旦、設定見てみてください!

https://jp.cybozu.help/k/ja/user/app_settings/form/form_parts/created_by.html#form_parts_created_by_20

 

0
Avatar
村濱一樹

あ、すいません。

row.push(escapeStr(resp.comments[j].id)); //コメントID


とおなじようにやる必要がそもそもありますね。

row.push(escapeStr(resp.comments[j].作成者));  // ←フィールドコード確認していれてください
0
Avatar
林賢太郎

毎度毎度、早々なご回答ありがとうございます。

フィールドコードは、「作成者」になっていたため、ご教示頂きましたコードで試しましたが、ダメでした。

エラーにはならず、CSVは作成されますが、作成者の列はすべて空白となっており、作成者名が表示されません。

恐れ入りますが、よろしくお願い致します。

0
Avatar
村濱一樹

完全にぼくがまちがえてました

row.push(records[i]['作成者']['value'])

これでいいはずです

0
Avatar
林賢太郎

何度も申し訳ございません。

ご教示頂きましたコードでCSVをダウンロードしたところ、

作成者の列に[object Object]と出力されてしまいます。

0
Avatar
村濱一樹

周辺の箇所のソースみせてもらってもいいですか?
僕の勘違いならすいませんがら下記のようになってない気がしています
row.push(records[i]['作成者']['value'])

0
Avatar
村濱一樹

あーすいません、作成者にはユーザー情報が入るので下記のような構造になっていますね。

 

なので

row.push(records[i]['作成者']['value']['name'])

でいけますね。(nameは表示名で、codeの場合はユーザーごとに一意のものなので必要に応じて使い分けてください。

1
Avatar
林賢太郎

村濱様

完璧に実行出来ました!色々とご教示頂き、ありがとうございました。

他にも実装したいことがあり、少しずつですが、勉強していきます。

今後も、機会がございましたら、よろしくお願い致します。

 

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