mcpField
G
glide-api-reference

glide-api-reference

github.com/happy-technologies-llc开发4142 次安装2 天前更新
代码仓库

关于 glide-api-reference

glide-api-reference 是供 ServiceNow 开发者编写服务器端 JavaScript 时查阅的 API 技能。内容涵盖记录、聚合、日期时间、系统上下文及相关数据操作的 Glide API。

主要功能

  1. 01GlideRecord 查询与记录操作
  2. 02GlideAggregate 计算与分组
  3. 03日期和时长处理
  4. 04GlideSystem 与用户上下文方法
  5. 05JSON 和 XML 工具

适用场景

  1. 01编写 ServiceNow Business Rules
  2. 02构建 Script Includes 和 Scheduled Jobs
  3. 03查询与更新 ServiceNow 记录
  4. 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 - 可复用的脚本模式(即将推出)

参考资料

评论

支持 Markdown