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

**URL:** <https://community.cybozu.dev/t/topic/4398>\
**Category:** kintone 開発相談\
**Created:** [2019 年 9 月 24 日午前 1:18 UTC](https://community.cybozu.dev/t/topic/4398 "2019-09-24T01:18:41Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 24 日午前 1:18 UTC](https://community.cybozu.dev/t/topic/4398/1 "2019-09-24T01:18:41Z")

</div>

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

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

[https://developer.cybozu.io/hc/ja/articles/203605844?page=1#comment\_360003653711](https://community.cybozu.dev/hc/ja/articles/203605844?page=1#comment_360003653711)

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1130](https://avatars.discourse-cdn.com/v4/letter/l/f04885/32.png) [@Legacy\_Account1130](https://community.cybozu.dev/u/Legacy_Account1130)\
**Post date:** [2019 年 9 月 24 日午前 2:53 UTC](https://community.cybozu.dev/t/topic/4398/2 "2019-09-24T02:53:59Z")

</div>

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

でしたら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で回して取得しなければなりません。

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 24 日午前 3:33 UTC](https://community.cybozu.dev/t/topic/4398/3 "2019-09-24T03:33:33Z")

</div>

Ryokke様

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

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

&nbsp;

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

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

ここに「sample\_table」を追加します。

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

compnay（会社名）、product（製品名）、subtotal（小計）

&nbsp;

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1130](https://avatars.discourse-cdn.com/v4/letter/l/f04885/32.png) [@Legacy\_Account1130](https://community.cybozu.dev/u/Legacy_Account1130)\
**Post date:** [2019 年 9 月 24 日午前 4:43 UTC](https://community.cybozu.dev/t/topic/4398/4 "2019-09-24T04:43:14Z")

</div>

hiroTさん

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

これらのフィールドはsample\_table内のフィールドでしょうか？

それともsample\_table外のフィールドでしょうか？

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 24 日午前 5:02 UTC](https://community.cybozu.dev/t/topic/4398/5 "2019-09-24T05:02:40Z")

</div>

Ryokke様

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1130](https://avatars.discourse-cdn.com/v4/letter/l/f04885/32.png) [@Legacy\_Account1130](https://community.cybozu.dev/u/Legacy_Account1130)\
**Post date:** [2019 年 9 月 24 日午前 5:53 UTC](https://community.cybozu.dev/t/topic/4398/6 "2019-09-24T05:53:18Z")

</div>

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;
        }
    });

})();

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 24 日午前 6:50 UTC](https://community.cybozu.dev/t/topic/4398/7 "2019-09-24T06:50:02Z")

</div>

Ryokke様

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 25 日午前 1:21 UTC](https://community.cybozu.dev/t/topic/4398/8 "2019-09-25T01:21:01Z")

</div>

Ryokke様

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1130](https://avatars.discourse-cdn.com/v4/letter/l/f04885/32.png) [@Legacy\_Account1130](https://community.cybozu.dev/u/Legacy_Account1130)\
**Post date:** [2019 年 9 月 25 日午前 4:21 UTC](https://community.cybozu.dev/t/topic/4398/9 "2019-09-25T04:21:20Z")

</div>

hitoTさん

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

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

---

<div class="post-metadata">

**Author:** ![Legacy\_Account](https://avatars.discourse-cdn.com/v4/letter/l/ba8739/32.png) [@Legacy\_Account](https://community.cybozu.dev/u/Legacy_Account)\
**Post date:** [2019 年 9 月 25 日午前 5:42 UTC](https://community.cybozu.dev/t/topic/4398/10 "2019-09-25T05:42:01Z")

</div>

Ryokke様

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2025 年 8 月 19 日午前 12:28 UTC](https://community.cybozu.dev/t/topic/4398/11 "2025-08-19T00:28:56Z")

</div>

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。
