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.

GlideAjax Script Include and Client Script code to restrict access of fields not working.

prabhmeet
Giga Expert

I have a catalog item where I have a reference field to sys_user table (Requested for).

In Some fields on the form only the following users can enter values - requested for's manager, requested for manager's manager, User access administration group. To other users the fields should be visible but they cannot enter values.

 

I have written a Script Include and Client Script for this but it is not working. I am new to ServiceNow and not too good with coding. Can someone please point out my mistakes? 

Please someone help me correct the code?

Script Include -

var RestrictAccessToUpdateFields = Class.create();
RestrictAccessToUpdateFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getAccess: function() {

var obj ={};
obj.retvalue ='';
obj.mm = '';
obj.grp = '';
var a = this.getParameter('sysparm_user_id');
var manager = new GlideRecord('sys_user');
manager.addQuery('sys_id', a);
manager.query();
if(manager.next()){
obj.retvalue = manager.manager.sys_id;
obj.mm = manager.manager.manager.sys_id;
obj.grp =gs.getUser().isMemberOf('User Access Administration');

}
return JSON.stringify(obj);
},

type: 'RestrictAccessToUpdateFields'
});

 

Onchange CLient Script

var id = g_form.getValue('requested_for');//newValue

var ga = new GlideAjax('RestrictAccessToUpdateFields');
var a = g_user.getUser();

ga.addParam('sysparm_name','getAccess');
ga.addParam('sysparm_user_id',id);
ga.getXML(CallBack);

function CallBack(response)
{
var answer = response.responseXML.documentElement.getAttribute("answer");
var returneddata = JSON.parse(answer);
if(returneddata.retvalue == g_user.userID || returneddata.mm == g_user.userID || returneddata.grp == true ){
g_form.setReadOnly('updated_first_name', false);
g_form.setReadOnly('updated_last_name', false);
}
else{
g_form.setReadOnly('updated_first_name', true);
g_form.setReadOnly('updated_last_name', true);
}
}
}

1 ACCEPTED SOLUTION

dvp
Mega Sage

 getUser method is not available in  g_user and also in script inlcude your code returns the objects instead of sys id of managers

Try the below script

Script Include -

var RestrictAccessToUpdateFields = Class.create();
RestrictAccessToUpdateFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getAccess: function() {
        
        var obj ={};
            obj.retvalue ='';
            obj.mm = '';
            obj.grp = '';
            var a = this.getParameter('sysparm_user_id');
            var manager = new GlideRecord('sys_user');
            manager.addQuery('sys_id', a);
            manager.query();
            if(manager.next()){
                obj.retvalue = manager.manager.sys_id.toString();
                obj.mm = manager.manager.manager.sys_id.toString();
                obj.grp =gs.getUser().isMemberOf('User Access Administration');
                
            }
            return JSON.stringify(obj);
        },
        
        type: 'RestrictAccessToUpdateFields'
    });

 

Onchange CLient Script

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    
    var id = g_form.getValue('requested_for');//newValue
    
    var ga = new GlideAjax('RestrictAccessToUpdateFields');    
    ga.addParam('sysparm_name','getAccess');
    ga.addParam('sysparm_user_id',id);
    ga.getXML(CallBack);
    
    function CallBack(response)
    {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        var returneddata = JSON.parse(answer);
        
        if(returneddata.retvalue == g_user.userID || returneddata.mm == g_user.userID || returneddata.grp == true ){
            g_form.setReadOnly('updated_first_name', false);
            g_form.setReadOnly('updated_last_name', false);
        }
        else{
            
            g_form.setReadOnly('updated_first_name', true);
            g_form.setReadOnly('updated_last_name', true);
        }
    }
    
}

 

 

View solution in original post

14 REPLIES 14

Hi Ram,

I tried the below code( just for the group restriction) but it is not working -

Display BR-

(function executeRule(current, previous /*null when async*/) {
function userIsMember() {
g_scratchpad.isMember = gs.getUser().isMemberOf('User Access Administration');
}

})(current, previous);

Client Script - 

function onLoad() {
var myVariablesAreReadOnly = false;
if (!g_scratchpad.isMember) { 
myVariablesAreReadOnly = true;

}
g_form.setReadOnly("variables.updated_first_name",myVariablesAreReadOnly);
g_form.setReadOnly("variables.updated_last_name",myVariablesAreReadOnly);
}

