notification-events

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Notification Events for ServiceNow

ServiceNow的通知事件

Events trigger notifications, scripts, and workflows in ServiceNow.
在ServiceNow中,事件会触发通知、脚本和工作流。

Event Architecture

事件架构

gs.eventQueue() → Event Queue (sysevent)
Event Registry (sysevent_register)
Script Actions (sysevent_script_action)
Notifications (sysevent_email_action)
gs.eventQueue() → Event Queue (sysevent)
Event Registry (sysevent_register)
Script Actions (sysevent_script_action)
Notifications (sysevent_email_action)

Key Tables

核心表

TablePurpose
sysevent
Event queue
sysevent_register
Event registry
sysevent_script_action
Script actions
sysevent_email_action
Email notifications
表名用途
sysevent
事件队列
sysevent_register
事件注册表
sysevent_script_action
脚本动作
sysevent_email_action
邮件通知

Creating Events (ES5)

创建事件(仅支持ES5)

Register Event

注册事件

javascript
// Register event in sysevent_register (ES5 ONLY!)
var event = new GlideRecord('sysevent_register');
event.initialize();

event.setValue('event_name', 'x_myapp.incident.escalated');
event.setValue('table', 'incident');
event.setValue('description', 'Fired when an incident is escalated');
event.setValue('fired_by', 'Business Rules, Scripts');

// Parameters
event.setValue('parm1', 'escalation_level');
event.setValue('parm2', 'previous_group');

event.insert();
javascript
// Register event in sysevent_register (ES5 ONLY!)
var event = new GlideRecord('sysevent_register');
event.initialize();

event.setValue('event_name', 'x_myapp.incident.escalated');
event.setValue('table', 'incident');
event.setValue('description', 'Fired when an incident is escalated');
event.setValue('fired_by', 'Business Rules, Scripts');

// Parameters
event.setValue('parm1', 'escalation_level');
event.setValue('parm2', 'previous_group');

event.insert();

Queue Event

入队事件

javascript
// Queue event from script (ES5 ONLY!)
// gs.eventQueue(event_name, gr, parm1, parm2)

// In a Business Rule
(function executeRule(current, previous) {
    // Check if escalated
    if (current.escalation.changesTo('1')) {
        gs.eventQueue(
            'x_myapp.incident.escalated',
            current,
            current.getValue('escalation'),
            previous.assignment_group.getDisplayValue()
        );
    }
})(current, previous);
javascript
// Queue event from script (ES5 ONLY!)
// gs.eventQueue(event_name, gr, parm1, parm2)

// In a Business Rule
(function executeRule(current, previous) {
    // Check if escalated
    if (current.escalation.changesTo('1')) {
        gs.eventQueue(
            'x_myapp.incident.escalated',
            current,
            current.getValue('escalation'),
            previous.assignment_group.getDisplayValue()
        );
    }
})(current, previous);

Event Parameters

事件参数

javascript
// Access event parameters in script action (ES5 ONLY!)
// event.parm1 = first parameter
// event.parm2 = second parameter

// In Script Action
(function executeEvent(event) {
    var escalationLevel = event.parm1;
    var previousGroup = event.parm2;

    var incident = event.getGlideRecord();

    gs.info('Incident ' + incident.getValue('number') +
            ' escalated to level ' + escalationLevel +
            ' from ' + previousGroup);

    // Perform action based on event
    if (escalationLevel === '1') {
        notifyManager(incident);
    } else if (escalationLevel === '2') {
        notifyDirector(incident);
    } else if (escalationLevel === '3') {
        notifyVP(incident);
    }
})(event);
javascript
// Access event parameters in script action (ES5 ONLY!)
// event.parm1 = first parameter
// event.parm2 = second parameter

// In Script Action
(function executeEvent(event) {
    var escalationLevel = event.parm1;
    var previousGroup = event.parm2;

    var incident = event.getGlideRecord();

    gs.info('Incident ' + incident.getValue('number') +
            ' escalated to level ' + escalationLevel +
            ' from ' + previousGroup);

    // Perform action based on event
    if (escalationLevel === '1') {
        notifyManager(incident);
    } else if (escalationLevel === '2') {
        notifyDirector(incident);
    } else if (escalationLevel === '3') {
        notifyVP(incident);
    }
})(event);

Script Actions (ES5)

脚本动作(仅支持ES5)

Create Script Action

创建脚本动作

javascript
// Create script action for event (ES5 ONLY!)
var action = new GlideRecord('sysevent_script_action');
action.initialize();

action.setValue('name', 'Handle Incident Escalation');
action.setValue('event_name', 'x_myapp.incident.escalated');
action.setValue('active', true);

// Condition (optional)
action.setValue('condition', 'event.parm1 >= 2');

