The CreatorCon Call for Content is officially open! Get started here.

Attachment Help!!

SandeepKSingh
Kilo Sage

How to Send attachment over E-Boding in ServiceNow.. I tried the below code but not working

 

 

 

var SendIncidentWithAttachments = Class.create();
SendIncidentWithAttachments.prototype = {
initialize: function() {},

sendIncident: function(incidentSysId) {
var inc = new GlideRecord('incident');
inc.get(incidentSysId);


var rest = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Incident');
rest.setHeader('ContentType', 'application/json'); 

var body = {
short_description: inc.short_description,
description: inc.description,
caller_id: inc.caller_id,
category: inc.category
};
rest.setStringParameterNoEscape('payload', body); 
var response = rest.execute();
var result = response.getBody();

var targetSysId = result.sys_id; 
this.sendAttachments(incidentSysId, targetSysId); 
},

sendAttachments: function(srcSysId, destSysId) {
var attGR = new GlideRecord('sys_attachment');
attGR.addQuery('table_sys_id', srcSysId);
attGR.query();

while (attGR.next()) {
var attach = new GlideSysAttachment();
var data = attach.getContentBase64(attGR); 
var fileName = attGR.file_name;

var upload = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Attachment');
upload.setRequestHeader("Content-Type", "application/json"); 
upload.setRequestBody(data); 

upload.execute(); 
}
},

type: 'SendIncidentWithAttachments'
};

3 ACCEPTED SOLUTIONS

Nilesh Pol
Tera Guru
Tera Guru

@SandeepKSingh Your script sent the Base64 data directly using upload.setRequestBody(data). A standard REST API expects a structured JSON object, not just a raw string, especially when you need to provide metadata like the file name and the target record ID. and the script used result.sys_id, which is incorrect. The result of rest.execute() is a JSON string, and you need to parse it into an object to access its properties. The specific property holding the new record's sys_id depends on how the target's Scripted REST API is configured, but a common format is result.result.sys_id.

 

You can take reference of bellow script:

var SendIncidentWithAttachments = Class.create();
SendIncidentWithAttachments.prototype = {
    initialize: function() {},

    sendIncident: function(incidentSysId) {
        var inc = new GlideRecord('incident');
        if (inc.get(incidentSysId)) {
            // Use the REST message defined in the REST Message form
            var rest = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Incident');
            rest.setHeader('Content-Type', 'application/json');

            // Set the payload with stringified JSON
            var body = {
                short_description: inc.short_description,
                description: inc.description,
                caller_id: inc.caller_id,
                category: inc.category
            };
            rest.setRequestBody(JSON.stringify(body));

            var response = rest.execute();
            var result = response.getBody();

            // The target API must return the sys_id of the new record.
            // You need to parse the response to get the sys_id.
            var responseBody = JSON.parse(result);
            var targetSysId = responseBody.result.sys_id;

            if (targetSysId) {
                this.sendAttachments(incidentSysId, targetSysId);
            } else {
                gs.error('Could not get target sys_id from REST response: ' + result);
            }
        }
    },

    sendAttachments: function(srcSysId, destSysId) {
        var attGR = new GlideRecord('sys_attachment');
        attGR.addQuery('table_sys_id', srcSysId);
        attGR.query();

        while (attGR.next()) {
            var attach = new GlideSysAttachment();
            var binData = attach.getBytes(attGR);
            var base64Data = GlideStringUtil.base64Encode(binData);
            var fileName = attGR.file_name;
            var contentType = attGR.content_type;

            // Use the REST message defined in the REST Message form
            var upload = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Attachment');
            upload.setRequestHeader("Content-Type", "application/json");

            // Construct the JSON payload with necessary metadata
            var uploadBody = {
                'table_name': 'incident', // Target table name
                'table_sys_id': destSysId, // Sys_id of the target record
                'file_name': fileName,
                'content_type': contentType,
                'payload': base64Data
            };

            // Set the request body with the stringified JSON payload
            upload.setRequestBody(JSON.stringify(uploadBody));
            upload.execute();
        }
    },

    type: 'SendIncidentWithAttachments'
};

View solution in original post

Ravi Gaurav
Giga Sage
Giga Sage

Hi @SandeepKSingh 

This is the exact video  you are looking for:

Check my video it wil help

 

