Field script use cases

  • Release version: Australia
  • Updated March 12, 2026
  • 4 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Field script use cases

    This guide presents practical examples of field customization scripts within ServiceNow, highlighting common use cases for client and server scripts that enhance form behavior and data handling. These scripts enable automation, validation, UI enhancements, and data manipulation tailored to specific instance needs. Note that these customizations are provided as-is, are not officially supported, and should be thoroughly tested before production deployment.

    Show full answer Show less

    Key Use Cases and Practical Applications

    • Automatically Populate a Field: Use client scripts to auto-fill fields such as the Short Description based on another field’s value (e.g., Subcategory). This improves data consistency and reduces manual entry errors.
    • Disable HTML Tags in Description Fields: Server-side scripts can sanitize fields like Description and Short Description by replacing HTML tags to prevent script injection, enhancing security and data integrity.
    • Trim Leading and Trailing Spaces: Server scripts can clean up text fields (e.g., FirstName and LastName in sysuser) by removing unwanted spaces, ensuring clean and consistent data.
    • Make Field Labels Flash or Bold: Client scripts can visually emphasize specific fields by flashing labels for a set duration or making them bold, aiding user attention during form completion.
    • Make Fields Read-Only Based on Conditions: Client scripts can dynamically set fields such as Incident State, Impact, Urgency, Priority, Configuration Item, and Assigned To as read-only based on form values, preserving data integrity in certain workflow states.
    • Set Current Date/Time in Fields: Use GlideAjax calls in client scripts together with server-side script includes to populate date/time fields with the current timestamp, ensuring accurate time zone handling.
    • Toggle Timer Fields by Field Name: Client scripts can programmatically start or stop timer controls on forms by simulating user interactions, useful for tracking elapsed time within fields.
    • Modify GlideDateTime Field Values: Server scripts utilize the GlideDateTime API to add or subtract intervals (seconds, days, weeks, months, years) to date/time fields, supporting complex date calculations and scheduling logic.

    Practical Benefits for ServiceNow Customers

    • Automate routine field population and validation to improve data quality and user experience.
    • Enhance security by preventing injection of executable HTML or scripts in text fields.
    • Maintain clean and consistent data by trimming unnecessary whitespace.
    • Guide users visually through important fields by customizing label appearance dynamically.
    • Enforce read-only restrictions to protect critical data during specific workflow states.
    • Accurately capture current date/time values in the correct time zone for audit and reporting purposes.
    • Control timer fields programmatically to support time tracking within forms.
    • Perform date/time arithmetic on GlideDateTime fields to automate scheduling and deadline adjustments.

    By leveraging these scripting techniques, ServiceNow customers can tailor their instance forms and data handling to meet unique business requirements while improving efficiency and data governance.

    Common use cases for field customization scripts.

    Warning:
    The customization described here was developed for use in specific instances, and is not supported by Now Support. This method is provided as-is and should be tested thoroughly before implementation. Post all questions and comments regarding this customization to our community forum.

    For more information, see Server API reference.

    Automatically populate a field

    The following example shows how to use a client script to auto-fill a Short Description based on the selected Subcategory.

    In this case, if the table has a record with Subcategory = Password and Short Description = Password Reset. When the user selects the Subcategory of Password on the Incident form, a client script looks up the matching record and sets Short Description equal to Password Reset.

    Client script settings:
    • Type = onChange
    • Table name = incident
    • Field name = Subcategory
    function onChange(control, oldValue, newValue, isLoading){
        if(isLoading){return;}
        var newrec = gel('sys_row');
        //Check if new record
        if (newrec.value == -1) {
            var lookup = new GlideRecord('u_short_desc_lookup');
            lookup.addQuery('u_subcategory', g_form.getValue('subcategory'));
            lookup.query();
            var temp; //temp var - reusable
            if(lookup.next()){
                temp = lookup.u_short_description;
                if(null != temp) {
                    //Set the form value from lookup if there is a lookup value
                    g_form.setValue('short_description', temp);
                } else {
                    g_form.setValue('short_description',"");
                    }
              } else {
                  //If a lookup record does not exist based on lookup.addQuery
                  //Then set to UNDEFINED or NULL depending on type
                  g_form.setValue('short_description',"");
                  }
         }
    }

    Disable HTML tags in descriptions

    This code disables HTML tags in Description and Short Description fields by substituting the tags with non-executing versions.
    doit();
     
    function doit(){ 
     var desc = current.description.toString();
     var shdesc = current.short_description.toString();
     if(desc.indexOf('script>')>-1|| shdesc.indexOf('script>')>-1){
       desc = desc.replace(/<script>/g,"(script)");
       current.description = desc.replace(/<\/script>/g,"(\/script)");
       shdesc = shdesc.replace(/<script>/g,"(script)");
       current.short_description = shdesc.replace(/<\/script>/g,"(\/script)");}
    }

    Eliminate leading and trailing spaces in fields

    This example of the script trims trailing and leading spaces in the FirstName and LastName fields of the sys_user.
    doit();
     
    function doit(){ 
      var now_GR =new GlideRecord('sys_user');
      gr.query();
      while(gr.next()){
        if((gr.first_name.toString().length!= gr.first_name.toString().trim().length)||(gr.last_name.toString().length!= gr.last_name.toString().trim().length)){
         gr.first_name= gr.first_name.toString().trim();
         gr.last_name= gr.last_name.toString().trim();
         gr.autoSysFields(false);
         gr.update();}}
    }

    Make a field label flash

    The following client script example is for the number field on incident. The label flashes for two seconds.
    g_form.flash("incident.number","#FFFACD",0);
    The arguments for the flash method are as follows:
    • tablename.fieldname
    • RGB color or acceptable CSS color like "blue" or "tomato"
    • Integer that determines how long the label flashes:
      • 2 for a 1-second flash
      • 0 for a 2-second flash
      • -2 for a 3-second flash
      • -4 for a 4-second flash
    Note:
    Do not specify this argument if you want the field label colored the specified color.

    Make a field label bold

    This client script makes the label of a particular field bold. In this case, the field is the Short Description on the Incident Table.
    function onLoad(){
      var l = g_form.getLabel('incident.short_description');
      l.style.fontWeight = 'bold';}

    Make fields read-only

    This onLoad client script makes the following fields on the Incident [incident] table read-only:
    • Incident state
    • Impact
    • Urgency
    • Priority
    • Configuration item
    • Assigned to
    The script also removes the magnifying glass for the read-only Reference Fields (Configuration item and Assigned to).
    function onLoad(){
    var incidentState = g_form.getValue('incident_state');
    if( incidentState == '6'|| incidentState == '7'){
       g_form.setReadonly('incident_state',true);
       g_form.setReadonly('impact',true);
       g_form.setReadonly('urgency',true);
       g_form.setReadonly('priority',true);
       g_form.setReadonly('cmdb_ci',true);
       g_form.setReadonly('assigned_to',true);}}

    Set current date/time in field

    You can set date and time values in client scripts and script includes.

    Client script
    You can use the following two lines to set the current date and time in a date/time field. This approach bypasses the problem of getting the value into the proper format and proper time zone.
    var ajax = new GlideAjax('MyDateTimeAjax');
      ajax.addParam('sysparm_name','nowDateTime');
      ajax.getXML(function(){
        g_form.setValue('put your field name here', ajax.getAnswer());});
    For more information on running server-side scripts with the client, refer to GlideAjax.
    System script include
    // Be sure the Glide AJAX enabled option is checked
     
    var MyDateTimeAjax = Class.create();
    MyDateTimeAjax.prototype = Object.extendsObject(AbstractAjaxProcessor,{
      nowDateTime:function(){
        return gs.nowDateTime();}});

    Toggle the timer field by field name

    The following client script toggles the timer field based on a particular field name.
    function toggleTimerByFieldName(fieldName){
     //Step 1: Find the timer object
     //timeObjectName: the timer objects name as it would normally be referenced
     //timeObjectHidden: the hidden input node in the field td
     //timeObjectParent: the parent td node containing the field and it's constituent nodes
     //timeObjectFields: anchor tag with onclick to stop timer
     
     var timeObjectName = fieldName;
     var timeObjectHidden = gel(timeObjectName);
     
     //Step 2: simulate click stop button
     var timeObjectParent;
     var timeObjectFields;
     
     //verify that we got the correct object
     if(timeObjectHidden.type=="hidden"){
     
        //Get Parent td node
        timeObjectParent = timeObjectHidden.parentNode;
     
        //Get input fields
        timeObjectFields = timeObjectParent.getElementsByTagName("input");
     
        //simulate click of stop button
        var timerTestString ="paused";
        var timerImg;
     
        //loop through input objects looking for the pause timer object
        for(var elIt=0; elIt < timeObjectFields.length; elIt++){
          if(timeObjectFields[elIt].id.match(timerTestString)){
            if(timeObjectFields[elIt].value=="false"){
              timeObjectFields[elIt].value="true";
              timerImg = timeObjectParent.getElementsByTagName("img")[0];
              timerImg.src="images/timer_start.gifx";}
          elseif(timeObjectFields[elIt].value=="true"){
              timeObjectFields[elIt].value="false";
              timerImg = timeObjectParent.getElementsByTagName("img")[0];
              timerImg.src="images/timer_stop.gifx";}}}}}

    Modify GlideDateTime field values

    The following server-side script example shows how to modify values using the GlideDateTime API. The same concept also applies to the GlideDate object.
    Note:
    The following script is only intended for global applications.
    //You first need a GlideDateTime object
    //this can be from instantiating a new object "var gdt = new GlideDateTime()"
    //or getting the object from a GlideDateTime field
    //getting the field value (for example: var gdt = current.start_date) only returns the string value, not the object
    //to get the object use var gdt = current.start_date.getGlideObject(); (GlideElement)
    //now gdt is a GlideDateTime object
    var gdt = current.start_date.getGlideObject();
     
    //All methods can use negative values to subtract intervals
     
    //add 1 hour (60 mins * 60 secs)
    gdt.addSeconds(3600);
     
    //add 1 day
    gdt.addDaysLocalTime(1);
     
    //subtract 1 day
    gdt.addDaysLocalTime(-1);
     
    //add 3 weeks
    gdt.addWeeksLocalTime(3);
     
    //subtract 6 months
    gdt.addMonthsLocalTime(-6);
     
    //add 1 year, representing the date and time using the UTC timezone instead of the local user's timezone.
    gdt.addYearsUTC(1);
     
    //set the value of the GlideDateTime object to the current session timezone/format
    GlideSession.get().setTimeZoneName('US/Eastern');
    gdt.setDisplayValue('2018-2-28 00:00:00');
    gs.info('In ' + GlideSession.get().getTimeZoneName() + ": " + gdt.getDisplayValue());
    See also: