Skip to Content

GlideAjax Utility with Multiple Functions

A comprehensive Script Include demonstrating multiple client-callable functions in a single utility class.

#glideajax #ajax #client-callable #utilities #validation #search #multi-function

Script Code

JavaScript
1var AjaxUtils = Class.create();
2AjaxUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
3
4  /**
5   * Validate if a value exists in a table field
6   * Useful for duplicate checking before submission
7   */
8  checkDuplicate: function() {
9    var table = this.getParameter('sysparm_table');
10    var field = this.getParameter('sysparm_field');
11    var value = this.getParameter('sysparm_value');
12    var excludeId = this.getParameter('sysparm_exclude_id');  // For updates
13
14    if (!table || !field || !value) {
15      return JSON.stringify({error: 'Missing required parameters'});
16    }
17
18    var gr = new GlideRecord(table);
19    gr.addQuery(field, value);
20
21    // Exclude current record when checking for update
22    if (excludeId) {
23      gr.addQuery('sys_id', '!=', excludeId);
24    }
25
26    gr.query();
27
28    var result = {
29      isDuplicate: gr.hasNext(),
30      count: gr.getRowCount()
31    };
32
33    return JSON.stringify(result);
34  },
35
36  /**
37   * Get formatted user information
38   */
39  getUserInfo: function() {
40    var userId = this.getParameter('sysparm_user_id') || gs.getUserID();
41
42    var grUser = new GlideRecord('sys_user');
43    if (!grUser.get(userId)) {
44      return JSON.stringify({error: 'User not found'});
45    }
46
47    var userInfo = {
48      sys_id: grUser.sys_id.toString(),
49      name: grUser.name.toString(),
50      email: grUser.email.toString(),
51      phone: grUser.phone.toString(),
52      title: grUser.title.toString(),
53      department: grUser.department.getDisplayValue(),
54      location: grUser.location.getDisplayValue(),
55      manager: grUser.manager.getDisplayValue(),
56      manager_email: grUser.manager.email.toString(),
57      vip: grUser.vip.toString() === 'true',
58      active: grUser.active.toString() === 'true'
59    };
60
61    return JSON.stringify(userInfo);
62  },
63
64  /**
65   * Get available assignment groups for a category
66   */
67  getAssignmentGroups: function() {
68    var category = this.getParameter('sysparm_category');
69    var activeOnly = this.getParameter('sysparm_active_only') === 'true';
70
71    var groups = [];
72    var grGroup = new GlideRecord('sys_user_group');
73
74    if (category) {
75      grGroup.addQuery('u_category', category);
76    }
77
78    if (activeOnly) {
79      grGroup.addQuery('active', 'true');
80    }
81
82    grGroup.orderBy('name');
83    grGroup.query();
84
85    while (grGroup.next()) {
86      groups.push({
87        sys_id: grGroup.sys_id.toString(),
88        name: grGroup.name.toString(),
89        description: grGroup.description.toString(),
90        manager: grGroup.manager.getDisplayValue(),
91        email: grGroup.email.toString()
92      });
93    }
94
95    return JSON.stringify({groups: groups, count: groups.length});
96  },
97
98  /**
99   * Calculate business days between two dates
100   */
101  calculateBusinessDays: function() {
102    var startDate = this.getParameter('sysparm_start_date');
103    var endDate = this.getParameter('sysparm_end_date');
104    var scheduleId = this.getParameter('sysparm_schedule') || '8-5 weekdays excluding holidays';
105
106    if (!startDate || !endDate) {
107      return JSON.stringify({error: 'Start and end dates required'});
108    }
109
110    var schedule = new GlideSchedule(scheduleId);
111    var start = new GlideDateTime(startDate);
112    var end = new GlideDateTime(endDate);
113
114    var duration = schedule.duration(start, end);
115    var businessDays = duration.getByFormat('dd');
116    var businessHours = duration.getByFormat('HH');
117
118    return JSON.stringify({
119      businessDays: businessDays,
120      businessHours: businessHours,
121      totalSeconds: duration.getNumericValue()
122    });
123  },
124
125  /**
126   * Validate field value against business rules
127   */
128  validateField: function() {
129    var table = this.getParameter('sysparm_table');
130    var field = this.getParameter('sysparm_field');
131    var value = this.getParameter('sysparm_value');
132
133    var result = {
134      valid: true,
135      message: '',
136      suggestions: []
137    };
138
139    // Example validations
140    if (field === 'email') {
141      var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
142      if (!emailRegex.test(value)) {
143        result.valid = false;
144        result.message = 'Invalid email format';
145      }
146    }
147
148    if (field === 'phone') {
149      // Remove non-numeric characters
150      var digitsOnly = value.replace(/\D/g, '');
151      if (digitsOnly.length < 10) {
152        result.valid = false;
153        result.message = 'Phone number must have at least 10 digits';
154      }
155    }
156
157    if (field === 'short_description') {
158      if (value.length < 10) {
159        result.valid = false;
160        result.message = 'Description too short (minimum 10 characters)';
161      }
162
163      // Check for common words to suggest better descriptions
164      var vagueWords = ['issue', 'problem', 'error', 'help'];
165      var hasVagueWords = vagueWords.some(function(word) {
166        return value.toLowerCase().indexOf(word) !== -1;
167      });
168
169      if (hasVagueWords) {
170        result.suggestions.push('Be more specific about the issue');
171      }
172    }
173
174    return JSON.stringify(result);
175  },
176
177  /**
178   * Search records with fuzzy matching
179   */
180  searchRecords: function() {
181    var table = this.getParameter('sysparm_table');
182    var searchTerm = this.getParameter('sysparm_search_term');
183    var searchFields = this.getParameter('sysparm_fields');  // Comma-separated
184    var maxResults = parseInt(this.getParameter('sysparm_max_results') || '10');
185
186    if (!table || !searchTerm) {
187      return JSON.stringify({error: 'Table and search term required'});
188    }
189
190    var fields = searchFields ? searchFields.split(',') : ['name', 'number'];
191    var results = [];
192
193    var gr = new GlideRecord(table);
194
195    // Build OR query for multiple fields
196    var qc = gr.addQuery(fields[0], 'CONTAINS', searchTerm);
197    for (var i = 1; i < fields.length; i++) {
198      qc.addOrCondition(fields[i], 'CONTAINS', searchTerm);
199    }
200
201    gr.setLimit(maxResults);
202    gr.query();
203
204    while (gr.next()) {
205      var record = {
206        sys_id: gr.sys_id.toString(),
207        display_value: gr.getDisplayValue()
208      };
209
210      // Add requested fields
211      fields.forEach(function(field) {
212        if (gr.isValidField(field)) {
213          record[field] = gr.getValue(field);
214        }
215      });
216
217      results.push(record);
218    }
219
220    return JSON.stringify({
221      results: results,
222      count: results.length,
223      searchTerm: searchTerm
224    });
225  },
226
227  type: 'AjaxUtils'
228});

How to Use

1. Create a new Script Include named 'AjaxUtils' 2. Check 'Client callable' checkbox 3. Set 'Extends' to 'AbstractAjaxProcessor' 4. Copy the code above 5. Call from Client Scripts using GlideAjax: var ga = new GlideAjax('AjaxUtils'); ga.addParam('sysparm_name', 'checkDuplicate'); ga.addParam('sysparm_table', 'incident'); ga.addParam('sysparm_field', 'number'); ga.addParam('sysparm_value', 'INC0001'); ga.getXMLAnswer(callback);

Explore More Scripts

Browse our complete library of ServiceNow scripts

View All Scripts