// Script (ES5 ONLY!)
action.setValue('script',
    '(function executeEvent(event) {\n' +
    '    var incident = event.getGlideRecord();\n' +
    '    var escalationLevel = event.parm1;\n' +
    '    \n' +
    '    // Create escalation task\n' +
    '    var task = new GlideRecord("task");\n' +
    '    task.initialize();\n' +
    '    task.parent = incident.getUniqueValue();\n' +
    '    task.short_description = "Review escalated incident";\n' +
    '    task.assignment_group = getEscalationGroup(escalationLevel);\n' +
    '    task.insert();\n' +
    '    \n' +
    '    gs.info("Created escalation task for " + incident.number);\n' +
    '})(event);'
);

action.insert();
javascript
// Create script action for event (ES5 ONLY!)
var action = new GlideRecord('sysevent_script_action');
action.initialize();

action.setValue('name', 'Handle Incident Escalation');
action.setValue('event_name', 'x_myapp.incident.escalated');
action.setValue('active', true);

// Condition (optional)
action.setValue('condition', 'event.parm1 >= 2');

// Script (ES5 ONLY!)
action.setValue('script',
    '(function executeEvent(event) {\n' +
    '    var incident = event.getGlideRecord();\n' +
    '    var escalationLevel = event.parm1;\n' +
    '    \n' +
    '    // Create escalation task\n' +
    '    var task = new GlideRecord("task");\n' +
    '    task.initialize();\n' +
    '    task.parent = incident.getUniqueValue();\n' +
    '    task.short_description = "Review escalated incident";\n' +
    '    task.assignment_group = getEscalationGroup(escalationLevel);\n' +
    '    task.insert();\n' +
    '    \n' +
    '    gs.info("Created escalation task for " + incident.number);\n' +
    '})(event);'
);

action.insert();

Delayed Event

延迟事件

javascript
// Queue event with delay (ES5 ONLY!)
// Will be processed after specified time

var delay = new GlideDateTime();
delay.addSeconds(3600);  // 1 hour delay

var event = new GlideRecord('sysevent');
event.initialize();
event.setValue('name', 'x_myapp.reminder.send');
event.setValue('instance', recordSysId);
event.setValue('table', 'incident');
event.setValue('parm1', 'first_reminder');
event.setValue('parm2', '');
event.setValue('claimed', false);
event.setValue('process_on', delay);
event.insert();
javascript
// Queue event with delay (ES5 ONLY!)
// Will be processed after specified time

var delay = new GlideDateTime();
delay.addSeconds(3600);  // 1 hour delay

var event = new GlideRecord('sysevent');
event.initialize();
event.setValue('name', 'x_myapp.reminder.send');
event.setValue('instance', recordSysId);
event.setValue('table', 'incident');
event.setValue('parm1', 'first_reminder');
event.setValue('parm2', '');
event.setValue('claimed', false);
event.setValue('process_on', delay);
event.insert();

Email Notifications (ES5)

邮件通知(仅支持ES5)

Create Email Action

创建邮件动作

javascript
// Create notification for event (ES5 ONLY!)
var notification = new GlideRecord('sysevent_email_action');
notification.initialize();

notification.setValue('name', 'Incident Escalation Notification');
notification.setValue('event_name', 'x_myapp.incident.escalated');
notification.setValue('active', true);

// Recipients
notification.setValue('recipient_users', '');
notification.setValue('recipient_groups', getGroupSysId('IT Management'));
notification.setValue('send_self', false);

// Use event.parm1 to get escalation manager
notification.setValue('recipient_fields', 'assignment_group.manager');

// Email content
notification.setValue('subject', 'Incident ${number} Escalated - Level ${event.parm1}');
notification.setValue('message_html',
    '<p>Incident <b>${number}</b> has been escalated.</p>' +
    '<p>Short Description: ${short_description}</p>' +
    '<p>Escalation Level: ${event.parm1}</p>' +
    '<p>Previous Group: ${event.parm2}</p>' +
    '<p><a href="${URI_REF}">View Incident</a></p>'
);

notification.insert();
javascript
// Create notification for event (ES5 ONLY!)
var notification = new GlideRecord('sysevent_email_action');
notification.initialize();

notification.setValue('name', 'Incident Escalation Notification');
notification.setValue('event_name', 'x_myapp.incident.escalated');
notification.setValue('active', true);

// Recipients
notification.setValue('recipient_users', '');
notification.setValue('recipient_groups', getGroupSysId('IT Management'));
notification.setValue('send_self', false);

// Use event.parm1 to get escalation manager
notification.setValue('recipient_fields', 'assignment_group.manager');

// Email content
notification.setValue('subject', 'Incident ${number} Escalated - Level ${event.parm1}');
notification.setValue('message_html',
    '<p>Incident <b>${number}</b> has been escalated.</p>' +
    '<p>Short Description: ${short_description}</p>' +
    '<p>Escalation Level: ${event.parm1}</p>' +
    '<p>Previous Group: ${event.parm2}</p>' +
    '<p><a href="${URI_REF}">View Incident</a></p>'
);

