Author: Rohan Aditya
Date:8th January 2026
Key points covered:
CSV uploads via Catalog Items are common for bulk onboarding and integrations. Instead of manually parsing CSV files, this solution automates the entire process.
When a Catalog Item is submitted with a CSV attachment, a Flow is triggered that processes the file and returns a structured JSON object.
(function execute(inputs, outputs) {
var ritmSysId = inputs.ritmSysId;
var jsonResultList = [];
var dataSourceSysId = gs.getProperty('kap.read.csv.data.source.sys.id');
var att = new GlideSysAttachment();
var attachment = att.getAttachments('sys_data_source', dataSourceSysId);
if (!attachment || !attachment.hasNext()) {
outputs.json_data = JSON.stringify({ "directAppsUserList": [] });
return;
}
var grDataSource = new GlideRecord('sys_data_source');
if (grDataSource.get(dataSourceSysId)) {
var loader = new GlideImportSetLoader();
var importSetRec = loader.getImportSetGr(grDataSource);
loader.loadImportSetTable(importSetRec, grDataSource);
importSetRec.state = "loaded";
importSetRec.update();
var importTableName = importSetRec.getValue("table_name");
var rowGR = new GlideRecord(importTableName);
rowGR.addQuery("sys_import_set", importSetRec.getUniqueValue());
rowGR.query();
while (rowGR.next()) {
rowGR.u_ritm = ritmSysId;
rowGR.update();
jsonResultList.push({
"directAppsUserEmail": rowGR.getValue('u_email'),
"directAppsUserRetailerName": rowGR.getValue('u_retailer_name')
.replaceAll(' ', '')
.toLowerCase(),
"directAppsUserSupplierNumber": rowGR.getValue('u_supplier_number')
});
}
}
outputs.json_data = JSON.stringify({
"directAppsUserList": jsonResultList
});
})(inputs, outputs);
{
"directAppsUserList": [
{
"directAppsUserEmail": "user@example.com",
"directAppsUserRetailerName": "retailername",
"directAppsUserSupplierNumber": "SUP123"
}
],
}