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.

Import Comments and Work Notes

wipeout630
Mega Expert

I am migrating Incidents from a different ticketing system into Service now.   As part of this migration, I have an excel file full of comments and work notes that need to be added to the migrated Incidents.   Some of the questions that I can't find answers to:

  • When setting up the transform map, which table do the work notes/comments map to?
  • How do I associate the work note/comment in the excel file to the Incident?
  • Is it possible to set who & when the work note/comment was created?
    • I have configured the Incident import so that the date created reflects correctly, I'd like the work notes/comments to also reflect the date/time they were created and who created it.
6 REPLIES 6

jamesmcwhinney
Giga Guru

If you dont mind using c# and webservices, here is one way to do it:


How to import legacy incidents, comments and worknotes via c# & web services



Cheers,


- James


jmoral2
Tera Contributor

Hi all,

 

As explained here:  https://www.servicenow.com/community/developer-articles/how-to-migrate-import-comments-and-work-note...

 

I need to import work notes and comments from an Excel so I use a TM and mapped sys_created and sys_updated, an used this onBefore Transform Script to prevent overwriting them. It's important that sys_updated and sys_created times are before the journal times, otherwise they might not be created correctly. Also created Journals in chronological order, which is the reverse order

 

(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {
	target.autoSysFields(false);
})(source, map, log, target);

 

An onAfter Transform Script

 

(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {
	var oJournalUtils = new JournalUtils();
    oJournalUtils.createAllJournals(source.u_comments_and_work_notes, target);
})(source, map, log, target);

 

And the class

 

var JournalUtils = Class.create();
JournalUtils.prototype = {
    initialize: function() {},

    gdtToCheckpoint: function(gdt) {
        try {
            var n = gdt.getNumericValue();
            return n.toString(16) + "0000001";
        } catch (oErrMsg) {
            new GSLog().logError("Script Include: JournalUtils; Function: gdtToCheckpoint. Error Message received from Try/Catch: " + oErrMsg);
        }
    },

    createJournal: function(sTable, sRecordID, sJournalType, sText, sUserName, oGDTdate) {
        try {
            var oGRUser = new GlideRecord("sys_user");
            oGRUser.get("name", sUserName);

            if (oGRUser && oGRUser.getUniqueValue()) {
                sUserName = oGRUser.user_name;
            }

            var oGRTarget = new GlideRecord(sTable);
            oGRTarget.get(sRecordID);

            var count;

            if (oGRTarget.getValue("sys_mod_count"))
                count = parseInt(oGRTarget.getValue("sys_mod_count"));
            else
                count = 0;

            // Create a new sys audit record for the update
            var auditGR = new GlideRecord("sys_audit");
            var journGR = new GlideRecord("sys_journal_field");
            auditGR.initialize();

            auditGR.documentkey = oGRTarget.getUniqueValue();
            auditGR.fieldname = sJournalType;
            auditGR.newvalue = sText;
            auditGR.oldvalue = "JOURNAL FIELD ADDITION";
            auditGR.reason = "";
            auditGR.record_checkpoint = count;
            auditGR.tablename = sTable;
            // Set the audit user information information
            auditGR.sys_created_by = sUserName;


            auditGR.user = sUserName;

            auditGR.sys_created_on = oGDTdate;
            auditGR.internal_checkpoint = this.gdtToCheckpoint(oGDTdate);
            auditGR.autoSysFields(false);
            auditGR.insert();

            journGR.initialize();
            journGR.name = sTable;
            journGR.element_id = oGRTarget.getUniqueValue();
            var id = journGR.insert();

            var newJournGR = new GlideRecord("sys_journal_field");
            newJournGR.get(id);
            newJournGR.sys_created_by = auditGR.sys_created_by;
            newJournGR.element = sJournalType;
            newJournGR.value = sText;
            newJournGR.update();

            count = count + 1;

            oGRTarget.sys_mod_count = count;
            oGRTarget.autoSysFields(false);
            oGRTarget.update();
        } catch (oErrMsg) {
            new GSLog().logError("Script Include: JournalUtils; Function: createJournal. Error Message received from Try/Catch: " + oErrMsg);
        }
    },

    createAllJournals: function(sWorkNotes, oTarget) {
        try {
            var re = /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.{1,100}(\(Work notes\)|\(Customer Communication\))/g;
            gs.log("createAllJournals sWorkNotes " + sWorkNotes);
            var aMatchDate = sWorkNotes.match(re);
            var aMatchText = [];
            var sDate, sName, sType;
            var i;
            for (i = 0; i < aMatchDate.length; i++) {
                if (i < aMatchDate.length - 1)
                    aMatchText[i] = sWorkNotes.substring(sWorkNotes.indexOf(aMatchDate[i]) + aMatchDate[i].length, sWorkNotes.indexOf(aMatchDate[i + 1]));
                else
                    aMatchText[i] = sWorkNotes.substring(sWorkNotes.indexOf(aMatchDate[i]) + aMatchDate[i].length, sWorkNotes.length);
            }

            for (i = aMatchDate.length; i >= 0; i--) {

                sType = aMatchDate[i].indexOf("(Work notes)") > 0 ? "work_notes" : "comments";
                sDate = aMatchDate[i].substring(0, 19);

                if (sType == "work_notes")
                    sName = aMatchDate[i].substring(22, aMatchDate[i].indexOf("(Work notes)") - 1);
                else
                    sName = aMatchDate[i].substring(22, aMatchDate[i].indexOf("(Customer Communication)") - 1);

                sName = sName.substring(0, sName.indexOf(" ")) + "," + sName.substring(sName.indexOf(" "), sName.length);
				gs.log("createAllJournals createJournal " + oTarget.sys_class_name +" , "+ oTarget.getUniqueValue() +" , "+  sType +" , "+ aMatchText[i] +" , "+  sName +" , "+  new GlideDateTime(sDate));
                this.createJournal(oTarget.sys_class_name, oTarget.getUniqueValue(), sType, aMatchText[i], sName, new GlideDateTime(sDate));
            }
        } catch (oErrMsg) {
            new GSLog().logError("Script Include: JournalUtils; Function: createAllJournals. Error Message received from Try/Catch: " + oErrMsg);
        }
    },
    type: 'JournalUtils'
};

 

 

Happy Coding!

Javier Moral