notification.insert();

Conditional Notification

条件式通知

javascript
// Notification with advanced condition (ES5 ONLY!)
var notification = new GlideRecord('sysevent_email_action');
notification.initialize();
notification.setValue('name', 'VIP Incident Alert');
notification.setValue('event_name', 'incident.created');

// Advanced condition script
notification.setValue('advanced_condition', true);
notification.setValue('condition',
    'current.caller_id.vip == true && current.priority <= 2'
);

// Send to specific recipients for VIP
notification.setValue('recipient_groups', getGroupSysId('VIP Support'));

notification.insert();
javascript
// Notification with advanced condition (ES5 ONLY!)
var notification = new GlideRecord('sysevent_email_action');
notification.initialize();
notification.setValue('name', 'VIP Incident Alert');
notification.setValue('event_name', 'incident.created');

// Advanced condition script
notification.setValue('advanced_condition', true);
notification.setValue('condition',
    'current.caller_id.vip == true && current.priority <= 2'
);

// Send to specific recipients for VIP
notification.setValue('recipient_groups', getGroupSysId('VIP Support'));

notification.insert();

Common Event Patterns (ES5)

常见事件模式(仅支持ES5)

Reminder Event

提醒事件

javascript
// Schedule reminder events (ES5 ONLY!)
function scheduleReminder(tableName, recordSysId, reminderType, delayMinutes) {
    var eventTime = new GlideDateTime();
    eventTime.addSeconds(delayMinutes * 60);

    var reminder = new GlideRecord('sysevent');
    reminder.initialize();
    reminder.setValue('name', 'x_myapp.reminder');
    reminder.setValue('instance', recordSysId);
    reminder.setValue('table', tableName);
    reminder.setValue('parm1', reminderType);
    reminder.setValue('process_on', eventTime);
    reminder.insert();

    return reminder.getUniqueValue();
}

// Cancel scheduled reminder
function cancelReminder(eventSysId) {
    var reminder = new GlideRecord('sysevent');
    if (reminder.get(eventSysId)) {
        reminder.deleteRecord();
        return true;
    }
    return false;
}
javascript
// Schedule reminder events (ES5 ONLY!)
function scheduleReminder(tableName, recordSysId, reminderType, delayMinutes) {
    var eventTime = new GlideDateTime();
    eventTime.addSeconds(delayMinutes * 60);

    var reminder = new GlideRecord('sysevent');
    reminder.initialize();
    reminder.setValue('name', 'x_myapp.reminder');
    reminder.setValue('instance', recordSysId);
    reminder.setValue('table', tableName);
    reminder.setValue('parm1', reminderType);
    reminder.setValue('process_on', eventTime);
    reminder.insert();

    return reminder.getUniqueValue();
}

// Cancel scheduled reminder
function cancelReminder(eventSysId) {
    var reminder = new GlideRecord('sysevent');
    if (reminder.get(eventSysId)) {
        reminder.deleteRecord();
        return true;
    }
    return false;
}

Batch Processing Event

批量处理事件

javascript
// Queue batch processing (ES5 ONLY!)
// Business Rule: after, insert, u_import_batch

(function executeRule(current, previous) {
    // Queue processing for each record in batch
    var record = new GlideRecord('u_import_record');
    record.addQuery('batch', current.getUniqueValue());
    record.query();

    while (record.next()) {
        gs.eventQueue('x_myapp.import.process_record', record, current.getUniqueValue(), '');
    }

    // Queue completion check
    var delay = new GlideDateTime();
    delay.addSeconds(300);  // Check in 5 minutes

    var event = new GlideRecord('sysevent');
    event.initialize();
    event.setValue('name', 'x_myapp.import.check_complete');
    event.setValue('instance', current.getUniqueValue());
    event.setValue('table', 'u_import_batch');
    event.setValue('process_on', delay);
    event.insert();
})(current, previous);
javascript
// Queue batch processing (ES5 ONLY!)
// Business Rule: after, insert, u_import_batch

(function executeRule(current, previous) {
    // Queue processing for each record in batch
    var record = new GlideRecord('u_import_record');
    record.addQuery('batch', current.getUniqueValue());
    record.query();

    while (record.next()) {
        gs.eventQueue('x_myapp.import.process_record', record, current.getUniqueValue(), '');
    }

    // Queue completion check
    var delay = new GlideDateTime();
    delay.addSeconds(300);  // Check in 5 minutes

    var event = new GlideRecord('sysevent');
    event.initialize();
    event.setValue('name', 'x_myapp.import.check_complete');
    event.setValue('instance', current.getUniqueValue());
    event.setValue('table', 'u_import_batch');
    event.setValue('process_on', delay);
    event.insert();
})(current, previous);

