サブテーブルのユーザIDをCSV出力したいのですが。

【実現したいこと】

サブテーブル内の「ユーザ選択」を参照し、ユーザIDのCSV出力を行いたいです。

 

【エラー情報】

標準で使用可能な「ファイルに書き出す」のCSV出力ですと

同テーブル内のサブテーブルをまとめて出力してしまう為、スクリプトでの出力を行いたいと考えております。

 

【利用したソースコード】

https://developer.cybozu.io/hc/ja/articles/203605844-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92CSV%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95 

https://developer.cybozu.io/hc/ja/community/posts/360051550031-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89CSV%E5%87%BA%E5%8A%9B%E6%99%82%E3%81%AB%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E5%87%BA%E5%8A%9B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 

※CSVの部分のみ抜粋

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

//csvファイルの作成
function getMakeCsv() {
//現在のレコード情報を取得
csv += ['顧客', 'プロジェクト名', 'プロジェクト番号', 'URL', '日付', '対応者名', '対応時間', ''];
for (var i = 0; i < records.length; i++) {
customer = records[i]["customer"]["value"];
project = records[i]["project"]["value"];
project_number = records[i]["project_number"]["value"];
url = records[i]["url"]["value"];
sample_table = records[i]["sample_table"]["value"];

if (sample_table.length !== 0) {
for (var j = 0; j < sample_table.length; j++) {
sample = sample_table[j]["value"]["sample"]["value"];
DAY = sample_table[j]["value"]["DAY"]["value"];
user_name = sample_table[j]["value"]["user_name"]["value"];

//会社名をキーに該当関連レコードを取得
query = 'customer = \"' + customer + '\"';

//同じ会社名のレコードを取得
resp[i] = request(app_id, query);
if (resp[i].records.length !== 0) {
for (var n = 0; n < resp[i].records.length; n++) {
csv += customer + ',' + project + ',' + project_number + ',' + url + ',' + DAY + ',' + user_name + ',' + sample + '';
}
} else {
csv += customer + ',' + ',' + ',' + url + ',' + DAY + ',' + user_name + ',' + sample + '';
}
}
} else {
csv += customer + ',' + url + ',' + ',' + ',' + '';
}
}
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

【試したこと】

上記の記事を参考にCSV出力のスクリプトを作成しており、

CSVに出力したい項目は画像のテーブル内の3つでして、

そのうちの「日付」と「対応時間」はCSV出力に成功したのですが、

「ユーザ選択」だけ「[object Object]」と表記されてしまいます。

他の記事もいくつか参考にし修正を試みましたが、

まだまだ理解が及んでおらず、解決に至らなかった為

ご教授いただけますと幸いです。

【補足】

ユーザ選択には作業を対応したユーザ名が入力されますが、出力したいのは

ユーザID(ゲストユーザだとE-mail)になります。

※標準で備わっている「ファイルに書き出す」と同様、

各ユーザのメールアドレスを出力したいです。

 

以上、よろしくお願いいたします。 

スガワショウタ さん

こんにちは。

>「ユーザ選択」だけ「[object Object]」と表記されてしまいます。

ユーザー選択フィールドのフィールド形式は下記になるので、

"<フィールドコード>": {
    "type": "USER_SELECT",
    "value": [
        {
            "code": "sato",
            "name": "Noboru Sato"
        },
        {
            "code": "kato",
            "name": "Misaki Kato"
        }
    ]
}

ユーザIDを取得する場合は、valueにあるcodeまで指定する必要があると思います。

sample_table[j]["value"]["user_name"]["value"].code;

wenxit1218

ご回答及びご解説いただきありがとうございます!

ただ、上記に従い修正を行ったのですが画像にある通り全ユーザーが「undefined」と表記されてしまいました。

こちらの原因につきましてご教授いただけないでしょうか?

重ね重ねの質問で申し訳ございませんがよろしくお願いいたします。

スガワショウタ 様

失礼しました。ユーザー選択は複数選択ができるので、
「対応者」が複数が存在する場合はループ処理で、
一人のみという場合も、[“user_name”].valueの配列に[0]を指定する必要がありましたm(_ _)m

sample\_table[j]["value"]["user\_name"].value[0].code;

wenxit1218

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

上記コードに置き換えを行ったところ「Uncaught TypeError: Cannot read property ‘code’ of undefined」のエラーが発生致しました。

下記にコード全文を記載致しますので、他に誤っている箇所がございましたらご指摘いただければ幸いです。

お忙しいところ大変恐れ入りますが宜しくお願いいたします。

(function() {
'use strict';

var CSVButtonEl;
kintone.events.on('app.record.index.show', function (event) {

//変数の定義
var records = event.records;
var customer, sample_table, sample, project, project_number, url, DAY, user_name = "";

//function requestで使う変数
var resp = [];
var query = "";
var app_id = '19'

//csvの配列
var csv = [];

//ボタンの有無をチェック
if (!CSVButtonEl) {
setBtn();
CSVButtonEl.addEventListener('click', toClick);
}

//ボタンエレメントの生成
function setBtn() {
var spaceEl = kintone.app.getHeaderMenuSpaceElement();
var text = document.createTextNode('CSV出力');
var btnClassName = 'sample-class2';
CSVButtonEl = document.createElement('button');
CSVButtonEl.appendChild(text);
CSVButtonEl.className = btnClassName;
spaceEl.appendChild(CSVButtonEl);
}

//クリックした際の処理
function toClick() {
getMakeCsv();
downloadFile(csv);
}

//csvファイルの作成
function getMakeCsv() {
//現在のレコード情報を取得
csv += ['顧客', 'プロジェクト名', 'プロジェクト番号', 'URL', '日付', '対応者名', '対応時間', ''];
for (var i = 0; i < records.length; i++) {
customer = records[i]["customer"]["value"];
project = records[i]["project"]["value"];
project_number = records[i]["project_number"]["value"];
url = records[i]["url"]["value"];
sample_table = records[i]["sample_table"]["value"];

if (sample_table.length !== 0) {
for (var j = 0; j < sample_table.length; j++) {
sample = sample_table[j]["value"]["sample"]["value"];
DAY = sample_table[j]["value"]["DAY"]["value"];
user_name = sample_table[j]["value"]["user_name"].value[0].code;

//会社名をキーに該当関連レコードを取得
query = 'customer = \"' + customer + '\"';

//同じ会社名のレコードを取得
resp[i] = request(app_id, query);
if (resp[i].records.length !== 0) {
for (var n = 0; n < resp[i].records.length; n++) {
csv += customer + ',' + project + ',' + project_number + ',' + url + ',' + DAY + ',' + user_name + ',' + sample + '';
}
} else {
csv += customer + ',' + ',' + ',' + url + ',' + DAY + ',' + user_name + ',' + sample + '';
}
}
} else {
csv += customer + ',' + url + ',' + ',' + ',' + '';
}
}
}

//関連レコードを取得するxmlHttpリクエスト
function request(app_id, query) {
var appUrl = kintone.api.url('/k/v1/records') + '?app=' + app_id + '&query=' + query;

//xmlHttpリクエスト
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xmlHttp.send(null);

//取得したレコードをArrayに格納
var respdata = JSON.parse(xmlHttp.responseText);

//レスポンスデータを戻り値として返す
return respdata;
}

//ダウンロード関数
function downloadFile(csv) {
//ファイル名
var filename = 'DM発送リスト_' + getTimeStamp() + '.csv';

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

if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(blob, filename);
} else {
var url = (window.URL || window.webkitURL);
var blobUrl = url.createObjectURL(blob);
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
var a = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
a.href = blobUrl;
a.download = filename;
a.dispatchEvent(e);
}
}

//ファイル名に付与する日付の取得
function getTimeStamp() {
var d = new Date();
var YYYY = d.getFullYear();
var MM = (d.getMonth() + 1);
var DD = d.getDate();
var hh = d.getHours();
var mm = d.getMinutes();
if (MM < 10) { MM = '0' + MM; }
if (DD < 10) { DD = '0' + DD; }
if (hh < 10) { hh = '0' + hh; }
else if (mm < 10) { mm = '0' + mm; }
String();
return '' + YYYY + MM + DD + hh + mm;
}
});
})();

スガワショウタ さん

コードを共有して頂きありがとうございます。
記載していただいたコードで試したところ、
ユーザー選択の値の出力はできました。

共有していただいたエラーからの推測で恐縮ですが、
「対応者名」のユーザー選択フィールドに、
値が入っていないレコードがあるのが原因なのでは?と思いました。

その場合、
もし「対応者名」は必ず値があるなら
→ユーザー選択を必須項目にする

「対応者名」に値がない状況も存在するなら
→ユーザー選択の値の存在を判別する処理も追加する

などの調整をしたほうが良いかもしれません。

wenxit1218

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

ご指摘の通り、ユーザ選択フィールドに値が入っていないレコードがあった為、

全てに記入したところ、ユーザIDの取得に成功いたしました!

本番環境では必ず値が入る為、必須項目の設定をするようにいたします。

 

この度はご丁寧に説明いただき、誠にありがとうございました。

大変勉強になりました。