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.

Copy currently inserted attachment

Petr Pastuszek1
Tera Contributor

Hello Team

When attachment is added to sc task we need to copy it to ritm.

but only currently inserted file/files,not those inserted yesterday and so on

 

any advice on script in BR on attachment table.

1 ACCEPTED SOLUTION

Hello @Petr Pastuszek1 ,

Please try with the modified code below,

(function executeRule(current, previous /*null when async*/) {

    // Get the current task record
    var grTask = new GlideRecord('sc_task');
    if (grTask.get(current.table_sys_id)) {

        // Create a new sys_attachment record
        var grAttachment = new GlideRecord('sys_attachment');
        grAttachment.initialize();

        // Set values for the new attachment record
        grAttachment.setValue('file_name', current.file_name);
        grAttachment.setValue('content_type', current.content_type);
        grAttachment.setValue('size_bytes', current.size_bytes);
        grAttachment.setValue('table_name', 'sc_req_item');
        grAttachment.setValue('table_sys_id', grTask.request_item);

        // Insert the new attachment record
        var newAttachmentSysId = grAttachment.insert();

        // Copy the content stream from the original attachment to the new attachment
        var gsa = new GlideSysAttachment();
        gsa.writeContentStream(
            grAttachment,
            current.file_name,
            current.content_type,
            gsa.getContentStream(current.sys_id)
        );
        
        // Optionally, log the new attachment sys_id for debugging
        gs.info('New Attachment Sys ID: ' + newAttachmentSysId);
    }

})(current, previous);

View solution in original post

12 REPLIES 12

Hello and thank you,

tested code and problem is that it control data created on today.

If I insert attachment 'A' now and 'B' 1 min later, end result is that RITM will have these attachments: A + B + B and this is not wanted.

is there really no way to copy only those which are currently inserted (current object) without need to query table?

 

/Petr

This code which I have done is working well, could you confirm it is ok technically?

var grTask = new GlideRecord('sc_task');
	grTask.get(current.table_sys_id);


	var grAttachment = new GlideRecord('sys_attachment');
		grAttachment.initialize();

		grAttachment.setValue('file_name',current.file_name);
		grAttachment.setValue('content_type',current.content_type);
		grAttachment.setValue('size_bytes',current.size_bytes);
		grAttachment.setValue('table_name','sc_req_item');
		grAttachment.setValue('table_sys_id', grTask.request_item);

		grAttachment.insert();

Taking this back.

working well, but when its copied, its not usable. Its not real e.g. image object, when I download it to local disc, it doesnt open as it missing something from original file

Still trying to figure out next step.

Hello @Petr Pastuszek1 ,

Please try with the modified code below,

(function executeRule(current, previous /*null when async*/) {

    // Get the current task record
    var grTask = new GlideRecord('sc_task');
    if (grTask.get(current.table_sys_id)) {

        // Create a new sys_attachment record
        var grAttachment = new GlideRecord('sys_attachment');
        grAttachment.initialize();

        // Set values for the new attachment record
        grAttachment.setValue('file_name', current.file_name);
        grAttachment.setValue('content_type', current.content_type);
        grAttachment.setValue('size_bytes', current.size_bytes);
        grAttachment.setValue('table_name', 'sc_req_item');
        grAttachment.setValue('table_sys_id', grTask.request_item);

        // Insert the new attachment record
        var newAttachmentSysId = grAttachment.insert();

        // Copy the content stream from the original attachment to the new attachment
        var gsa = new GlideSysAttachment();
        gsa.writeContentStream(
            grAttachment,
            current.file_name,
            current.content_type,
            gsa.getContentStream(current.sys_id)
        );
        
        // Optionally, log the new attachment sys_id for debugging
        gs.info('New Attachment Sys ID: ' + newAttachmentSysId);
    }

})(current, previous);

Thank you, I used your code and updated below way which is after many tests working really as expected.

It will copy always only currently uploaded attachment or attachments from ritm to sc_task. Thank you

 

/Petr

(function executeRule(current, previous /*null when async*/) {

	
		/******************************************************
		 * Access task into which attachment has been uploaded
		 *****************************************************/
		var grTask = new GlideRecord('sc_task');
		if (grTask.get(current.table_sys_id)) {
		/******************************************************************
		 * Access RITM to which attachment will be copied from above task
		 ******************************************************************/
		var ritm = new GlideRecord('sc_req_item');
		ritm.get(grTask.request_item);
        
		/*******************************************************************************************
		 * Method to copy attachment from sc_task to RITM
		 * Do not use other method because it will copy all attachments and not currently uploded
		 *******************************************************************************************/
		var targetGlideRecord = ritm;
		var fileName = current.file_name;
		var contentType = current.content_type;
		var sourceAttachmentSysId = current.sys_id;					
					
				var gsa = new GlideSysAttachment();
				gsa.writeContentStream(
				targetGlideRecord,
				fileName,
				contentType,
				gsa.getContentStream(current.sys_id)
				);   
		}
})(current, previous);