State Change Event

状态变更事件

javascript
// Generic state change event (ES5 ONLY!)
// Business Rule: after, update

(function executeRule(current, previous) {
    if (current.state.changes()) {
        gs.eventQueue(
            'x_myapp.' + current.getTableName() + '.state_change',
            current,
            previous.getValue('state'),
            current.getValue('state')
        );
    }
})(current, previous);
javascript
// Generic state change event (ES5 ONLY!)
// Business Rule: after, update

(function executeRule(current, previous) {
    if (current.state.changes()) {
        gs.eventQueue(
            'x_myapp.' + current.getTableName() + '.state_change',
            current,
            previous.getValue('state'),
            current.getValue('state')
        );
    }
})(current, previous);

Event Debugging (ES5)

事件调试(仅支持ES5)

Check Event Queue

检查事件队列

javascript
// Query pending events (ES5 ONLY!)
function getPendingEvents(eventName) {
    var events = [];

    var event = new GlideRecord('sysevent');
    event.addQuery('name', eventName);
    event.addQuery('claimed', false);
    event.orderByDesc('sys_created_on');
    event.setLimit(100);
    event.query();

    while (event.next()) {
        events.push({
            sys_id: event.getUniqueValue(),
            name: event.getValue('name'),
            instance: event.getValue('instance'),
            parm1: event.getValue('parm1'),
            parm2: event.getValue('parm2'),
            process_on: event.getValue('process_on'),
            created: event.getValue('sys_created_on')
        });
    }

    return events;
}
javascript
// Query pending events (ES5 ONLY!)
function getPendingEvents(eventName) {
    var events = [];

    var event = new GlideRecord('sysevent');
    event.addQuery('name', eventName);
    event.addQuery('claimed', false);
    event.orderByDesc('sys_created_on');
    event.setLimit(100);
    event.query();

    while (event.next()) {
        events.push({
            sys_id: event.getUniqueValue(),
            name: event.getValue('name'),
            instance: event.getValue('instance'),
            parm1: event.getValue('parm1'),
            parm2: event.getValue('parm2'),
            process_on: event.getValue('process_on'),
            created: event.getValue('sys_created_on')
        });
    }

    return events;
}

MCP Tool Integration

MCP工具集成

Available Tools

可用工具

ToolPurpose
snow_create_event
Queue events
snow_query_table
Query event queue
snow_find_artifact
Find event configurations
snow_execute_script_with_output
Test event scripts
工具用途
snow_create_event
事件入队
snow_query_table
查询事件队列
snow_find_artifact
查找事件配置
snow_execute_script_with_output
测试事件脚本

Example Workflow

示例工作流

javascript
// 1. Queue an event
await snow_create_event({
    name: 'x_myapp.test.event',
    table: 'incident',
    instance: incidentSysId,
    parm1: 'test_value'
});

// 2. Check event queue
await snow_query_table({
    table: 'sysevent',
    query: 'name=x_myapp.test.event^claimed=false',
    fields: 'name,instance,parm1,parm2,process_on'
});

// 3. Find script actions
await snow_query_table({
    table: 'sysevent_script_action',
    query: 'event_nameLIKEx_myapp',
    fields: 'name,event_name,active,condition'
});
javascript
// 1. Queue an event
await snow_create_event({
    name: 'x_myapp.test.event',
    table: 'incident',
    instance: incidentSysId,
    parm1: 'test_value'
});

// 2. Check event queue
await snow_query_table({
    table: 'sysevent',
    query: 'name=x_myapp.test.event^claimed=false',
    fields: 'name,instance,parm1,parm2,process_on'
});

// 3. Find script actions
await snow_query_table({
    table: 'sysevent_script_action',
    query: 'event_nameLIKEx_myapp',
    fields: 'name,event_name,active,condition'
});

Best Practices

最佳实践

  1. Namespace Events - Use app prefix (x_myapp.*)
  2. Register Events - Document in sysevent_register
  3. Meaningful Names - Clear event purpose
  4. Parameters - Use parm1/parm2 wisely
  5. Conditions - Filter before processing
  6. Async Processing - Don't block transactions
  7. Error Handling - Handle script failures
  8. ES5 Only - No modern JavaScript syntax
  1. 命名空间事件 - 使用应用前缀(x_myapp.*)
  2. 注册事件 - 在sysevent_register中记录文档
  3. 有意义的名称 - 清晰说明事件用途
  4. 参数使用 - 合理使用parm1/parm2
  5. 条件过滤 - 处理前先过滤
  6. 异步处理 - 不要阻塞事务
  7. 错误处理 - 处理脚本失败情况
  8. 仅支持ES5 - 禁止使用现代JavaScript语法