Create New Inbound action on data source table(sys_data_source) and use below code.
(function runAction(/*GlideRecord*/ current, /*GlideRecord*/ event, /*EmailWrapper*/ email, /*ScopedEmailLogger*/ logger, /*EmailClassifier*/ classifier) { var importSetTableName = "cmdb_table"; var transformMapIDs = "b2b180aa87cefd10965a0d0e0334333"; //Use a comma to specify multiple transform maps var applicatonScope = "Global"; // Create the datasource record current.name = "File import from: " + email.from; //Feel free to rename this as appropriate current.import_set_table_name = importSetTableName; current.file_retrieval_method = "Attachment"; current.type = "File"; //current.format = "Excel"; // For Excel Files current.format = "CSV"; // For CSV Files current.header_row = 1; current.sheet_number = 1; current.sys_package.setDisplayValue(applicatonScope); current.sys_scope.setDisplayValue(applicatonScope); var dataSourceID = current.insert(); /* * Schedule Load of Attachment * * This inbound email action will generate an import data source, however the attachment isn't copied to the data source until * after the insert of the record. Scheduling the import to happen 30 seconds later so that attachment has time to be copied. */ new global.EmailFileImportUtils().scheduleImport(dataSourceID, transformMapIDs); })(current, event, email, logger, classifier);
Create Script Include: EmailFileImportUtils
var EmailFileImportUtils = Class.create(); EmailFileImportUtils.prototype = { initialize: function() { }, scheduleImport: function(dataSourceID, transformMapIDs) { /* * Create scheduled job to process import * * The inbound email action will generate an import data source, however the attachment isn't copied to the data source until * after the insert of the record. The code below will create a scheduled job to process the import 30 seconds later * so that attachment has time to be copied to the data source from the email. */ var schRec = new GlideRecord("sys_trigger"); schRec.name = "Load Data Source: " + dataSourceID; schRec.trigger_type = 0; // Run Once schRec.script = "new global.EmailFileImportUtils().loadImportSet('" + dataSourceID + "', '" + transformMapIDs + "')"; var nextAction = new GlideDateTime(); nextAction.addSeconds(30); // 30 seconds should be enough time however this can be changed. schRec.next_action = nextAction; schRec.insert(); }, loadImportSet: function(dataSourceID, transformMapIDs) { // Get Datasource Record var dataSource = new GlideRecord("sys_data_source"); dataSource.get(dataSourceID); // Process data source file var loader = new GlideImportSetLoader(); var importSetRec = loader.getImportSetGr(dataSource); var ranload = loader.loadImportSetTable(importSetRec, dataSource); importSetRec.state = "loaded"; importSetRec.update(); // Transform import set var transformWorker = new GlideImportSetTransformerWorker(importSetRec.sys_id, transformMapIDs); transformWorker.setBackground(true); transformWorker.start(); }, type: 'EmailFileImportUtils' };
How to import Excel/CSV data using inbound action ServiceNow
Working Code Asked question October 26, 2023