https://www.youtube.com/watch?v=MQmBx8Rp4u8&t=5s&pp=ygUVYXR0YWNobWVudCBzZXJ2aWNlbm93

--------------------------------------------------------------------------------------------------------------------------


If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!

Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI

 YouTube: https://www.youtube.com/@learnservicenowwithravi
 LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/

View solution in original post

Hi Youtube Family, I am Ravi Gaurav. I am Expert in ServiceNow . Welcome to my youtube channel. If you guys enjoyed it, make sure to Like👍 , Comment💬 and Subscribe❤️ _________________________________________ Copyright Disclaimer : All Rights to VideoLabel Co. & No Copyright infringement intende...

Ravi Gaurav
Giga Sage
Giga Sage

Between Your script can be tweaked here below : Try the below out from my youtube video:

sendIncident: function(incidentSysId) {
var inc = new GlideRecord('incident');
if (!inc.get(incidentSysId)) {
gs.error('Incident not found');
return;
}

// Step 1: Send the main Incident details to target instance
var rest = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Incident');
rest.setRequestHeader('Content-Type', 'application/json');

var payload = {
short_description: inc.short_description + '',
description: inc.description + '',
caller_id: inc.caller_id.getDisplayValue() + '',
category: inc.category + ''
};

rest.setRequestBody(JSON.stringify(payload));
var response = rest.execute();
var responseBody = response.getBody();
var result = new global.JSON().decode(responseBody);

var targetSysId = result.result.sys_id;
gs.info('Incident created on target with sys_id: ' + targetSysId);

// Step 2: Send all attachments from source incident
this._sendAttachments(inc.sys_id, targetSysId);

return targetSysId;
},

_sendAttachments: function(sourceSysId, targetSysId) {
var att = new GlideRecord('sys_attachment');
att.addQuery('table_sys_id', sourceSysId);
att.query();

while (att.next()) {
var gsa = new GlideSysAttachment();
var bytes = gsa.getBytes(att);
var fileName = att.file_name + '';

// Prepare REST call for file upload
var upload = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Attachment');
upload.setRequestHeader("Content-Type", "application/octet-stream");
upload.setRequestHeader("Accept", "application/json");
upload.setRequestHeader("X-ATTACHMENT-NAME", fileName);
upload.setRequestHeader("X-TABLE-NAME", "incident");
upload.setRequestHeader("X-TABLE-SYS-ID", targetSysId);
upload.setRequestBody(bytes);

var resp = upload.execute();
gs.info('Attachment sent: ' + fileName + ' -> ' + resp.getStatusCode());
}
},

--------------------------------------------------------------------------------------------------------------------------


If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!

Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI

 YouTube: https://www.youtube.com/@learnservicenowwithravi
 LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/

View solution in original post

3 REPLIES 3

Nilesh Pol
Tera Guru
Tera Guru

@SandeepKSingh Your script sent the Base64 data directly using upload.setRequestBody(data). A standard REST API expects a structured JSON object, not just a raw string, especially when you need to provide metadata like the file name and the target record ID. and the script used result.sys_id, which is incorrect. The result of rest.execute() is a JSON string, and you need to parse it into an object to access its properties. The specific property holding the new record's sys_id depends on how the target's Scripted REST API is configured, but a common format is result.result.sys_id.

 

You can take reference of bellow script:

var SendIncidentWithAttachments = Class.create();
SendIncidentWithAttachments.prototype = {
    initialize: function() {},

    sendIncident: function(incidentSysId) {
        var inc = new GlideRecord('incident');
        if (inc.get(incidentSysId)) {
            // Use the REST message defined in the REST Message form
            var rest = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Incident');
            rest.setHeader('Content-Type', 'application/json');

            // Set the payload with stringified JSON
            var body = {
                short_description: inc.short_description,
                description: inc.description,
                caller_id: inc.caller_id,
                category: inc.category
            };
            rest.setRequestBody(JSON.stringify(body));

            var response = rest.execute();
            var result = response.getBody();

            // The target API must return the sys_id of the new record.
            // You need to parse the response to get the sys_id.
            var responseBody = JSON.parse(result);
            var targetSysId = responseBody.result.sys_id;

            if (targetSysId) {
                this.sendAttachments(incidentSysId, targetSysId);
            } else {
                gs.error('Could not get target sys_id from REST response: ' + result);
            }
        }
    },

    sendAttachments: function(srcSysId, destSysId) {
        var attGR = new GlideRecord('sys_attachment');
        attGR.addQuery('table_sys_id', srcSysId);
        attGR.query();

        while (attGR.next()) {
            var attach = new GlideSysAttachment();
            var binData = attach.getBytes(attGR);
            var base64Data = GlideStringUtil.base64Encode(binData);
            var fileName = attGR.file_name;
            var contentType = attGR.content_type;

            // Use the REST message defined in the REST Message form
            var upload = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Attachment');
            upload.setRequestHeader("Content-Type", "application/json");

            // Construct the JSON payload with necessary metadata
            var uploadBody = {
                'table_name': 'incident', // Target table name
                'table_sys_id': destSysId, // Sys_id of the target record
                'file_name': fileName,
                'content_type': contentType,
                'payload': base64Data
            };

            // Set the request body with the stringified JSON payload
            upload.setRequestBody(JSON.stringify(uploadBody));
            upload.execute();
        }
    },

    type: 'SendIncidentWithAttachments'
};

