Can tag data be retrieved with ticket data via API?

pauline_handel
Giga Guru

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

1 ACCEPTED SOLUTION

Hitoshi Ozawa
Giga Sage
Giga Sage

Scripted REST API like below.

I've create a Query Parameter "table" to accept name of table to query.

find_real_file.png

(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

find_real_file.png

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>

View solution in original post

4 REPLIES 4

sachin_namjoshi
Kilo Patron
Kilo Patron

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

Hitoshi Ozawa
Giga Sage
Giga Sage

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.

https://docs.servicenow.com/bundle/rome-application-development/page/integrate/custom-web-services/c...

Hitoshi Ozawa
Giga Sage
Giga Sage

Scripted REST API like below.

I've create a Query Parameter "table" to accept name of table to query.

find_real_file.png

(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

find_real_file.png

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>

Thanks Hitoshi,

I will discuss this option with my Business user.

Cheers,

Pauline