Useful attachment scripts
Summarize
Summary of Useful Attachment Scripts
This collection of attachment scripts offers practical utilities for managing attachments within ServiceNow instances. These scripts help automate common tasks such as copying attachments between records, deleting duplicates, indicating attachment presence on task lists, linking attachments in email notifications, and logging attachment downloads. They are designed for customization and require thorough testing before implementation, as they are provided as-is without official Now Support backing.
Show less
Copy Attachments Between Records
Use the GlideSysAttachment.copy method to transfer all attachments from one record to another by specifying source and destination tables and record sysids. Note that this method copies all attachments indiscriminately and does not support selecting specific attachments.
Delete Duplicate Attachments
A script can be executed in a business rule, scheduled job, or background script to identify and delete duplicate attachments in the sysattachment table. It works by comparing attachment filenames and record IDs, removing duplicates to maintain data cleanliness.
Display Attachment Presence in Task List Views
To show whether tasks have attachments in list views, implement a business rule that updates a custom field (e.g., uhasattachments) on the Task table. The script checks attachment counts on insertion or deletion events and updates the field accordingly, enabling users to quickly identify tasks with attachments.
Link Attachments in Email Notifications
Embed links to attachments within email notifications or templates by using a script that queries attachments for the current record and generates clickable URLs. Replace the placeholder instancename with your actual ServiceNow instance name to ensure proper linking.
Attachment Download Logging
Attachment downloads trigger attachment.read event records in the event log. These can be processed with Script Actions or Email Notifications to track when and by whom attachments are accessed. This feature supports enhanced auditing and monitoring of attachment usage.
Important Considerations
- These scripts are customized solutions and are not officially supported by Now Support.
- Testing in a non-production environment is strongly recommended before deployment.
- Some scripts require custom fields or configurations (e.g., the uhasattachments field) to function properly.
- Modifications such as replacing instance names in URLs are necessary for accurate functionality.
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