SQLで一覧取得したレコードをCSV出力したい

いつもお世話になっております。

sqlで一覧出力したレコードをCSVに出力したいのですが、どのようにしたらいいでしょうか。

イメージとしては下記の「※alasqlで一覧出力するソース」で取得したレコードを下記「※CSV出力コード」で設置したボタンクリックでCSV出力したいと考えています。

「※CSV出力コード」でクエリ等で条件を指定すればいいのだと思いますが、どのように書けばいいのかわかりません。また、レコードも1000件以上あるため、CSV出力時には条件で絞り込まれたレコード全件出力できるようにしたいのです。

どなたかご教示いただけますと幸いです。

 

※alasqlで一覧出力するソース

////////////////////////////////////////////////////////////////////////////
// kintone JavaScript: Summary of kintone records by alasql.
//  2017.02.14 by rex0220
////////////////////////////////////////////////////////////////////////////
(function() {
    "use strict";

    // 一覧表示
    kintone.events.on("app.record.index.show", function(event) {
        if (event.viewId !== ******* ) return event;

        var obj = {};
        var custApp = 45;
        var soshikiApp = 50;

        // 経費情報取得
        fetchRecords(custApp, '', ['契約No2','経費コード']).then(function(records) {
            obj.rs1 = convertToRows(records);
            console.log('rs1', JSON.stringify(obj.rs1));

            // 契約情報取得
            return fetchRecords(event.appId, '', ['ID','契約法人名', '物件名','契約No','リースアップ','契約法人','支払日','リース会社名','リース料_全体','税込リース料_全体','支払備考','締結日','リース開始日','リース満了日','税率','再リース一括']);
            
        }).then(function(records) {
            obj.rs2 = convertToRows(records);
            console.log('rs2', JSON.stringify(obj.rs2));

            // 部署情報取得
            return fetchRecords(soshikiApp, '', ['新コード']);
            
        }).then(function(records) {
            obj.rs3 = convertToRows(records);
            console.log('rs3', JSON.stringify(obj.rs3));

            // 経費情報と契約情報をjoin

            var result1 = 
                alasql(
                'SELECT orders.[ID], orders.[契約法人名], orders.[物件名], orders.[契約No],orders.[リース料_全体],orders.[税込リース料_全体],orders.[リース会社名],orders.[リースアップ],cust.[契約No2] \
                FROM ? AS orders INNER JOIN ? AS cust ON orders.[契約No] = cust.[契約No2] INNER JOIN ? AS soshiki ON cust.[経費コード] = soshiki.[新コード] where length(orders.[リースアップ])=0 AND length(orders.[リース会社名])>0 ORDER BY orders.[契約法人名], orders.[契約No]', [obj.rs2, obj.rs1, obj.rs3]);
  
            console.log('result3', JSON.stringify(result1));
            console.log(result1);

            // grid 表示
            var grid = document.getElementById('リース費用明細');
            new Handsontable(grid, { 
                data: result1, 
                colWidths: [80, 250, 200,200,120,150,200,100],
                colHeaders: ['ID','契約法人名','物件名','契約No','リース料_全体','税込リース料_全体','リース会社名','リースアップ'], 
                columns: [
                    { data: 'ID' },
                    { data: '契約法人名' },
                    { data: '物件名' },
                    { data: '契約No' },
                    { data: 'リース料_全体' },
                    { data: '税込リース料_全体' },
                    { data: 'リース会社名' },
                    { data: 'リースアップ' },
                ],
                readOnly: true 
            });

        });
        

        return event;
    });


    // get records
    function fetchRecords(appId, opt_query, opt_fields, opt_offset, opt_limit, opt_records) {
        var query = opt_query || '';
        var offset = opt_offset || 0;
        var limit = opt_limit || 500;
        var allRecords = opt_records || [];
        var params = {app: appId, query: query + ' limit ' + limit + ' offset ' + offset };
        if (opt_fields) params.fields = opt_fields;
        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, query, opt_fields, offset + limit, limit, allRecords);
            }
            return allRecords;
        });
    }



    // records convert to table rows 
    function convertToRows(records) {
        var rows = records.map(function(record){
            var keys = Object.keys(record);
            var row = {};
            keys.map(function(key){
                row[key] = record[key].type === 'NUMBER' ? Number(record[key].value) : record[key].value;
            });
            return row;
        });
        return rows;
    }
 
})();

 

※CSV出力コード

(()=>{
    'use strict'

    //レコード一覧表示
    kintone.events.on(['app.record.index.show'], event => {

        //メニュー右側を取得
        const sp =kintone.app.getHeaderMenuSpaceElement();

        //ボタンを作る
        const btn = document.createElement('button');
        //ボタンに表示したいテキスト
        btn.textContent='CSV出力ボタン';

        //スペースフィールドにボタンを追加する
        sp.appendChild(btn);

        //ボタンをクリックしたときの動作
        btn.onclick=()=>{
            //CSVダウンロード
            dlCsv();
        }
        return event;

    });


    // CSVファイル生成用
    const HEADER =['ID'];//CSVに出力したいフィールドのフィールドコード

    // CSVをダウンロード
    const dlCsv = async ()=>{
        //フィールド名からCSVの文字列データを作る
        const setHeaderData = () => {
            let headerData = '';
            HEADER.forEach(h => {
                headerData += h + ',';
            });
            headerData += '\r';
            return headerData;
        };  

        //レコードからCSVの文字列データを作る
        const recordToCsvData = records => {
            let rowData = '';
            records.forEach(r => {
                HEADER.forEach(h => {
                    rowData += r[h].value + ',';
                });
                rowData += '\r';
            });
            return rowData;
        }; 

        //URLエンコード
        const createDataUriFromString = str => {
            // 文字列を配列に変換
            const array = str.split('').map(s => s.charCodeAt());
            // エンコード
            const sjis_array = Encoding.convert(array, 'SJIS', 'UNICODE');
            const uInt8List = new Uint8Array(sjis_array);
            return uInt8List;
        };  
        
        //2. CSVにしたいレコードを取得する
        const param_get = {
            app:kintone.app.getId(),
            //query:'出力フラグ != 1', // 絞り込みたいときはクエリを書く"出力フラグ = 0" など
        };
        const obj_get = await kintone.api('/k/v1/records','GET',param_get);
        const targetRecords =obj_get.records;

        //3. レコード1件以上だったらCSV出力
        if (targetRecords.length > 0) {

            //4. CSVにするテキストデータを作成
            const str = createDataUriFromString( setHeaderData() + recordToCsvData(targetRecords));

            //5. CSVファイル作成
            const blob = new Blob([str], {type:"text\/csv"});
            const url = URL.createObjectURL(blob);
        
            //6. ダウンロード処理
            const a = document.createElement("a");
            document.body.appendChild(a);
            a.download = "test.csv";//ここすきなファイル名に
            a.href = url;
            a.click();
            a.remove();
            URL.revokeObjectURL(url);

            // // 出力フラグをONにするようなコードはこのへんに
            // let param_records = [~,~, ~,~];
            // const param_upd = {
            //     app:kintone.app.getId(),
            //     records:param_records,
            // };
            // const obj_put = await kintone.api('/k/v1/records','PUT',param_upd);
        }
    }
})();