関連レコードCSV出力時にテーブルデータ出力について

お世話になっております。

下記「関連レコードのデータをCSV出力する方法」のTipsをもとに運用したいのですが、テーブルデータが出力対象外のようです。

https://developer.cybozu.io/hc/ja/articles/203605844?page=1#comment_360003653711

56行目に「var mail = customerRecord.sample_table.value;」という行を追加してもCSVには[object]というデータが出力されるだけでした。

テーブルのデータも出力するにはどこをどう書き換えれば良いかどなたかご教示いただけないでしょうか?

取得先アプリのテーブルにデータが入っているということですよね?

でしたら68行目あたりを変更をしなければならないと思います。

relatedRecords.forEach(function(relatedRecord) {
Table = relatedRecord.テーブルのフィールドコード.value;

Table.forEach(function(Tabledata) {
row.push(Tabledata.product.value);
row.push(Tabledata.subtotal.value);
});
});

relatedRecordは1レコードのデータですので、更にその中のテーブルデータを取得するには

テーブルデータをもう一度forEachで回して取得しなければなりません。

 

Ryokke様

コメントありがとうございます!そして説明不足で失礼しました。

テーブルは取得先アプリにあるのではなく、このJavascriptを書いているアプリです。

 

●アプリAのフィールドコード

company(会社名)、division(部署名)、assignee(担当者名)、TEL(TEL)、Mail(メールアドレス)、reference(関連レコード一覧)

ここに「sample_table」を追加します。

●アプリB(関連レコードの取得先アプリ)のフィールドコード

compnay(会社名)、product(製品名)、subtotal(小計)

 

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

hiroTさん

company(会社名)、division(部署名)、assignee(担当者名)、TEL(TEL)、Mail(メールアドレス)

これらのフィールドはsample_table内のフィールドでしょうか?

それともsample_table外のフィールドでしょうか?

 

Ryokke様

company(会社名)、division(部署名)、assignee(担当者名)、TEL(TEL)、Mail(メールアドレス)についてはテーブル外のフィールドです。sample_tableのみテーブルフィールドで、テーブル内のフィールドはsampleのみです。

何度もお手間をおかけしますがよろしくお願いいたします。

samppleもCSVに含みたいということですね。

以下のJSでどうでしょうか?

(function() {
    'use strict';

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

        //変数の定義
        var records = event.records;
        var company, division, assignee, TEL, Mail, product, subtotal, sample_table, sample = "";    

        //function requestで使う変数
        var resp = [];
        var query = "";
        var app_id = '取得先のアプリID'

        //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 += ['会社名', '部署名', '担当者名', 'TEL', 'メールアドレス', '製品名', '小計', 'サンプル', ''];
            for (var i = 0; i < records.length; i++) {
                company = records[i]["company"]["value"];
                division = records[i]["division"]["value"];
                assignee = records[i]["assignee"]["value"];
                TEL = records[i]["TEL"]["value"];
                Mail = records[i]["Mail"]["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"];

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

                        //同じ会社名のレコードを取得
                        resp[i] = request(app_id, query);
                        if (resp[i].records.length !== 0) {
                            for (var n = 0; n < resp[i].records.length; n++) {
                                product = resp[i].records[n]['product']['value'];
                                subtotal = resp[i].records[n]['subtotal']['value'];
                                csv += division + ',' + assignee + ',' + TEL + ',' + Mail + ',' + product + ',' + subtotal + ',' + sample + '';
                            }
                        } else {
                            csv += division + ',' + assignee + ',' + TEL + ',' + Mail + ',' + ',' + ',' + sample + '';
                        }
                    }
                } else {
                    csv += division + ',' + assignee + ',' + TEL + ',' + Mail + ',' + ',' + ',' + '';
                }
            }
        }

        //関連レコードを取得する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;
        }
    });

})();

Ryokke様

一から教えていただいてありがとうございました!教えていただいたJavascriptでやってみます。

Ryokke様

コードを教えていただきありがとうございました!おかげさまで無事、動きました!

ちなみに、今回は1つのアプリの関連レコードを取得しましたが、2つのアプリから関連レコードを取得することは可能なのでしょうか?

hitoTさん

無事動いたようで良かったです(^^)/

リクエストを2回行えば、他のアプリからもデータを取得することは可能です!

Ryokke様

そうなんですね!何から何までありがとうございます!