0

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