Search code examples
javascriptjquerygreasemonkeytampermonkeyservicenow

Cannot read property 'value' of null - Greasemonkey Script


Forgive me if I did something dumb in my code, I was never shown how to do javascript/jquery and have been using others code from google searches, I normally just do shell scripting and vb.net. So treat me as a complete beginner.

I am writing a Greasemonkey/Tampermonkey script to replace text in Service-Now. It basically looks for tags such as INC or FNAME within the user notes and then replaces them with the service-now fields with that data. basically it allows to quickly autofill templates with information.

I am running into a problem with the script, Anytime I click the button to fill in the tags I am showing an error in Chrome's console stating

Uncaught TypeError: Cannot read property 'value' of null
at HTMLInputElement.eval (eval at E_c (:3:114), <anonymous>:46:88)
at HTMLInputElement.dispatch (eval at E_c (:3:114), <anonymous>:7:8436)
at HTMLInputElement.r.handle (eval at E_c (:3:114), <anonymous>:7:5139)

From previous posts I made sure to load after the page is finished with // @run-at document-idle

This is my current code, some has been changed to hide where I work.

// ==UserScript==
// @name        Templates Plus v2
// @namespace   https://MYSITE.service-now.com/*
// @include     https://MYSITE.service-now.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// @run-at document-idle
// @version     1
// @grant    GM_addStyle
// ==/UserScript==

(function() {
    var add='';
            var buttonElems;
            switch(i){
                case 0:
                    buttonElems = document.getElementById('label.incident.work_notes');
                    break;
                    case 1:
                    buttonElems = document.getElementById('ni.incident.u_fcr').parentElement;
                    //var buttonElems = document.getElementById('incident.form_header');
                    break;
            }
            add = add + '<input id="tpbutton" type="button" value="Template Plus" class="form_action_button">'; //Template Plus Button
    buttonElems.innerHTML = buttonElems.innerHTML + add;
    $("#tpbutton").click(function(){

    var TemplatePlus_f_AdditionalComments = document.getElementById("incident.comments")[0];
    var TemplatePlus_f_WorknotesComments = document.getElementById("incident.work_notes")[0];
    var TemplatePlus_f_ShortDescription = document.getElementById("incident.short_description")[0];
    var TemplatePlus_f_Resolution = document.getElementById("incident.close_notes")[0];

    var TemplatePlus_FirstName=(" ");
    var TemplatePlus_LastName=(" ");
    var TemplatePlus_MidName=(" ");
    var TemplatePlus_UserID=(" ");
    var TemplatePlus_UserEmail =  document.getElementById("sys_readonly.incident.caller_id.email").value;
    var TemplatePlus_Company =  document.getElementById("sys_display.incident.company").value;
    var TemplatePlus_Location =  document.getElementById("sys_display.incident.location").value;
    var TemplatePlus_Callback =  document.getElementById("incident.u_call_back_number").value;
    var TemplatePlus_Name =  document.getElementById("sys_display.incident.caller_id").value;

    var TemplatePlus_ConfigItem =  document.getElementById("sys_display.incident.cmdb_ci").value;
    var TemplatePlus_INC =  document.getElementById("sys_readonly.incident.number").value;
    var TemplatePlus_ATo =  document.getElementById("sys_display.incident.assigned_to").value;

        TemplatePlus_FirstName.value=TemplatePlus_Name.substr(TemplatePlus_Name.indexOf(',')+1);
        TemplatePlus_LastName.value=TemplatePlus_Name.substr(0,TemplatePlus_Name.indexOf(','));
        TemplatePlus_MidName.value=TemplatePlus_Name.substr(TemplatePlus_Name.indexOf(' ')+1);
        TemplatePlus_UserID.value=TemplatePlus_LastName.substr(0,6)+TemplatePlus_FirstName.substr(0,1)+TemplatePlus_MidName.substr(0,1);

            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<SDESC>",TemplatePlus_f_ShortDescription.value);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<FNAME>",TemplatePlus_FirstName);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<LNAME>",TemplatePlus_LastName);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<UNAME>",TemplatePlus_UserID);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<COMPANY>",TemplatePlus_Company);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<EMAIL>",TemplatePlus_UserEmail);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<CALL>",TemplatePlus_Callback);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<INC>",TemplatePlus_INC);
            TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replaceAll("<CONFIGITEM>",TemplatePlus_ConfigItem);

            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<SDESC>",TemplatePlus_f_ShortDescription.value);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<FNAME>",TemplatePlus_FirstName);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<LNAME>",TemplatePlus_LastName);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<UNAME>",TemplatePlus_UserID);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<COMPANY>",TemplatePlus_Company);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<EMAIL>",TemplatePlus_UserEmail);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<CALL>",TemplatePlus_Callback);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<INC>",TemplatePlus_INC);
            TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replaceAll("<CONFIGITEM>",TemplatePlus_ConfigItem);

            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<SDESC>",TemplatePlus_f_ShortDescription.value);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<FNAME>",TemplatePlus_FirstName);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<LNAME>",TemplatePlus_LastName);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<UNAME>",TemplatePlus_UserID);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<COMPANY>",TemplatePlus_Company);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<EMAIL>",TemplatePlus_UserEmail);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<CALL>",TemplatePlus_Callback);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<INC>",TemplatePlus_INC);
            TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replaceAll("<CONFIGITEM>",TemplatePlus_ConfigItem);

            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<SDESC>",TemplatePlus_f_ShortDescription.value);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<FNAME>",TemplatePlus_FirstName);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<LNAME>",TemplatePlus_LastName);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<UNAME>",TemplatePlus_UserID);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<COMPANY>",TemplatePlus_Company);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<EMAIL>",TemplatePlus_UserEmail);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<CALL>",TemplatePlus_Callback);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<INC>",TemplatePlus_INC);
            TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replaceAll("<CONFIGITEM>",TemplatePlus_ConfigItem);
 });
 })();

