- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-23-2022 07:54 AM
One of our users is trying to retrieve tag data from sn_grc_issue records. Is it possible to make a single REST call which makes the tags children of the event JSON record?
Thanks,
Pauline
Solved! Go to Solution.
- Labels:
-
Integrations

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-23-2022 06:35 PM
Scripted REST API like below.
I've create a Query Parameter "table" to accept name of table to query.
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var queryParams = request.queryParams;
var tableName = queryParams.table.toString();
var grTable = new GlideRecord(tableName);
grTable.query();
var arr = [];
while (grTable.next()) {
var record = {};
var fields = grTable.getFields();
for (var i = 0; i < fields.size(); i++) {
var glideElement = fields.get(i);
if (glideElement.hasValue()) {
record[glideElement.getName()] = glideElement.toString();
}
}
var tagArray = getTags(tableName, grTable.getValue('sys_id'));
if (tagArray.length > 0) {
record['tag'] = tagArray;
}
arr.push(record);
}
return arr;
function getTags(tableName, sys_id) {
var tagArray = [];
var grLabel = new GlideRecord('label_entry');
grLabel.addQuery('table', tableName);
grLabel.addQuery('table_key', sys_id);
grLabel.query();
while (grLabel.next()) {
tagArray.push(grLabel.label.name.toString());
}
return tagArray;
}
})(request, response);
Execution sample. (from web browser)
uri: (I'm querying a sample table I created)
https://<instance name>.service-now.com/api/<namespace>/tablewithtags?table=sample_table
result:
<response>
<result>
<sys_updated_by>admin</sys_updated_by>
<u_user_id>001</u_user_id>
<u_user_name>name1</u_user_name>
<sys_created_on>2022-05-23 08:26:13</sys_created_on>
<sys_mod_count>1</sys_mod_count>
<u_user_status>available</u_user_status>
<sys_updated_on>2022-05-23 08:27:01</sys_updated_on>
<tag>sampleTag2</tag>
<tag>sampleTag1</tag>
<sys_created_by>admin</sys_created_by>
</result>
<result>
<sys_updated_by>admin</sys_updated_by>
<u_user_id>003</u_user_id>
<u_user_name>name3</u_user_name>
<sys_created_on>2022-05-23 08:26:46</sys_created_on>
<sys_mod_count>0</sys_mod_count>
<u_user_status>stop</u_user_status>
<sys_updated_on>2022-05-23 08:26:46</sys_updated_on>
<sys_created_by>admin</sys_created_by>
</result>
</response>

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-23-2022 08:50 AM
Tags related to records are stored in label_entry table.
You can use OOB Table REST API to query label_entry records related to sn_grc_issue table.
Regards,
Sachin

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-23-2022 02:59 PM
Hi Pauline,
Tags are saved in a different table and would require a different table API call.
The requirement as written in the question is to retrieve it using a single API call. This can be achieved by creating a Scripted REST API.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-23-2022 06:35 PM
Scripted REST API like below.
I've create a Query Parameter "table" to accept name of table to query.
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {
var queryParams = request.queryParams;
var tableName = queryParams.table.toString();
var grTable = new GlideRecord(tableName);
grTable.query();
var arr = [];
while (grTable.next()) {
var record = {};
var fields = grTable.getFields();
for (var i = 0; i < fields.size(); i++) {
var glideElement = fields.get(i);
if (glideElement.hasValue()) {
record[glideElement.getName()] = glideElement.toString();
}
}
var tagArray = getTags(tableName, grTable.getValue('sys_id'));
if (tagArray.length > 0) {
record['tag'] = tagArray;
}
arr.push(record);
}
return arr;
function getTags(tableName, sys_id) {
var tagArray = [];
var grLabel = new GlideRecord('label_entry');
grLabel.addQuery('table', tableName);
grLabel.addQuery('table_key', sys_id);
grLabel.query();
while (grLabel.next()) {
tagArray.push(grLabel.label.name.toString());
}
return tagArray;
}
})(request, response);
Execution sample. (from web browser)
uri: (I'm querying a sample table I created)
https://<instance name>.service-now.com/api/<namespace>/tablewithtags?table=sample_table
result:
<response>
<result>
<sys_updated_by>admin</sys_updated_by>
<u_user_id>001</u_user_id>
<u_user_name>name1</u_user_name>
<sys_created_on>2022-05-23 08:26:13</sys_created_on>
<sys_mod_count>1</sys_mod_count>
<u_user_status>available</u_user_status>
<sys_updated_on>2022-05-23 08:27:01</sys_updated_on>
<tag>sampleTag2</tag>
<tag>sampleTag1</tag>
<sys_created_by>admin</sys_created_by>
</result>
<result>
<sys_updated_by>admin</sys_updated_by>
<u_user_id>003</u_user_id>
<u_user_name>name3</u_user_name>
<sys_created_on>2022-05-23 08:26:46</sys_created_on>
<sys_mod_count>0</sys_mod_count>
<u_user_status>stop</u_user_status>
<sys_updated_on>2022-05-23 08:26:46</sys_updated_on>
<sys_created_by>admin</sys_created_by>
</result>
</response>
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-24-2022 07:21 AM
Thanks Hitoshi,
I will discuss this option with my Business user.
Cheers,
Pauline