Ravi Gaurav
Giga Sage
Giga Sage

Hi @SandeepKSingh 

This is the exact video  you are looking for:

Check my video it wil help

 

https://www.youtube.com/watch?v=MQmBx8Rp4u8&t=5s&pp=ygUVYXR0YWNobWVudCBzZXJ2aWNlbm93

--------------------------------------------------------------------------------------------------------------------------


If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!

Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI

 YouTube: https://www.youtube.com/@learnservicenowwithravi
 LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/
Hi Youtube Family, I am Ravi Gaurav. I am Expert in ServiceNow . Welcome to my youtube channel. If you guys enjoyed it, make sure to Like👍 , Comment💬 and Subscribe❤️ _________________________________________ Copyright Disclaimer : All Rights to VideoLabel Co. & No Copyright infringement intende...

Ravi Gaurav
Giga Sage
Giga Sage

Between Your script can be tweaked here below : Try the below out from my youtube video:

sendIncident: function(incidentSysId) {
var inc = new GlideRecord('incident');
if (!inc.get(incidentSysId)) {
gs.error('Incident not found');
return;
}

// Step 1: Send the main Incident details to target instance
var rest = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Incident');
rest.setRequestHeader('Content-Type', 'application/json');

var payload = {
short_description: inc.short_description + '',
description: inc.description + '',
caller_id: inc.caller_id.getDisplayValue() + '',
category: inc.category + ''
};

rest.setRequestBody(JSON.stringify(payload));
var response = rest.execute();
var responseBody = response.getBody();
var result = new global.JSON().decode(responseBody);

var targetSysId = result.result.sys_id;
gs.info('Incident created on target with sys_id: ' + targetSysId);

// Step 2: Send all attachments from source incident
this._sendAttachments(inc.sys_id, targetSysId);

return targetSysId;
},

_sendAttachments: function(sourceSysId, targetSysId) {
var att = new GlideRecord('sys_attachment');
att.addQuery('table_sys_id', sourceSysId);
att.query();

while (att.next()) {
var gsa = new GlideSysAttachment();
var bytes = gsa.getBytes(att);
var fileName = att.file_name + '';

// Prepare REST call for file upload
var upload = new sn_ws.RESTMessageV2('Target ServiceNow', 'POST Attachment');
upload.setRequestHeader("Content-Type", "application/octet-stream");
upload.setRequestHeader("Accept", "application/json");
upload.setRequestHeader("X-ATTACHMENT-NAME", fileName);
upload.setRequestHeader("X-TABLE-NAME", "incident");
upload.setRequestHeader("X-TABLE-SYS-ID", targetSysId);
upload.setRequestBody(bytes);

var resp = upload.execute();
gs.info('Attachment sent: ' + fileName + ' -> ' + resp.getStatusCode());
}
},

--------------------------------------------------------------------------------------------------------------------------


If you found my response helpful, I would greatly appreciate it if you could mark it as "Accepted Solution" and "Helpful."
Your support not only benefits the community but also encourages me to continue assisting. Thank you so much!

Thanks and Regards
Ravi Gaurav | ServiceNow MVP 2025,2024 | ServiceNow Practice Lead | Solution Architect
CGI
M.Tech in Data Science & AI

 YouTube: https://www.youtube.com/@learnservicenowwithravi
 LinkedIn: https://www.linkedin.com/in/ravi-gaurav-a67542aa/