notification-events
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseNotification 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
核心表
| Table | Purpose |
|---|---|
| Event queue |
| Event registry |
| Script actions |
| Email notifications |
| 表名 | 用途 |
|---|---|
| 事件队列 |
| 事件注册表 |
| 脚本动作 |
| 邮件通知 |
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
可用工具
| Tool | Purpose |
|---|---|
| Queue events |
| Query event queue |
| Find event configurations |
| Test event scripts |
| 工具 | 用途 |
|---|---|
| 事件入队 |
| 查询事件队列 |
| 查找事件配置 |
| 测试事件脚本 |
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
最佳实践
- Namespace Events - Use app prefix (x_myapp.*)
- Register Events - Document in sysevent_register
- Meaningful Names - Clear event purpose
- Parameters - Use parm1/parm2 wisely
- Conditions - Filter before processing
- Async Processing - Don't block transactions
- Error Handling - Handle script failures
- ES5 Only - No modern JavaScript syntax
- 命名空间事件 - 使用应用前缀(x_myapp.*)
- 注册事件 - 在sysevent_register中记录文档
- 有意义的名称 - 清晰说明事件用途
- 参数使用 - 合理使用parm1/parm2
- 条件过滤 - 处理前先过滤
- 异步处理 - 不要阻塞事务
- 错误处理 - 处理脚本失败情况
- 仅支持ES5 - 禁止使用现代JavaScript语法