Part of this code is based one code a friend wrote at another place I used to work that also used service now, his script worked fine with their pages but would not run at all on ours.

I'm not sure what is giving the issue, the code to read the values of caller/incident number or anything else when clicking the button should not be running till the button click and by that time all the values it retrieves should all be available by that time.


Solution

  • Per the responses above I was able to debug the code and fix the issues as wOxxOm had suggested, It came down to removing [0] from the four variables and then Since not all variables are visible in Service-Now I have to show the variables first before clicking the button. I also had issues getting the button to show so right now i have a temp fix that just shoves it in the top right corner.

    I will post the working code below.

    // ==UserScript==
    // @name        Templates Plus v2
    // @namespace   https://MYSITE.service-now.com/*
    // @include     https://MYSITE.service-now.com/*
    // @require     http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
    // @run-at document-end
    // @version     1
    // @grant    GM_addStyle
    // ==/UserScript==
    (function() {
        var tpbutton = document.createElement("Button");
        tpbutton.innerHTML = "TemplatePlus";
        tpbutton.style = "top:0;right:0;position:absolute;z-index: 10";
        tpbutton.id="tpbutton";
        document.body.appendChild(tpbutton);
            $("#tpbutton").click(function(){
                var TemplatePlus_f_AdditionalComments = document.getElementById("incident.comments");
                var TemplatePlus_f_WorknotesComments = document.getElementById("incident.work_notes");
                var TemplatePlus_f_ShortDescription = document.getElementById("incident.short_description");
                var TemplatePlus_f_Resolution = document.getElementById("incident.close_notes");
    
                var TemplatePlus_FirstName=(" ");
                var TemplatePlus_LastName=(" ");
                var TemplatePlus_Name=(" ");
                var TemplatePlus_UserID=(" ");
                var TemplatePlus_UserEmail=(" ");
                var TemplatePlus_Location=(" ");
                var TemplatePlus_Callback=(" ");
                var TemplatePlus_ConfigItem=(" ");
                var TemplatePlus_INC=(" ");
                var TemplatePlus_ATo=(" ");
    
                TemplatePlus_INC =  document.getElementById("sys_readonly.incident.number").value;
                TemplatePlus_FirstName=document.getElementById("sys_readonly.sys_user.first_name").value;
                TemplatePlus_LastName=document.getElementById("sys_readonly.sys_user.last_name").value;
                TemplatePlus_UserID=document.getElementById("sys_readonly.sys_user.user_name").value;
                TemplatePlus_Name=document.getElementById("sys_readonly.sys_user.name").value;
                TemplatePlus_Callback=document.getElementById("sys_readonly.sys_user.phone").value;
                TemplatePlus_UserEmail=document.getElementById("sys_readonly.sys_user.email").value;
                TemplatePlus_Location=document.getElementById("sys_user.location_label").value;
    
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<SDESC>",TemplatePlus_f_ShortDescription.value);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<FNAME>",TemplatePlus_FirstName);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<LNAME>",TemplatePlus_LastName);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<UNAME>",TemplatePlus_UserID);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<EMAIL>",TemplatePlus_UserEmail);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<CALL>",TemplatePlus_Callback);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<INC>",TemplatePlus_INC);
                TemplatePlus_f_AdditionalComments.value=TemplatePlus_f_AdditionalComments.value.replace("<CONFIGITEM>",TemplatePlus_ConfigItem);
    
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<SDESC>",TemplatePlus_f_ShortDescription.value);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<FNAME>",TemplatePlus_FirstName);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<LNAME>",TemplatePlus_LastName);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<UNAME>",TemplatePlus_UserID);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<EMAIL>",TemplatePlus_UserEmail);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<CALL>",TemplatePlus_Callback);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<INC>",TemplatePlus_INC);
                TemplatePlus_f_WorknotesComments.value=TemplatePlus_f_WorknotesComments.value.replace("<CONFIGITEM>",TemplatePlus_ConfigItem);
    
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<SDESC>",TemplatePlus_f_ShortDescription.value);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<FNAME>",TemplatePlus_FirstName);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<LNAME>",TemplatePlus_LastName);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<UNAME>",TemplatePlus_UserID);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<EMAIL>",TemplatePlus_UserEmail);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<CALL>",TemplatePlus_Callback);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<INC>",TemplatePlus_INC);
                TemplatePlus_f_ShortDescription.value=TemplatePlus_f_ShortDescription.value.replace("<CONFIGITEM>",TemplatePlus_ConfigItem);
    
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<SDESC>",TemplatePlus_f_ShortDescription.value);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<FNAME>",TemplatePlus_FirstName);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<LNAME>",TemplatePlus_LastName);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<UNAME>",TemplatePlus_UserID);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<EMAIL>",TemplatePlus_UserEmail);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<CALL>",TemplatePlus_Callback);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<INC>",TemplatePlus_INC);
                TemplatePlus_f_Resolution.value=TemplatePlus_f_Resolution.value.replace("<CONFIGITEM>",TemplatePlus_ConfigItem);
     });
     })();