I want to get the ritm varaibles and then from the varaibles i need to get the referenced varaibles
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-06-2025 01:10 AM
I want to get the ritm variables and then from the variables i need to get the referenced variables and then i need all the fields from the referenced record , but this script i giving only the variables from the RITM. It has to be for mu;ltiple RITMS. there is also a script include given below
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var ritmNumbers = request.getHeader('ritm');
var responseObj = {};
if (!ritmNumbers) {
response.setStatus(417);
return {
error: "Missing 'ritm' header. Please supply comma-separated RITM numbers."
};
}
ritmNumbers = ritmNumbers.split(',').map(function(item) {
return item.trim();
});
var ritmGR = new GlideRecord('sc_req_item');
for (var i = 0; i < ritmNumbers.length; i++) {
var ritmNumber = ritmNumbers[i];
if (!ritmGR.get('number', ritmNumber)) {
response.setStatus(417);
response.setHeader(ritmNumber, 'Unable to find RITM: ' + ritmNumber);
continue;
}
var resultObj = {
number: ritmNumber
};
var variables = ritmGR.variables;
var catItemSysId = ritmGR.getValue('cat_item');
for (var varName in variables) {
try {
var varValue = variables[varName];
if (!varValue || !varValue.getValue()) continue; // skip empty
var displayValue = varValue.getDisplayValue();
var internalValue = varValue.getValue();
// Skip variables with empty values
if (!internalValue) continue;
var isReference = false;
var refTable = "";
// Try to detect reference type and ref table from variable definition
var itemVar = new GlideRecord('item_option_new');
itemVar.addQuery('name', varName);
itemVar.addQuery('ORcat_item', catItemSysId);
// Include variable sets
var vsJoin = itemVar.addJoinQuery('item_option_new_set', 'sys_id', 'variable');
vsJoin.addJoinQuery('io_set_item', 'variable_set', 'sys_id')
.addCondition('catalog_item', catItemSysId);
itemVar.query();
if (itemVar.next()) {
var type = itemVar.getValue('type');
refTable = itemVar.getValue('reference');
isReference = type === 'reference';
}
// If reference field, expand the referenced record
if (isReference && refTable && internalValue) {
var refGR = new GlideRecord(refTable);
if (refGR.get(internalValue)) {
var refFields = {};
var fields = refGR.getFields();
var iterator = fields.iterator();
while (iterator.hasNext()) {
var field = iterator.next().getName();
if (field !== 'sys_id') {
refFields[field] = refGR.getDisplayValue(field);
}
}
resultObj[varName] = refFields;
} else {
resultObj[varName] = displayValue; // fallback
}
} else {
resultObj[varName] = displayValue;
}
} catch (err) {
gs.error('⚠️ Error processing variable [' + varName + '] in ' + ritmNumber + ': ' + err.message);
}
}
responseObj[ritmNumber] = resultObj;
}
return {
result: responseObj
};
})(request, response);
Script include:
stringOperation = Class.create();
stringOperation.prototype = {
initialize: function() {},
trimAndSplit(inputString, token) {
var i, inputArr;
var resultArray = [];
//Give token a default value if not specified
token = (!token) ? ',' : token;
if (!inputString || typeof inputString !== 'string') {
gs.logError(
'trimAndSplit function received an invalid argument in the first argument. The argument received was: ' +
inputString +
'. The only acceptable first argument for trimAndSplit, is a string.');
return [];
}
if (inputString.indexOf(token) < 0) {
//Return the original string in an array, because no instances of the token were found.
return [inputString];
}
//convert the input string to an array, splitting on the provided token (usually ',')
inputArr = inputString.split(token);
for (i = 0; i < inputArr.length; i++) {
//Trim each element in the split string array, then push it to the return array.
resultArray.push(inputArr[i].trim());
}
//return the trimmed and split array.
return resultArray;
},
type: 'stringOperation'
};
3 REPLIES 3
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-06-2025 01:54 AM
update as this, ensure to pass RITM numbers in header as comma separated values like below
ritm: RITM0001234,RITM0001256,RITM0001278
Scripted REST API
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var ritmNumbers = request.getHeader('ritm');
var responseObj = {};
if (!ritmNumbers) {
response.setStatus(417);
return {
error: "Missing 'ritm' header. Please supply comma-separated RITM numbers."
};
}
// Using your Script Include for splitting, or just simple split+trim here
var ritmNumArray = ritmNumbers.split(',').map(function(item) {
return item.trim();
});
// Create GlideRecord outside loop
var ritmGR = new GlideRecord('sc_req_item');
// Loop through each RITM number
ritmNumArray.forEach(function(ritmNumber) {
// Always initialize/reset before get() to avoid data carry-over
ritmGR.initialize();
if (!ritmGR.get('number', ritmNumber)) {
response.setStatus(417);
response.setHeader(ritmNumber, 'Unable to find RITM: ' + ritmNumber);
return; // skip to next RITM
}
var resultObj = {
number: ritmNumber
};
var variables = ritmGR.variables;
var catItemSysId = ritmGR.getValue('cat_item');
// Iterate over all variables on the RITM
for (var varName in variables) {
try {
var varValue = variables[varName];
if (!varValue || !varValue.getValue()) continue; // skip empty/null
var displayValue = varValue.getDisplayValue();
var internalValue = varValue.getValue();
if (!internalValue) continue;
// Determine if variable is a reference type and get referenced table
var itemVarGR = new GlideRecord('item_option_new');
itemVarGR.addQuery('name', varName);
itemVarGR.addQuery('cat_item', catItemSysId);
itemVarGR.query();
var isReference = false;
var refTable = "";
if (itemVarGR.next()) {
var type = itemVarGR.getValue('type');
refTable = itemVarGR.getValue('reference');
isReference = (type === 'reference');
}
if (isReference && refTable && internalValue) {
// Fetch referenced record fields
var refGR = new GlideRecord(refTable);
if (refGR.get(internalValue)) {
var refFields = {};
var fields = refGR.getFields();
var iterator = fields.iterator();
while (iterator.hasNext()) {
var field = iterator.next().getName();
if (field !== 'sys_id') {
refFields[field] = refGR.getDisplayValue(field);
}
}
resultObj[varName] = refFields;
} else {
// Reference record not found, fallback to display value
resultObj[varName] = displayValue;
}
} else {
// Not a reference type, just assign the display value
resultObj[varName] = displayValue;
}
} catch (e) {
gs.error('Error processing variable [' + varName + '] in ' + ritmNumber + ': ' + e.message);
}
}
responseObj[ritmNumber] = resultObj;
});
return {
result: responseObj
};
})(request, response);
If my response helped please mark it correct and close the thread so that it benefits future readers.
Regards,
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-07-2025 03:34 AM
Iam getting the variables but not the referenced record fields.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-07-2025 03:36 AM
For multiple RTM case.