dvp
Mega Sage

 getUser method is not available in  g_user and also in script inlcude your code returns the objects instead of sys id of managers

Try the below script

Script Include -

var RestrictAccessToUpdateFields = Class.create();
RestrictAccessToUpdateFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getAccess: function() {
        
        var obj ={};
            obj.retvalue ='';
            obj.mm = '';
            obj.grp = '';
            var a = this.getParameter('sysparm_user_id');
            var manager = new GlideRecord('sys_user');
            manager.addQuery('sys_id', a);
            manager.query();
            if(manager.next()){
                obj.retvalue = manager.manager.sys_id.toString();
                obj.mm = manager.manager.manager.sys_id.toString();
                obj.grp =gs.getUser().isMemberOf('User Access Administration');
                
            }
            return JSON.stringify(obj);
        },
        
        type: 'RestrictAccessToUpdateFields'
    });

 

Onchange CLient Script

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    
    var id = g_form.getValue('requested_for');//newValue
    
    var ga = new GlideAjax('RestrictAccessToUpdateFields');    
    ga.addParam('sysparm_name','getAccess');
    ga.addParam('sysparm_user_id',id);
    ga.getXML(CallBack);
    
    function CallBack(response)
    {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        var returneddata = JSON.parse(answer);
        
        if(returneddata.retvalue == g_user.userID || returneddata.mm == g_user.userID || returneddata.grp == true ){
            g_form.setReadOnly('updated_first_name', false);
            g_form.setReadOnly('updated_last_name', false);
        }
        else{
            
            g_form.setReadOnly('updated_first_name', true);
            g_form.setReadOnly('updated_last_name', true);
        }
    }
    
}

 

 

Hi dvp,

Thanks a lot. It worked now.

I am hoping you can help me with one of my other question, there also I have written a Glide ajax script.

It is fetching user's details from sys_user table depending on which user's name is entered on the form. Though it is working, there is a problem that first name of some users is not coming up.

Question - Get User's values from sys_user table on basis of user selected.

Can you share the script that you have currently

Hi dvp,

So It is returning first name for many other users I randomly checked, only for users - Abraham Lincoln, Prabhmeet Kaur, System Administrator it return every other detail except first name.

 

here's the script - 

script include-

var GetUserDetailsAjax = Class.create();
GetUserDetailsAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getInfo: function(){


var obj={};
obj.first_name='';
obj.last_name='';
obj.email='';
obj.vendor_name='';
obj.location='';
obj.department='';
obj.beeline_assignment_number='';
obj.manager='';
obj.contracter_end_date='';
obj.phone_number='';
// obj.street='';
var id=this.getParameter('sysparm_user_id');
var gr= new GlideRecord('sys_user');
if(gr.get(id)){

if(gr.location!='')
obj.first_name = gr.first_name.toString();
obj.last_name = gr.last_name.toString();
obj.email=gr.email.toString();
obj.vendor_name =gr.u_vendor_name.toString();
obj.location=gr.location.name.toString();
obj.department=gr.department.name.toString();
obj.beeline_assignment_number = gr.department.id.toString();
obj.manager=gr.manager.getDisplayValue().toString();
obj.contracter_end_date=gr.u_end_date.toString();
// obj.zip=gr.zip.toString();
//obj.street=gr.street.toString();
obj.phone_number=gr.mobile_phone.toString();


//here you will get all the required fields from sys_user that you want to show on your form.
}


return JSON.stringify(obj);


},

type: 'GetUserDetailsAjax'
});

 

Onchange client script

function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}

var id = g_form.getValue('requested_for');//newValue


var ga = new GlideAjax('GetUserDetailsAjax');


ga.addParam('sysparm_name','getInfo');


ga.addParam('sysparm_user_id',id);


ga.getXML(CallBack);

 

function CallBack(response)
{


var answer = response.responseXML.documentElement.getAttribute("answer");


var user=JSON.parse(answer);
g_form.setValue('first_name',user.first_name);
g_form.setValue('last_name', user.last_name);
g_form.setValue('email_address', user.email);
g_form.setValue('vendor_name', user.u_vendor_name);
g_form.setValue('location_number', user.location);
g_form.setValue('department', user.department);
g_form.setValue('current_assignment_number', user.beeline_assignment_number);
g_form.setValue('manager', user.manager);
g_form.setValue('end_date', user.contracter_end_date);
g_form.setValue('phone_number', user.phone_number);



}