关于 glide-api-reference
glide-api-reference 是供 ServiceNow 开发者编写服务器端 JavaScript 时查阅的 API 技能。内容涵盖记录、聚合、日期时间、系统上下文及相关数据操作的 Glide API。
主要功能
- 01GlideRecord 查询与记录操作
- 02GlideAggregate 计算与分组
- 03日期和时长处理
- 04GlideSystem 与用户上下文方法
- 05JSON 和 XML 工具
适用场景
- 01编写 ServiceNow Business Rules
- 02构建 Script Includes 和 Scheduled Jobs
- 03查询与更新 ServiceNow 记录
- 04汇总事件数据
MCP 相关
参考内容包含使用 SN-Query-Table MCP 工具查询 ServiceNow 表的示例。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill glide-api-reference安装后在 Claude Code 中输入/glide-api-reference确认已加载。
详细介绍
Glide API 参考
概述
此技能提供 ServiceNow 服务端 Glide API 的全面参考:
- GlideRecord - 查询、插入、更新和删除记录
- GlideAggregate - 执行聚合操作(COUNT、SUM、AVG 等)
- GlideDateTime/GlideDuration - 日期和时间处理
- GlideSystem (gs.*) - 系统实用工具和用户上下文
- GlideUser - 当前用户信息
- GlideSession - 会话管理
- GlideElement - 字段级方法
- GlideEncrypter - 加密实用工具
- JSON/XML utilities - 数据转换
适用场景: 编写业务规则、脚本包含、计划作业、UI 操作或任何 ServiceNow 服务端脚本时。
适用对象: 需要快速查阅 Glide API 的各级 ServiceNow 开发人员。
前置条件
- 角色: 视上下文而定(后台脚本需要
admin,更新记录需要itil) - 知识: 基础 JavaScript、ServiceNow 数据模型
- 访问权限: 对所访问记录具有相应的表 ACL 权限
操作步骤
以下各节提供全面的 API 参考和用法模式。
GlideRecord API
GlideRecord 是 ServiceNow 中用于数据库操作的主要 API。
基本查询模式
var gr = new GlideRecord('incident');
gr.addQuery('active', true);
gr.addQuery('priority', 1);
gr.query();
while (gr.next()) {
gs.info('Incident: ' + gr.number + ' - ' + gr.short_description);
}
查询方法
| 方法 | 说明 | 示例 |
|---|---|---|
addQuery(field, value) | 等于条件 | gr.addQuery('active', true) |
addQuery(field, operator, value) | 比较条件 | gr.addQuery('priority', '<=', 2) |
addEncodedQuery(query) | 编码查询字符串 | gr.addEncodedQuery('active=true^priority=1') |
addNotNullQuery(field) | 字段不为空 | gr.addNotNullQuery('assigned_to') |
addNullQuery(field) | 字段为空 | gr.addNullQuery('resolution_notes') |
addOrCondition(field, value) | OR 条件 | 参见下方示例 |
query() | 执行查询 | gr.query() |
查询运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
= | 等于(默认) | addQuery('state', 1) |
!= | 不等于 | addQuery('state', '!=', 6) |
> | 大于 | addQuery('priority', '>', 1) |
>= | 大于或等于 | addQuery('sys_created_on', '>=', gs.daysAgo(7)) |
< | 小于 | addQuery('priority', '<', 3) |
<= | 小于或等于 | addQuery('sys_updated_on', '<=', gs.daysAgo(30)) |
STARTSWITH | 以字符串开头 | addQuery('number', 'STARTSWITH', 'INC') |
ENDSWITH | 以字符串结尾 | addQuery('short_description', 'ENDSWITH', 'error') |
CONTAINS | 包含字符串 | addQuery('description', 'CONTAINS', 'network') |
DOES NOT CONTAIN | 不包含 | addQuery('description', 'DOES NOT CONTAIN', 'test') |
IN | 值列表中的值 | addQuery('state', 'IN', '1,2,3') |
NOT IN | 不在列表中 | addQuery('priority', 'NOT IN', '4,5') |
INSTANCEOF | 表层次结构 | addQuery('sys_class_name', 'INSTANCEOF', 'cmdb_ci') |
OR 条件
var gr = new GlideRecord('incident');
var qc = gr.addQuery('priority', 1);
qc.addOrCondition('priority', 2);
gr.query();
// Equivalent to: priority=1^ORpriority=2
复杂查询示例
var gr = new GlideRecord('incident');
gr.addQuery('active', true);
gr.addQuery('priority', '<=', 2);
gr.addNotNullQuery('assigned_to');
gr.addQuery('sys_created_on', '>=', gs.daysAgo(30));
// OR condition group
var qc = gr.addQuery('category', 'network');
qc.addOrCondition('category', 'hardware');
gr.orderByDesc('priority');
gr.orderBy('sys_created_on');
gr.setLimit(100);
gr.query();
插入操作
// Basic insert
var gr = new GlideRecord('incident');
gr.initialize();
gr.short_description = 'New incident from script';
gr.description = 'Detailed description here';
gr.caller_id = gs.getUserID();
gr.priority = 3;
gr.category = 'inquiry';
var sysId = gr.insert();
gs.info('Created incident: ' + gr.number + ' (sys_id: ' + sysId + ')');
插入时验证字段
var gr = new GlideRecord('incident');
gr.initialize();
// Check if field is valid before setting
if (gr.isValidField('custom_field')) {
gr.custom_field = 'value';
}
// Use setValue for reference fields (safer)
gr.setValue('assignment_group', 'a715cd759f2002002920bde8132e7018');
gr.setValue('assigned_to', gs.getUserID());
var sysId = gr.insert();
更新操作
// Update single record by sys_id
var gr = new GlideRecord('incident');
if (gr.get('a1b2c3d4e5f6...')) {
gr.state = 2; // In Progress
gr.work_notes = 'Automated update via script';
gr.update();
gs.info('Updated: ' + gr.number);
}
批量更新模式
// Update multiple records matching query
var gr = new GlideRecord('incident');
gr.addQuery('active', true);
gr.addQuery('priority', 1);
gr.addNullQuery('assigned_to');
gr.query();
var count = 0;
while (gr.next()) {
gr.assignment_group = 'Critical Incidents Team';
gr.work_notes = 'Auto-assigned to critical team';
gr.update();
count++;
}
gs.info('Updated ' + count + ' incidents');
删除操作
// Delete single record
var gr = new GlideRecord('sys_user_preference');
if (gr.get('sys_id_here')) {
gr.deleteRecord();
}
// Delete multiple records (USE WITH CAUTION!)
var gr = new GlideRecord('temp_import_table');
gr.addQuery('sys_created_on', '<', gs.daysAgo(30));
gr.deleteMultiple(); // Deletes ALL matching records
导航方法
| 方法 | 说明 |
|---|---|
next() | 移至下一条记录;若存在则返回 true |
hasNext() | 检查是否还有记录(不会前进) |
get(sysId) | 按 sys_id 获取记录 |
get(field, value) | 按字段值获取记录 |
getRowCount() | 查询结果中的记录总数 |
限制结果数量和分页
// Limit results
gr.setLimit(10);
// Pagination with chooseWindow
gr.chooseWindow(0, 100); // First 100 records
gr.chooseWindow(100, 200); // Records 101-200
// Order results
gr.orderBy('priority'); // Ascending
gr.orderByDesc('sys_created_on'); // Descending
记录状态方法
| 方法 | 描述 |
|---|---|
isNewRecord() | 如果记录尚未插入,则为 True |
isValidRecord() | 如果当前记录有效,则为 True |
isValidField(field) | 如果字段存在于表中,则为 True |
canRead() | 如果用户可以读取记录,则为 True |
canWrite() | 如果用户可以写入记录,则为 True |
canCreate() | 如果用户可以创建记录,则为 True |
canDelete() | 如果用户可以删除记录,则为 True |
changes() | 如果任意字段已更改,则为 True |
使用 MCP 工具
Tool: SN-Query-Table
Parameters:
table_name: incident
query: active=true^priority=1
fields: sys_id,number,short_description,state,priority
limit: 10
GlideAggregate API
GlideAggregate 可在数据库层高效执行数据库聚合操作。
基本 COUNT
var ga = new GlideAggregate('incident');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.query();
if (ga.next()) {
var count = ga.getAggregate('COUNT');
gs.info('Active incidents: ' + count);
}
聚合函数
| 函数 | 描述 | 示例 |
|---|---|---|
COUNT | 统计记录 | ga.addAggregate('COUNT') |
SUM | 对数值字段求和 | ga.addAggregate('SUM', 'actual_hours') |
AVG | 计算字段平均值 | ga.addAggregate('AVG', 'priority') |
MIN | 最小值 | ga.addAggregate('MIN', 'sys_created_on') |
MAX | 最大值 | ga.addAggregate('MAX', 'priority') |
GROUP BY 操作
// Count incidents by priority
var ga = new GlideAggregate('incident');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.groupBy('priority');
ga.query();
while (ga.next()) {
var priority = ga.priority;
var count = ga.getAggregate('COUNT');
gs.info('Priority ' + priority + ': ' + count + ' incidents');
}
多个聚合
// Get count and average time per category
var ga = new GlideAggregate('incident');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.addAggregate('AVG', 'reassignment_count');
ga.groupBy('category');
ga.orderByAggregate('COUNT'); // Order by count
ga.query();
while (ga.next()) {
gs.info(ga.category + ': ' +
ga.getAggregate('COUNT') + ' incidents, ' +
'avg reassignments: ' + ga.getAggregate('AVG', 'reassignment_count'));
}
Having 子句(筛选聚合结果)
// Categories with more than 10 incidents
var ga = new GlideAggregate('incident');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.groupBy('category');
ga.addHaving('COUNT', '>', 10);
ga.query();
趋势分析模式
// Incidents created per day over last 7 days
var ga = new GlideAggregate('incident');
ga.addQuery('sys_created_on', '>=', gs.daysAgo(7));
ga.addAggregate('COUNT');
ga.addTrend('sys_created_on', 'Day');
ga.query();
while (ga.next()) {
var date = ga.getValue('timeref');
var count = ga.getAggregate('COUNT');
gs.info(date + ': ' + count + ' incidents created');
}
GlideDateTime API
GlideDateTime 可处理带时区感知的日期和时间操作。
创建 GlideDateTime 对象
// Current date/time
var gdt = new GlideDateTime();
// From string (UTC format)
var gdt = new GlideDateTime('2026-02-06 12:00:00');
// Copy existing
var gdt2 = new GlideDateTime(gdt);
获取值
| 方法 | 描述 | 示例输出 |
|---|---|---|
getValue() | 内部值(UTC) | 2026-02-06 12:00:00 |
getDisplayValue() | 用户时区 | 2026-02-06 04:00:00 |
getDate() | 日期部分 | 2026-02-06 |
getTime() | 时间部分 | 12:00:00 |
getNumericValue() | 自纪元以来的毫秒数 | 1770465600000 |
getDayOfWeek() | 星期数字(1=周一) | 5(周五) |
getDayOfMonth() | 月中的日期 | 6 |
getMonthUTC() | 月份(1-12) | 2 |
getYearUTC() | 年份 | 2026 |
设置值
var gdt = new GlideDateTime();
// Set from string
gdt.setValue('2026-12-25 00:00:00');
// Set display value (user timezone)
gdt.setDisplayValue('2026-12-25 00:00:00');
// Set components
gdt.setYearUTC(2026);
gdt.setMonthUTC(12);
gdt.setDayOfMonthUTC(25);
日期运算
var gdt = new GlideDateTime();
// Add time
gdt.addSeconds(60);
gdt.addMinutes(30);
gdt.addHours(2);
gdt.addDays(7);
gdt.addMonths(1);
gdt.addYears(1);
// Add GlideDuration
var duration = new GlideDuration('1 12:30:00'); // 1 day, 12 hours, 30 minutes
gdt.add(duration);
// Subtract
gdt.addDays(-7); // 7 days ago
日期比较
var gdt1 = new GlideDateTime('2026-02-06 12:00:00');
var gdt2 = new GlideDateTime('2026-02-07 12:00:00');
// Compare
if (gdt1.before(gdt2)) {
gs.info('gdt1 is earlier');
}
if (gdt2.after(gdt1)) {
gs.info('gdt2 is later');
}
if (gdt1.equals(gdt2)) {
gs.info('Same date/time');
}
// Get difference
var diff = GlideDateTime.subtract(gdt1, gdt2);
gs.info('Difference: ' + diff.getDisplayValue()); // Duration
常见日期模式
// Start of today
var startOfDay = new GlideDateTime();
startOfDay.setDisplayValue(startOfDay.getDate() + ' 00:00:00');
// End of today
var endOfDay = new GlideDateTime();
endOfDay.setDisplayValue(endOfDay.getDate() + ' 23:59:59');
// Beginning of month
var startOfMonth = new GlideDateTime();
startOfMonth.setDayOfMonthUTC(1);
startOfMonth.setDisplayValue(startOfMonth.getDate() + ' 00:00:00');
// Check if date is in future
function isFuture(dateField) {
var now = new GlideDateTime();
var target = new GlideDateTime(dateField);
return target.after(now);
}
GlideDuration API
GlideDuration 表示一段时间长度。
创建时长
// From string (days hours:minutes:seconds)
var dur = new GlideDuration('1 12:30:00'); // 1 day, 12 hours, 30 minutes
// From milliseconds
var dur = new GlideDuration(86400000); // 1 day in ms
// From two GlideDateTimes
var start = new GlideDateTime('2026-02-06 00:00:00');
var end = new GlideDateTime('2026-02-07 12:00:00');
var dur = GlideDateTime.subtract(start, end);
时长方法
| 方法 | 描述 |
|---|---|
getValue() | 内部值 |
getDisplayValue() | 易于阅读的值 |
getNumericValue() | 毫秒数 |
getDayPart() | 天数部分 |
getRoundedDayPart() | 四舍五入后的天数 |
getDurationValue() | 时长字符串 |
时长运算
var dur1 = new GlideDuration('1 00:00:00'); // 1 day
var dur2 = new GlideDuration('0 12:00:00'); // 12 hours
// Add
var total = dur1.add(dur2); // 1 day 12 hours
// Subtract
var diff = dur1.subtract(dur2); // 12 hours
// Compare
dur1.compareTo(dur2); // -1, 0, or 1
计算工作时长
// Calculate business hours between two dates using schedule
var schedule = new GlideSchedule('08fcd0830a0a0b2600079f56b1adb9ae'); // 8-5 M-F
var startDate = new GlideDateTime('2026-02-06 09:00:00');
var endDate = new GlideDateTime('2026-02-07 17:00:00');
var duration = schedule.duration(startDate, endDate);
gs.info('Business duration: ' + duration.getDisplayValue());
GlideSystem(gs.*)方法
GlideSystem 提供实用函数,并可访问系统上下文。
用户上下文
| 方法 | 描述 |
|---|---|
gs.getUserID() | 当前用户的 sys_id |
gs.getUserName() | 用户名 |
gs.getUserDisplayName() | 全名 |
gs.getUser() | GlideUser 对象 |
gs.hasRole(role) | 检查用户角色 |
gs.hasRoleInGroup(role, group) | 检查组内角色 |
日期/时间快捷方法
// Relative dates (return strings for queries)
gs.now(); // Current timestamp
gs.nowDateTime(); // Current date/time
gs.daysAgo(7); // 7 days ago
gs.daysAgoStart(7); // Start of day 7 days ago
gs.daysAgoEnd(7); // End of day 7 days ago
gs.hoursAgo(2); // 2 hours ago
gs.minutesAgo(30); // 30 minutes ago
gs.monthsAgo(1); // 1 month ago
gs.yearsAgo(1); // 1 year ago
gs.beginningOfLastMonth();
gs.endOfLastMonth();
gs.beginningOfThisMonth();
gs.beginningOfThisYear();
查询日期示例
// Incidents created in last 7 days
var gr = new GlideRecord('incident');
gr.addQuery('sys_created_on', '>=', gs.daysAgo(7));
gr.query();
// Using encoded query
gr.addEncodedQuery('sys_created_onONLast 7 days@javascript:gs.daysAgoStart(7)@javascript:gs.daysAgoEnd(0)');
日志记录
gs.info('Informational message');
gs.warn('Warning message');
gs.error('Error message');
gs.debug('Debug message'); // Only logged if debug enabled
// Include data in logs
gs.info('Processing incident: ' + current.number + ', State: ' + current.state);
// Log to specific source
gs.log('Custom log entry', 'MyScriptName');
系统属性
// Get property
var value = gs.getProperty('glide.ui.session_timeout');
var valueWithDefault = gs.getProperty('custom.setting', 'default_value');
// Set property (requires admin)
gs.setProperty('custom.setting', 'new_value');
会话和请求
// Session data
gs.getSession().putClientData('key', 'value');
var data = gs.getSession().getClientData('key');
// URL parameters (in UI scripts)
gs.getUrlParameter('sysparm_record');
// Language
gs.getLanguage(); // e.g., 'en'
其他
// Generate GUID
var guid = gs.generateGUID();
// Nil/empty check
gs.nil(''); // true
gs.nil(null); // true
gs.nil(false); // false (has value)
// Get table label
gs.getTableLabel('incident'); // 'Incident'
// Check table exists
gs.tableExists('incident'); // true
// Get current scope
gs.getCurrentScopeName(); // 'global' or scope name
// Print (deprecated, use gs.info)
gs.print('message'); // Logs to system log
GlideUser API
GlideUser 提供当前用户信息。
var user = gs.getUser();
// User identification
user.getID(); // sys_id
user.getName(); // username
user.getDisplayName(); // full name
user.getEmail(); // email address
user.getFirstName(); // first name
user.getLastName(); // last name
user.getLocation(); // location sys_id
user.getDepartmentID(); // department sys_id
user.getCompanyID(); // company sys_id
user.getManagerID(); // manager sys_id
// Role checking
user.hasRole('admin'); // true/false
user.hasRoleInGroup('itil', groupId); // true/false
user.hasRoleExactly('admin'); // exact match, not elevated
user.getRoles(); // array of roles
// Preference
user.getPreference('timezone');
user.savePreference('custom.pref', 'value');
// Delegation (impersonation)
user.isMemberOf(groupId); // check group membership
GlideSession API
GlideSession 管理用户会话数据。
var session = gs.getSession();
// Session identification
session.getSessionToken(); // session token
session.getClientIP(); // client IP address
session.getCurrentApplicationId(); // current app scope
// Client data (persists during session)
session.putClientData('key', 'value');
var value = session.getClientData('key');
// Language
session.getLanguage(); // 'en', 'de', etc.
// Timezone
session.getTimeZoneName(); // e.g., 'America/Los_Angeles'
// Check if logged in
session.isLoggedIn(); // true/false
// Impersonation
session.isImpersonating(); // true if impersonating
session.getImpersonatingUserName(); // original user
GlideElement 方法
GlideElement 提供对 GlideRecord 字段的字段级访问和操作方法。
获取值
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
// Different value methods
gr.short_description.toString(); // String value
gr.priority.getValue(); // Internal value
gr.priority.getDisplayValue(); // Display value
gr.assigned_to.getRefRecord(); // Get referenced record (GlideRecord)
gr.getDisplayValue(); // Current record display value
gr.assigned_to.getReferenceTable(); // Referenced table name
引用字段
// Get reference value
var assignedTo = gr.assigned_to.getDisplayValue(); // User's name
// Get referenced record
var userGr = gr.assigned_to.getRefRecord();
if (userGr.isValidRecord()) {
gs.info('Assigned to: ' + userGr.email);
}
// Check if reference is empty
if (gr.assigned_to.nil()) {
gs.info('Not assigned');
}
字段状态方法
// Check if field changed (in business rules)
if (gr.state.changes()) {
gs.info('State changed from ' + gr.state.getOldValue() + ' to ' + gr.state.getValue());
}
// Check for changes to specific value
if (gr.state.changesFrom('1')) {
gs.info('State changed from New');
}
if (gr.state.changesTo('6')) {
gs.info('State changed to Resolved');
}
// Get old value
var previousState = gr.state.getOldValue();
字段属性
// Get field metadata
var element = gr.getElement('short_description');
element.getLabel(); // Field label
element.getTableName(); // Table name
element.getED(); // Element descriptor
// Check field properties
element.canRead(); // User can read
element.canWrite(); // User can write
element.hasValue(); // Has non-null value
element.nil(); // Is null/empty
日志字段
// Work notes / comments
gr.work_notes = 'Adding a work note';
gr.comments = 'Adding a customer-visible comment';
// Get journal entries
var journal = gr.work_notes.getJournalEntry(1); // Most recent
var allJournal = gr.work_notes.getJournalEntry(-1); // All entries
GlideEncrypter API
GlideEncrypter 提供加密和哈希工具。
var encrypter = new GlideEncrypter();
// One-way hash (MD5)
var hash = encrypter.encrypt('sensitive_data');
// Two-way encryption (for password fields)
var encrypted = new GlideEncrypter().encrypt('password123');
// Decrypt (if two-way)
var decrypted = new GlideEncrypter().decrypt(encrypted);
密码哈希
// Hash password (one-way)
var hashedPassword = GlideStringUtil.getStringFromStream(
new GlideDigest().md5(password)
);
JSON 和 XML 工具
JSON 操作
// Parse JSON
var jsonString = '{"name":"John","age":30}';
var obj = JSON.parse(jsonString);
gs.info(obj.name); // 'John'
// Stringify object
var data = { name: 'John', age: 30 };
var jsonStr = JSON.stringify(data);
var prettyJson = JSON.stringify(data, null, 2);
// Global JSON utility
var parser = new global.JSON();
var obj = parser.decode(jsonString);
var str = parser.encode(obj);
// In scoped apps
var obj = global.JSON.parse(jsonString);
var str = global.JSON.stringify(data);
GlideRecord 中的 JSON
// Store JSON in field
gr.u_json_data = JSON.stringify({ key: 'value' });
gr.update();
// Retrieve JSON
var data = JSON.parse(gr.u_json_data);
XML 工具
// Create XML document
var xmlDoc = new XMLDocument('<root></root>');
var root = xmlDoc.getDocumentElement();
var child = xmlDoc.createElement('child');
child.setAttribute('attr', 'value');
root.appendChild(child);
var xmlString = xmlDoc.toString();
// Parse XML
var parser = new XMLDocument(xmlString);
var elements = parser.getElementByTagName('child');
XMLHelper
// Convert GlideRecord to XML
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
var xml = new GlideRecordXMLSerializer(gr).serialize();
// Pretty print XML
var prettyXml = new global.XMLPrettyPrint().prettyPrint(xmlString);
常见查询模式
模式 1:高效查询单条记录
// GOOD: Direct lookup
var gr = new GlideRecord('sys_user');
if (gr.get('user_name', 'admin')) {
gs.info('Found: ' + gr.name);
}
// AVOID: Query with single result
var gr = new GlideRecord('sys_user');
gr.addQuery('user_name', 'admin');
gr.setLimit(1);
gr.query();
if (gr.next()) {
gs.info('Found: ' + gr.name);
}
模式 2:检查记录是否存在
// Efficient existence check
function recordExists(table, field, value) {
var gr = new GlideRecord(table);
gr.addQuery(field, value);
gr.setLimit(1);
gr.query();
return gr.hasNext();
}
// Usage
if (recordExists('sys_user', 'user_name', 'admin')) {
gs.info('User exists');
}
模式 3:从引用字段获取字段值
// Get value from referenced record
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
// Direct dot-walk (generates extra query)
var callerEmail = gr.caller_id.email;
// More efficient for multiple fields
var callerGr = gr.caller_id.getRefRecord();
if (callerGr.isValidRecord()) {
var email = callerGr.email;
var phone = callerGr.phone;
var dept = callerGr.department.getDisplayValue();
}
模式 4:批量处理
// Process records in batches to avoid memory issues
function processInBatches(table, query, batchSize, callback) {
var offset = 0;
var hasMore = true;
while (hasMore) {
var gr = new GlideRecord(table);
gr.addEncodedQuery(query);
gr.chooseWindow(offset, offset + batchSize);
gr.query();
var count = 0;
while (gr.next()) {
callback(gr);
count++;
}
hasMore = (count === batchSize);
offset += batchSize;
gs.info('Processed batch: ' + offset);
}
}
// Usage
processInBatches('incident', 'active=true', 1000, function(gr) {
// Process each record
gr.work_notes = 'Batch processed';
gr.update();
});
模式 5:安全设置引用字段
// Resolve reference by name
function getUserSysId(username) {
var gr = new GlideRecord('sys_user');
if (gr.get('user_name', username)) {
return gr.sys_id.toString();
}
return null;
}
// Usage
var gr = new GlideRecord('incident');
gr.initialize();
var userId = getUserSysId('admin');
if (userId) {
gr.setValue('assigned_to', userId);
} else {
gs.warn('User not found: admin');
}
gr.insert();
模式 6:条件更新(仅在发生变化时)
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
var changed = false;
// Only update if different
if (gr.priority != 2) {
gr.priority = 2;
changed = true;
}
if (gr.state != 2) {
gr.state = 2;
changed = true;
}
if (changed) {
gr.update();
gs.info('Record updated');
} else {
gs.info('No changes needed');
}
使用 MCP 工具执行 Glide 操作
使用 MCP 查询
Tool: SN-Query-Table
Parameters:
table_name: incident
query: active=true^priority<=2
fields: sys_id,number,short_description,state,priority,assigned_to
limit: 50
使用 MCP 执行脚本
Tool: SN-Execute-Background-Script
Parameters:
script: |
// Count incidents by priority
var results = {};
var ga = new GlideAggregate('incident');
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.groupBy('priority');
ga.query();
while (ga.next()) {
results['P' + ga.priority] = ga.getAggregate('COUNT');
}
gs.info('Incident counts: ' + JSON.stringify(results));
description: Count active incidents by priority
使用 MCP 创建记录
Tool: SN-Create-Record
Parameters:
table_name: incident
data:
short_description: Created via MCP
description: Detailed description
caller_id: [user_sys_id]
priority: 3
category: inquiry
最佳实践
- 使用 GlideAggregate 统计数量 - 切勿仅为统计记录数量而使用 GlideRecord 遍历记录
- 设置限制 - 始终使用
setLimit(),以防查询失控 - 使用编码查询 - 效率高于多次调用
addQuery() - 避免在循环中进行点遍历 - 在循环外缓存引用查询结果
- 检查权限 - 在操作前使用
canRead()、canWrite() - 使用 setValue 设置引用字段 - 比直接赋值更安全
- 处理空引用 - 访问字段前检查
gr.field.nil() - 记录操作日志 - 在日志中包含可识别的信息,以便调试
- 先测试查询 - 使用 MCP
SN-Query-Table验证查询逻辑
故障排除
查询未返回结果
症状: GlideRecord 查询未返回任何结果 原因:
- 查询语法不正确
- ACL 阻止访问
- 数据与条件不匹配 解决方案:
// Debug query
gs.info('Query: ' + gr.getEncodedQuery());
gs.info('Row count: ' + gr.getRowCount());
引用字段显示 sys_id
症状: 引用字段显示 sys_id 而非名称
原因: 使用了 getValue() 而非 getDisplayValue()
解决方案:
// WRONG
var name = gr.assigned_to.getValue(); // Returns sys_id
// RIGHT
var name = gr.assigned_to.getDisplayValue(); // Returns name
业务规则未检测到更改
症状: gr.field.changes() 意外返回 false
原因: 检查了错误的字段,或比较了错误的值
解决方案:
// Debug changes
gs.info('Field changes: ' + gr.state.changes());
gs.info('Old value: ' + gr.state.getOldValue());
gs.info('New value: ' + gr.state.getValue());
相关技能
admin/script-execution- 后台脚本执行模式admin/batch-operations- 批量记录操作development/business-rules- 业务规则开发(即将推出)development/script-includes- 可复用的脚本模式(即将推出)