Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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