We're reclaiming inactive PDIs to keep them available for active builders. Learn what's changing, who's affected, and how to protect your work. Read More

how to get excel sheet data in mrvs

Vinod S Patil
Tera Contributor

Hello Everyone

I have requirement to add excel sheets data in catalog item's mrvs
I have two sheets in one excel file add and delete.

add sheet has following details in screenshot add


ADDADD

 

 

 
 

delete sheet has following details in screenshot delete
delete.png

 

 




I created script inlcude and onchange client script for it. 
I am getting only first sheet data in mrvs and in second (delete) sheet values are not getting mrvs.

BElow is my script include Please suggest me

getExcelData: function() {
    var arrObj = [];
    var file_id = this.getParameter('sysparam_attSysId');

    var gsa = new GlideSysAttachment();
    var sheetParser = new sn_impex.GlideExcelParser();

    var stream = gsa.getContentStream(file_id);
    sheetParser.parse(stream);

    var sheetNames = sheetParser.getSheetNames();

    for (var i = 0; i < sheetNames.length; i++) {
        var sheetNameRaw = sheetNames[i];
        var sheetName = sheetNameRaw.trim().toLowerCase();
        var action = '';

        if (sheetName === 'add') {
            action = 'add';
        } else if (sheetName === 'delete') {
            action = 'delete';
        } else if (sheetName === 'rename') {
            action = 'rename';
        }

        if (!action) continue;

        // New parser for each sheet
        var streamNew = gsa.getContentStream(file_id);
        var parser = new sn_impex.GlideExcelParser();
        parser.parse(streamNew);
        parser.setSheetName(sheetNameRaw);
        parser.seek(0);

        while (parser.next()) {
            var row = parser.getRow();
            if (!row) continue;

            // Normalize keys
            var normalizedRow = {};
            for (var key in row) {
                if (row.hasOwnProperty(key)) {
                    normalizedRow[key.toLowerCase().trim()] = row[key];
                }
            }

            // Skip empty rows
            var allEmpty = true;
            for (var k in normalizedRow) {
                if (normalizedRow[k]) {
                    allEmpty = false;
                    break;
                }
            }
            if (allEmpty) continue;

            var obj = {};
            obj.action_request = action;

            if (action === 'add' || action === 'delete') {
                obj.device_type = normalizedRow['device type'] || '';
                obj.device_name = normalizedRow['device name'] || '';
                obj.serial_number = normalizedRow['serial number'] || '';
                obj.fqdn_hostname = normalizedRow['fqdn'] || '';
                obj.vlan_network_switch_and_port_info = normalizedRow['address'] || '';
                obj.altas_app = normalizedRow['atlas'] || '';
                obj.ip_type = normalizedRow['ip type'] || '';
            }

            arrObj.push(obj);
        }
    }

    return JSON.stringify(arrObj);
},





@Ankur Bawiskar 

 
1 REPLY 1

NagaChandaE
Mega Sage

Hi @Vinod S Patil ,

Try this script 

getExcelData: function() {
    var arrObj = [];
    var file_id = this.getParameter('sysparam_attSysId');
    var gsa = new GlideSysAttachment();

    var sheetNames = this._getSheetNames(file_id, gsa);  // Extract once

    for (var i = 0; i < sheetNames.length; i++) {
        var sheetNameRaw = sheetNames[i];
        var sheetName = sheetNameRaw.trim().toLowerCase();
        var action = '';

        if (sheetName === 'add') action = 'add';
        else if (sheetName === 'delete') action = 'delete';
        else if (sheetName === 'rename') action = 'rename';

        if (!action) continue;

        // Fresh parse for THIS sheet only
        var arrSheet = this._parseSheet(file_id, gsa, sheetNameRaw, i);
        arrObj = arrObj.concat(arrSheet);
    }

    return JSON.stringify(arrObj);
},

_getSheetNames: function(file_id, gsa) {
    var stream = gsa.getContentStream(file_id);
    if (!stream) return [];
    
    var parser = new sn_impex.GlideExcelParser();
    parser.parse(stream);
    return parser.getSheetNames() || [];
},

_parseSheet: function(file_id, gsa, sheetNameRaw, sheetIndex) {
    var arrSheet = [];
    var stream = gsa.getContentStream(file_id);  // Fresh stream every time
    if (!stream) return arrSheet;

    var parser = new sn_impex.GlideExcelParser();
    
    // Method 1: setSheetName BEFORE parse (preferred)
    parser.setSheetName(sheetNameRaw);
    // Backup: setSheetNumber
    parser.setSheetNumber(sheetIndex);
    
    parser.setNullToEmpty(true);  // Handle empties better
    
    if (!parser.parse(stream)) {
        gs.error('Parse failed for sheet: ' + sheetNameRaw);
        return arrSheet;
    }

   

    while (parser.next()) {
        var row = parser.getRow();
        if (!row) continue;

        // Your normalize + skip empty logic (unchanged)
        var normalizedRow = {};
        for (var key in row) {
            if (row.hasOwnProperty(key)) {
                normalizedRow[key.toLowerCase().trim()] = row[key];
            }
        }

        var allEmpty = true;
        for (var k in normalizedRow) {
            if (normalizedRow[k]) {
                allEmpty = false;
                break;
            }
        }
        if (allEmpty) continue;

        var obj = { action_request: action };  // 'action' from outer scope

        if (action === 'add' || action === 'delete') {
            obj.device_type = normalizedRow['device type'] || '';
            obj.device_name = normalizedRow['device name'] || '';
            obj.serial_number = normalizedRow['serial number'] || '';
            obj.fqdn_hostname = normalizedRow['fqdn'] || '';
            obj.vlan_network_switch_and_port_info = normalizedRow['address'] || '';
            obj.altas_app = normalizedRow['atlas'] || '';
            obj.ip_type = normalizedRow['ip type'] || '';
        }

        arrSheet.push(obj);
    }

    
    return arrSheet;
}