URL利用してファイルをダウンロードする際に、ヘッダの上書きは可能でしょうか?

Fagi
Tera Contributor

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

以下の画像のコードを参考にCSVファイルのダウンロードをしたいと考えているのですが、以下の点についてご教授頂けると幸いです。

 

・Export Importモジュールの設定(カラムネームで出力する設定)は変更せずにCSVファイルのヘッダを日本語ラベル名で出力するためにコード上でヘッダの上書きをしたいのですが可能でしょうか?

 

どんな些細な事でもいいので、お力添え頂けると幸いです。

宜しくお願い致します。

スクリーンショット 2022-10-07 105519.png

1 ACCEPTED SOLUTION

iwai
Giga Sage

参考にScriptを作成してみました。日本語ラベル名を取得するためにGlideAjaxを使ったので、GlideAjax使うならXMLHttpRequestを呼び出すのは無駄な処理になってます。 自分では作れないカスタマイズはやらない方が良いです。Script自体が推奨しない方法の場合もありますし、不具合対応や改良ができなくなるためです。Communityで有効な情報が得られない場合もあります。

function onTestClientCSV() {
	// 日本語取得
    var ga = new GlideAjax('testAjaxJPTableLabel');
    ga.addParam('sysparm_name', 'get');
    ga.addParam('sysparm_table', 'incident');
    ga.getXMLAnswer(job2);

    function job2(tableLabel) {
        var tableLabelObj = JSON.parse(tableLabel);
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open('GET', '/incident_list.do?sysparm_query=&CSV', true);
        xmlhttp.setRequestHeader("X-UserToken", g_ck);
        xmlhttp.setRequestHeader("Accept", "application/json");
        xmlhttp.setRequestHeader("Content-Type", "application/json");
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                var csvData = '' + xmlhttp.responseText;
                var header = '';
                csvData = csvData.replace(/[^\r\n]*/, function(match) {
                    header = match;
                    return '';
                });
                var no = 0;
				// 日本語に置き換え
                header = header.replace(/\w+/g, function(match) {
                    no = tableLabelObj.name.indexOf(match);
                    if (no >= 0) {
                        return tableLabelObj.label[no];
                    }
                    return match;
                });
                var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
                var blob = new Blob([bom, header + csvData], {
                    type: 'text/csv'
                });
                var document = g_list.getContainer().ownerDocument;
                var window = g_list.getContainer().ownerDocument.defaultView;
                var url = (window.URL || window.webkitURL).createObjectURL(blob);
                var link = document.createElement('a');
                link.download = 'incident.csv';
                link.href = url;
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        };
        xmlhttp.send();
    }
}

 Script include

var testAjaxJPTableLabel = Class.create();
testAjaxJPTableLabel.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    get: function() {
        var table = this.getParameter("sysparm_table");
        var gr = new GlideRecord(table);
        gr.initialize();
        var fields = gr.getFields();
        var nameData = [];
        var labelData = [];

        var user = gs.getUser();
        var lang = user.getPreference("user.language");
        user.setPreference("user.language", 'ja');

        for (var i = 0; i < fields.size(); i++) {
            var glideElement = fields.get(i);
            nameData.push('' + glideElement.getName());
            labelData.push('' + glideElement.getLabel());
        }
        user.setPreference("user.language", lang);
        return JSON.stringify({name:nameData,label:labelData});
    },
    type: 'testAjaxJPTableLabel'
});

 

View solution in original post

1 REPLY 1

iwai
Giga Sage

参考にScriptを作成してみました。日本語ラベル名を取得するためにGlideAjaxを使ったので、GlideAjax使うならXMLHttpRequestを呼び出すのは無駄な処理になってます。 自分では作れないカスタマイズはやらない方が良いです。Script自体が推奨しない方法の場合もありますし、不具合対応や改良ができなくなるためです。Communityで有効な情報が得られない場合もあります。

function onTestClientCSV() {
	// 日本語取得
    var ga = new GlideAjax('testAjaxJPTableLabel');
    ga.addParam('sysparm_name', 'get');
    ga.addParam('sysparm_table', 'incident');
    ga.getXMLAnswer(job2);

    function job2(tableLabel) {
        var tableLabelObj = JSON.parse(tableLabel);
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open('GET', '/incident_list.do?sysparm_query=&CSV', true);
        xmlhttp.setRequestHeader("X-UserToken", g_ck);
        xmlhttp.setRequestHeader("Accept", "application/json");
        xmlhttp.setRequestHeader("Content-Type", "application/json");
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                var csvData = '' + xmlhttp.responseText;
                var header = '';
                csvData = csvData.replace(/[^\r\n]*/, function(match) {
                    header = match;
                    return '';
                });
                var no = 0;
				// 日本語に置き換え
                header = header.replace(/\w+/g, function(match) {
                    no = tableLabelObj.name.indexOf(match);
                    if (no >= 0) {
                        return tableLabelObj.label[no];
                    }
                    return match;
                });
                var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
                var blob = new Blob([bom, header + csvData], {
                    type: 'text/csv'
                });
                var document = g_list.getContainer().ownerDocument;
                var window = g_list.getContainer().ownerDocument.defaultView;
                var url = (window.URL || window.webkitURL).createObjectURL(blob);
                var link = document.createElement('a');
                link.download = 'incident.csv';
                link.href = url;
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        };
        xmlhttp.send();
    }
}

 Script include

var testAjaxJPTableLabel = Class.create();
testAjaxJPTableLabel.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    get: function() {
        var table = this.getParameter("sysparm_table");
        var gr = new GlideRecord(table);
        gr.initialize();
        var fields = gr.getFields();
        var nameData = [];
        var labelData = [];

        var user = gs.getUser();
        var lang = user.getPreference("user.language");
        user.setPreference("user.language", 'ja');

        for (var i = 0; i < fields.size(); i++) {
            var glideElement = fields.get(i);
            nameData.push('' + glideElement.getName());
            labelData.push('' + glideElement.getLabel());
        }
        user.setPreference("user.language", lang);
        return JSON.stringify({name:nameData,label:labelData});
    },
    type: 'testAjaxJPTableLabel'
});