Useful attachment scripts
Summarize
Summarized using AI
This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.
Summary of Useful Attachment Scripts
This document provides a collection of practical scripts for managing attachments in ServiceNow instances, specifically aimed at enhancing attachment handling capabilities. These scripts are designed for specific use cases and require thorough testing before implementation as they are provided as-is and not supported by Now Support.
Show less
Key Scripts and Their Uses
- Copy Attachments Between Records: Use
GlideSysAttachment.copy('sourcetable','sysid','destinationtable','sysid');to copy all attachments from one record to another. Note that this copies all attachments without selection. - Delete Duplicate Attachments: A script that can be run in a business rule, scheduled job, or background script to identify and delete duplicate attachments based on table and file name criteria within the
sysattachmenttable. - Display Attachment Status in Task List: A business rule script that updates a custom field (
uhasattachments) on task records to indicate whether attachments exist. It handles insert and delete operations and updates the field accordingly without triggering additional workflows or notifications. - Link Attachments in Email Notifications: A script to include clickable links to attachments in email notifications or templates, enabling recipients to easily access attached files. Requires replacing the placeholder instance name with the actual ServiceNow instance name.
- Attachment Download Logging: When users download attachments, an event (
attachment.read) is logged. This event can be processed via Script Actions or Email Notifications for tracking purposes, such as recording who downloaded an attachment and when. The current record context must be asysattachmentrecord for this feature.
Practical Considerations for ServiceNow Customers
- These scripts enhance attachment management by automating copying, deduplication, visibility, notification, and auditing processes.
- Implementation requires creating or using custom fields (e.g.,
uhasattachments) and configuring business rules or notification scripts accordingly. - Testing in a non-production environment is critical to ensure compatibility and to avoid unintended side effects or data loss.
- The logging feature supports compliance and auditing by tracking attachment downloads through event records.
- Community forums are recommended for support and discussion as these customizations are not officially supported by Now Support.
This is a searchable version of the Useful Attachment Scripts.
Warning:
The customization described here was
developed for use in specific instances, and is not supported by Now Support. This method is provided as-is
and should be tested thoroughly before implementation. Post all questions and
comments regarding this customization to our community forum.
Copy attachments from record to record
Use the following script to copy an attachment from one record to another
record:
GlideSysAttachment.copy('sourcetable','sys_id','destinationtable','sys_id');
Note:
GlideSysAttachment.copy
copies all attachments; it cannot select specific attachments.
Delete duplicate attachments
Use the following script in a business rule, scheduled job, or background script to delete
duplicate attachments located in the Attachments [sys_attachment]
table:
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
Use the following script in a business rule to display whether tasks have attachments when
viewed in the record list view. Note that the script needs a custom field on the Has
Attachments [u_has_attachments] table.
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();
}
}
Note:
Schedule the business rule to run after insert/delete.
Link to attachments in an email notification
Use the following script in an email notification or template to include links to
attachments:
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>');
}
}
Note:
Replace "instance_name" with your instance name.
Attachment Logging
Whenever a user downloads an attachment, the action writes an
attachment.read event record to the event log. If desired, you can
process these events with a Script Action or an Email Notification. This can be useful if
you want to do something when an attachment is read. For example, you can record when and by
whom certain attachments are downloaded. For this functionality, the
current variable must point to a sys_attachment record, and the event
record must use the following parameters:
- parm1: File name
- parm2: Table name