Get a first look at what's coming. The Developer Passport Australia Release Preview kicks off March 12. Dive in! 

Script Action not executing when triggered by custom event (mass update on custom table)

ronro2
Tera Contributor

Hey guys! 

I’m implementing a feature that allows our superusers to enable restricted read access (u_restricted_read_access = true) on historical tasks stored in a custom base table (x_vgll_rail_task).

“Historical” simply means all existing records, regardless of state.

We already have functionality that removes restricted read access, and that part works fine using a GlideRecord loop directly in a Record Producer.

Now we want to enable restricted read access, but run the update asynchronously in the background, so that heavy mass-updates don’t block the user from doing other things in the platform. 

To achieve this, I created:
  • A custom event: x_vgll_rail.add_restricted_access
  • A Script Action triggered by the event
  • Updated logic in the Record Producer to:
    • Count matching records
    • Send the event if there are records to update
However, the Script Action never executes.

It seems the event is queued, but the Script Action does not run — I get no logs from inside it, and no records are updated.

I already have this old example script in the Record Producer which does what I will do, but the other way around: 
else if(action == 'remove_restricted_access') {

	var taskGR = new GlideRecord('x_vgll_rail_task');
	taskGR.addQuery('assignment_group', producer.assignment_group);
	taskGR.addQuery('u_restricted_read_access', true);
	taskGR.query();
	while(taskGR.next()){
		taskGR.u_restricted_read_access = false;
		taskGR.setWorkflow(false);
		taskGR.update();
	}

	gs.addInfoMessage('Begränsad läsåtkomst för historiska ärenden med utförargrupp ' + producer.name + ' är borttagen.');
	current.setAbortAction(true);
    producer.redirect = "x_vgll_rail_user_organisation_list.do";
}​



This is the script in the record producer that I've added below the the example above: 

else if (action == 'add_restricted_access') {

    // 1. Kontrollera hur många ärenden som skulle påverkas
    // Vi vill bara uppdatera ärenden där u_restricted_read_access är false (dvs inte redan begränsad)
    var taskGR2 = new GlideRecord('x_vgll_rail_task');
    taskGR2.addQuery('assignment_group', producer.assignment_group);
    taskGR2.addQuery('u_restricted_read_access', false); // bara de som ännu INTE är begränsade
    taskGR2.query();

    // getRowCount() kan användas efter query() för att få antal träffar
    var count = taskGR2.getRowCount();

    if (count == 0) {
        // Om inga records finns att uppdatera – ge tydligt meddelande till användaren
        gs.addInfoMessage('Det finns inga historiska ärenden för utförargruppen ' + producer.name + ' som kan få begränsad läsåtkomst.');
        
        // Avbryt ytterligare behandling av producer, men behåll meddelandet
        current.setAbortAction(true);
        producer.redirect = "x_vgll_rail_user_organisation_list.do";
    } else {
        // Om det finns ärenden, skicka ett event som Script Action tar hand om i bakgrunden

        // Skicka med:
        // parm1: assignment_group (sys_id)
        // parm2: gruppens namn (visningsnamn)
        gs.eventQueue(
            'x_vgll_rail.add_restricted_access', // event name
            current,                             // current record (RP-kontexten, behövs mest för spårning)
            producer.assignment_group,           // parm1: sys_id på utförargruppen
            producer.name                        // parm2: gruppens namn (för loggning / debug)
        );

        //Ge ett meddelande till användaren om att processen körs i bakgrunden
        gs.addInfoMessage('Begränsad läsåtkomst kommer att läggas till för ' + count + ' historiska ärenden med utförargrupp ' + producer.name + '. Processen körs i bakgrunden.');

        // Vi avsluta producer och gör redirect
        current.setAbortAction(true);
        producer.redirect = "x_vgll_rail_user_organisation_list.do";
    }
}​



Here is the Script Action script: 

(function executeAction(current, event, gs) {
    // Häämta parametrar från eventet
    // parm1: assignment_group sys_id
    // parm2: gruppens namn (för loggning/debug)
    var assignmentGroupSysId = event.parm1;
    var assignmentGroupName = event.parm2;

    // Säkerhetskoll: om det inte finns någon assignment group angiven, avbryt
    if (!assignmentGroupSysId) {
        gs.log('x_vgll_rail.add_restricted_access: Saknar assignment_group (parm1). Avbryter.', 'x_vgll_rail');
        return;
    }

    // Skapa en GlideRecord mot bastabellen x_vgll_rail_task
    var taskGR = new GlideRecord('x_vgll_rail_task');

    // 3. Filtrera på:
    //    - Utförargruppen (assignment_group)
    //    - Endast ärenden där u_restricted_read_access är false (ej redan begränsade)
    taskGR.addQuery('assignment_group', assignmentGroupSysId);
    taskGR.addQuery('u_restricted_read_access', false);

    // Prestandaoptimering:
    // Vi vill inte trigga business rules / workflow eller uppdatera sys_fields för massuppdateringen
    taskGR.setWorkflow(false);      
    taskGR.autoSysFields(false); 

    //Sätt fältvärdet som ska uppdateras
    //Detta kommer användas tillsammans med updateMultiple()
    taskGR.setValue('u_restricted_read_access', true);

    //Kör query för att sätta upp vilka records som matchar
    taskGR.query();


    if (count == 0) {
        // Inga records att uppdatera – logga detta för spårbarhet.
        // Användaren har redan fått meddelande via Record Producer, så här räcker loggning.
        gs.log('x_vgll_rail.add_restricted_access: Inga ärenden att uppdatera för grupp: ' + assignmentGroupName + ' (' + assignmentGroupSysId + ').', 'x_vgll_rail');
        return;
    }

    //Uppdatera alla matchande records i en enda databasoperation
    //updateMultiple() använder de villkor (query) och setValue() vi satt ovan.
    taskGR.updateMultiple();

    //Logga resultatet för framtida felsökning
    gs.log('x_vgll_rail.add_restricted_access: Satt u_restricted_read_access = true för ' +
        count + ' ärenden med utförargrupp ' + assignmentGroupName + ' (' + assignmentGroupSysId + ').', 'x_vgll_rail');

})(current, event, gs);​
 

Here comes a screenshot that shows the configuration for the event: 

Skärmbild 2026-03-12 131748.png
 

 Here comes a screenshot for the configuration of the script action: 

Skärmbild 2026-03-12 131434.png


So what is could be the issue for why the code in the Script Action is not running? Can you see something I cannot? 

Thanks in advance! 



1 REPLY 1

Ankur Bawiskar
Tera Patron

@ronro2 

if event gets processed then only script action will run.

Try to use after insert BR on your table and trigger the event

OR

Why not use Async Insert and let it run in background asynchronously?

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader