Useful attachment scripts
Summarize
Summary of Useful Attachment Scripts
This collection of attachment scripts provides practical methods to manage and interact with attachments in ServiceNow instances. These scripts enable copying attachments between records, deleting duplicate attachments, indicating attachment presence on task lists, including attachment links in email notifications, and logging attachment download events. Each script is designed for customization and should be thoroughly tested before deployment, as they are provided as-is and not supported by Now Support.
Show less
Copy Attachments Between Records
Use GlideSysAttachment.copy to duplicate all attachments from a source record to a destination record. This copies every attachment linked to the source record and does not allow selection of specific attachments.
Delete Duplicate Attachments
A sample script can be run in a business rule, scheduled job, or background script to identify and delete duplicate attachments within the sysattachment table. It filters records based on table name patterns and deletes duplicates by comparing record IDs and file names.
Display Attachment Presence in Task List Views
A business rule script updates a custom field (e.g., uhasattachments) on task records to reflect whether attachments are present. It runs after insert or delete attachment operations, counting existing attachments and updating the task accordingly without triggering additional workflows or notifications.
Include Attachment Links in Email Notifications
A script function can be embedded in email notifications or templates to dynamically generate clickable links to all attachments associated with a record. The instance name must be replaced appropriately in the URL to ensure correct links.
Attachment Download Logging
When users download attachments, a corresponding attachment.read event is logged automatically. These events can be processed by Script Actions or Email Notifications to track download activity, such as recording who downloaded which attachments and when. The event requires specific parameters including the file name and table name.
Important Considerations
- These scripts are customizations developed for specific instances and are not officially supported by Now Support.
- Testing in a non-production environment is essential before implementation.
- Post questions and share experiences on the ServiceNow community forum for guidance and support.
This is a searchable version of the Useful Attachment Scripts.
Copy attachments from record to record
GlideSysAttachment.copy('sourcetable','sys_id','destinationtable','sys_id');
Delete duplicate attachments
function fixDuplicateImages(){
var now_GR = new GlideRecord('sys_attachment');
now_GR.addQuery('table_name','LIKE','ZZ_YY%');
now_GR.orderBy('table_sys_id');
now_GR.orderByDesc('sys_created_on');
now_GR.query();
var lastID ='not_a_match';
var lastFile ='not_a_match';
while(now_GR.next()){
var isDuplicate = (lastID == now_GR.table_sys_id)&&(lastFile == now_GR.file_name);
lastID = now_GR.table_sys_id;
lastFile = now_GR.file_name;
gs.print(now_GR.table_sys_id + ' ' + now_GR.table_name + ' ' + now_GR.file_name + ' ' + now_GR.sys_created_on + ' ' + isDuplicate);
if(isDuplicate)
now_GR.deleteRecord();
}
}Display whether tasks have attachments in list view
checkAttachment();
function checkAttachment(){
// if inserting then the task has an attachment
if(current.operation()=='insert') {
hasAttachment('true'); // if deleting attachment check for other attachments
if(current.operation()=='delete') {
var timeNow3 =new GlideDateTime();
gs.log('has_attachment br: gliderecord query start date time is: '+ timeNow3.getNumericValue(),'jwtest');
var attachCount = new GlideAggregate('sys_attachment');
attachCount.addQuery('table_sys_id',current.sys_id);
attachCount.addAggregate('COUNT');
attachCount.query();
var numAttachments ='0';
// if no other attachments task does not have attachment
if(attachCount.next()){
numAttachments = attachCount.getAggregate("COUNT");
if(numAttachments >0){
hasAttachment ='true';
} else {
hasAttachment('false');
}
var timeNow4=new GlideDateTime();
gs.log('has_attachment br: gliderecord query start date time is: '+ timeNow4.getNumericValue(),'jwtest');
}
function hasAttachment(answer){
var task = new GlideRecord('task');
task.addQuery('sys_id',current.table_sys_id);
task.query();
if(task.next()){
task.u_has_attachment= answer;
task.autoSysFields(false); //Don't set the lastUpdatedTime or the Simultaneous Update Alert will likely get triggered
task.setWorkflow(false); //Don't allow other business rules to run, otherwise multiple notifications will likely be sent
task.update();
}
}
Link to attachments in an email notification
printattachments();
function printattachments(){
var now_GR =new GlideRecord('sys_attachment');
now_GR.addQuery('table_sys_id',current.sys_id);
now_GR.query();
while(now_GR.next()){
template.print('Attachment: <a href="http://'+gs.getProperty("instance_name")+'.service-now.com/sys_attachment.do?sys_id='+ now_GR.sys_id+'">'+ now_GR.file_name+'</a>');
}
}
Attachment Logging
- parm1: File name
- parm2: Table name