Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Send attachment from incident table from one instance to other instance

Neethi2
Tera Expert

I want to send the attachment from one instance to another instance, but it is not working

 

End point:https://instance_name.service-now.com/api/now/table/ecc_queue

Payload:{
"source":"staging_table:${snow_source}",
"name":"${snow_fileName}",
"agent":"${snow_agent}",
"topic":"${snow_topic}",
"payload":"${snow_payload}"
}

Business rule:

(function executeRule(current, previous /*null when async*/) {
var gr = new GlideRecord('sys_attachment');
    gr.addQuery('table_sys_id', current.sys_id);
    gr.query();

    while (gr.next()) {
        var fileName = gr.getValue('file_name');
        var contentType = gr.getValue('content_type');
       
        var attachmentSysId = gr.getUniqueValue();
        var attachmentBytes = GlideSysAttachment.getBytes(attachmentSysId);

        // Encode attachment data to Base64
        var StringUtil = new GlideStringUtil();
        var base64EncodedData = StringUtil.base64Encode(attachmentBytes);
       
    var r = new sn_ws.RESTMessageV2('EDOH','Create_Attachment');
r.setStringParameter('snow_agent', 'AttachmentCreator');
 r.setStringParameter('snow_source', current.u_tracking_id);
 r.setStringParameter('snow_topic', 'AttachmentCreator');
  r.setStringParameter('snow_payload',base64EncodedData);
    r.setStringParameter('snow_filename',fileName);
    r.setRequestHeader('Content-Type',contentType);
   
    var response = r.execute();
    var responseBody =response.getBody();
    gs.log("Not working"+responseBody);
    var prsData=JSON.parse(responseBody);
   
   
    var httpStatus= response.getStatusCode();
    gs.log("Attachment Code "+httpStatus);
   
    }

})(current, previous);
 
Note:When i attach the attachment, nothing is happening. Please help to fix this issue
2 ACCEPTED SOLUTIONS

@Neethi2 

update as this, no need to use GlideRecord again on sys_attachment as you can directly pick the current object

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
try {
    var binData = attachments.getBytes(current);
    var encData = StringUtil.base64Encode(binData);
    var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
    s.setStringParameter('snow_source', current.table_sys_id);
    s.setStringParameter('snow_payload', encData);
    s.setStringParameter('snow_topic', 'AttachmentCreator');
    s.setStringParameter('snow_agent', 'AttachmentCreator');
    s.setStringParameter('snow_fileName', current.file_name + ':' + current.content_type);
    var response2 = s.execute();
    var responseBody2 = response2.getBody();
    gs.log("Create Attachment" + responseBody2);
    var status = response2.getStatusCode();
    gs.log("Create Attachment" + status);

} catch (ex) {
    var message1 = ex.getMessage();
}

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

View solution in original post

Neethi2
Tera Expert

Hi Ankur,

Thanks for your help. 

Finally with sys_attachment after insert with below code is working fine as expected,

Condition:current.table_name == 'incident'

 

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('incident');
gR.addEncodedQuery('sys_id='+current.table_sys_id);
gR.query();
if(gR.next()){
try {
var binData =   attachments.getBytes(current);
var encData =   StringUtil.base64Encode(binData);
var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
s.setStringParameter('snow_source',current.table_sys_id);
s.setStringParameter('snow_payload', encData);
s.setStringParameter('snow_topic', 'AttachmentCreator');
s.setStringParameter('snow_agent', 'AttachmentCreator');
s.setStringParameter('snow_fileName', current.file_name+':'+current.content_type);
var response2 = s.execute();
var responseBody2 = response2.getBody();
gs.log("Create Attachment" + responseBody2);
var status = response2.getStatusCode();
gs.log("Create Attachment" +status);

}


catch(ex) {


var message1 = ex.getMessage();


}


}

View solution in original post

8 REPLIES 8

Hi Ankur,

 

Now, duplicates files are not getting attached .when i attached the first doc ex:test.doc, it got attached on other end as test.doc but when i attached the second document as ex:book1.xlsx, again instead of book1.xlsx,test.doc is getting attached. That is the only one issue we have right now. Please help to fix that

 

Wrote business rule on sys_attachment after insert

 

Below code:

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('sys_attachment');
gR.addEncodedQuery('table_name=incident^table_sys_id='+current.table_sys_id);
gR.query();
if(gR.next()){
try {
var binData =   attachments.getBytes(gR);
var encData =   StringUtil.base64Encode(binData);
var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
s.setStringParameter('snow_source',current.table_sys_id);
s.setStringParameter('snow_payload', encData);
s.setStringParameter('snow_topic', 'AttachmentCreator');
s.setStringParameter('snow_agent', 'AttachmentCreator');
s.setStringParameter('snow_fileName', gR.file_name+':'+gR.content_type);
var response2 = s.execute();
var responseBody2 = response2.getBody();
gs.log("Create Attachment" + responseBody2);
var status = response2.getStatusCode();
gs.log("Create Attachment" +status);

}


catch(ex) {


var message1 = ex.getMessage();


}


}

@Neethi2 

update as this, no need to use GlideRecord again on sys_attachment as you can directly pick the current object

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
try {
    var binData = attachments.getBytes(current);
    var encData = StringUtil.base64Encode(binData);
    var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
    s.setStringParameter('snow_source', current.table_sys_id);
    s.setStringParameter('snow_payload', encData);
    s.setStringParameter('snow_topic', 'AttachmentCreator');
    s.setStringParameter('snow_agent', 'AttachmentCreator');
    s.setStringParameter('snow_fileName', current.file_name + ':' + current.content_type);
    var response2 = s.execute();
    var responseBody2 = response2.getBody();
    gs.log("Create Attachment" + responseBody2);
    var status = response2.getStatusCode();
    gs.log("Create Attachment" + status);

} catch (ex) {
    var message1 = ex.getMessage();
}

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Neethi2
Tera Expert

Hi Ankur,

Thanks for your help. 

Finally with sys_attachment after insert with below code is working fine as expected,

Condition:current.table_name == 'incident'

 

var StringUtil = new GlideStringUtil();
var attachments = new GlideSysAttachment();
var fileName, contentType;
var gR = new GlideRecord('incident');
gR.addEncodedQuery('sys_id='+current.table_sys_id);
gR.query();
if(gR.next()){
try {
var binData =   attachments.getBytes(current);
var encData =   StringUtil.base64Encode(binData);
var s = new sn_ws.RESTMessageV2('EDOH', 'Create_Attachment');
s.setStringParameter('snow_source',current.table_sys_id);
s.setStringParameter('snow_payload', encData);
s.setStringParameter('snow_topic', 'AttachmentCreator');
s.setStringParameter('snow_agent', 'AttachmentCreator');
s.setStringParameter('snow_fileName', current.file_name+':'+current.content_type);
var response2 = s.execute();
var responseBody2 = response2.getBody();
gs.log("Create Attachment" + responseBody2);
var status = response2.getStatusCode();
gs.log("Create Attachment" +status);

}


catch(ex) {


var message1 = ex.getMessage();


}


}