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.

How to populate attachment on catalog form

Rahul86
Tera Contributor

Hi everyone,

I'm working on a catalog item in ServiceNow and I've created a variable of the Attachment type. I'd like to automatically populate this attachment with a file from a previously selected record . For example, after selecting a record, other related variables populate automatically using a Script Include, which works fine. However, I'm struggling to do the same for the attachment.

Could anyone advise on what I might be missing in my Script Include or suggest another approach to auto-populate the attachment?

Script Include:


fetchAttachment: function() {
var landscapeSysId = this.getParameter('sysparm_landscape_sys_id');
var attachmentSysId = "";
var grAttachment = new GlideRecord('sys_attachment');
grAttachment.addQuery('table_name', 'x_abc');
grAttachment.addQuery('table_sys_id', landscapeSysId);
grAttachment.query();

if (grAttachment.next()) {
attachmentSysId = grAttachment.sys_id.toString(); // Assuming you want the sys_id of the found attachment
}
if (attachmentSysId) {
var attachment = new GlideSysAttachment().get(attachmentSysId);
return attachment;
} else {
return null; // Handle case where no attachment is found
}

Thanks in advance!

1 ACCEPTED SOLUTION

AMan1997
Tera Guru

Hi @Rahul86 

 

I faced a similar requirement in my project. Here is the corrected version of the Script Include that auto-populates the attachment field:

fetchAttachment: function() {
        var SysId = this.getParameter('<sys_id of record>');
        var attachmentSysId = "";
        var grAttachment = new GlideRecord('sys_attachment');
        grAttachment.addQuery('table_name', '<table_name');
        grAttachment.addQuery('table_sys_id', SysId);
        grAttachment.query();
        if (grAttachment.next()) {
            attachmentSysId = grAttachment.sys_id.toString();
        }
        return attachmentSysId;
    }

 As you can see, it's not necessary to return the attachment itself to your client script. Instead, you can simply return the sys_id of the attachment and set it in your variable, like I did below:

//Client Script

/* GlideAjax call to send sys_id of record
*/
/*Retrieve the sys_id of attachment
*/
function populateAttachment(response) {
    var answer = response.responseXML.documentElement.getAttribute("answer");
    g_form.setValue('<attachment field name>',answer);
}

This should help you achieve the desired functionality.

View solution in original post

3 REPLIES 3

AMan1997
Tera Guru

Hi @Rahul86 

 

I faced a similar requirement in my project. Here is the corrected version of the Script Include that auto-populates the attachment field:

fetchAttachment: function() {
        var SysId = this.getParameter('<sys_id of record>');
        var attachmentSysId = "";
        var grAttachment = new GlideRecord('sys_attachment');
        grAttachment.addQuery('table_name', '<table_name');
        grAttachment.addQuery('table_sys_id', SysId);
        grAttachment.query();
        if (grAttachment.next()) {
            attachmentSysId = grAttachment.sys_id.toString();
        }
        return attachmentSysId;
    }

 As you can see, it's not necessary to return the attachment itself to your client script. Instead, you can simply return the sys_id of the attachment and set it in your variable, like I did below:

//Client Script

/* GlideAjax call to send sys_id of record
*/
/*Retrieve the sys_id of attachment
*/
function populateAttachment(response) {
    var answer = response.responseXML.documentElement.getAttribute("answer");
    g_form.setValue('<attachment field name>',answer);
}

This should help you achieve the desired functionality.

Rahul86
Tera Contributor

Thanks @AMan1997 !! , Now its working as expected.

If my response helped, please mark the answer helpful/correct based on impact!

Thanks,