<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>question Re: UI Action Needed to Transform Staging Records to Target Table in Community Central forum</title>
    <link>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438981#M5514</link>
    <description>&lt;P&gt;Hey, I had a look at the transform setup. Two things to check on the Script Include side: 1. Right now it’s returning a plain string, but the client script is doing JSON.parse(answer), so the server response should be proper JSON. 2. is getParameter has been overridden in the Script Include and is calling this.getParameter() again which causes recursion and will eventually blow up. We should remove that override and just use the default getParameter from AbstractAjaxProcessor.&lt;/P&gt;</description>
    <pubDate>Thu, 27 Nov 2025 08:06:07 GMT</pubDate>
    <dc:creator>lakshaysharma</dc:creator>
    <dc:date>2025-11-27T08:06:07Z</dc:date>
    <item>
      <title>UI Action Needed to Transform Staging Records to Target Table</title>
      <link>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438848#M5510</link>
      <description>&lt;P&gt;I am trying to build a UI Action that will automatically transform selected records from my custom staging (import set) table into the target &lt;STRONG&gt;em_event&lt;/STRONG&gt; table using a specific Transform Map(already created and works manually).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The requirement is that users should be able to select multiple staging records, click the UI Action, and the system should run the Transform Map programmatically—just like the standard “Transform” button.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I will attach my current &lt;STRONG&gt;UI Action script&lt;/STRONG&gt; and &lt;STRONG&gt;Script Include&lt;/STRONG&gt;.&lt;BR /&gt;Please review and help me correct the code so the transform executes properly.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;UI Action - Create Event&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;function&lt;/SPAN&gt;&lt;SPAN&gt; transformSelected() {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; selected = g_list.getChecked(); &lt;/SPAN&gt;&lt;SPAN&gt;// Now valid because this is client-side&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (!selected) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(&lt;/SPAN&gt;&lt;SPAN&gt;"Please select at least one import set row."&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;false&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; ga = &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;GlideAjax&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"customTransformUtils"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ga.addParam(&lt;/SPAN&gt;&lt;SPAN&gt;"sysparm_name"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"transformRecords"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ga.addParam(&lt;/SPAN&gt;&lt;SPAN&gt;"sysparm_ids"&lt;/SPAN&gt;&lt;SPAN&gt;, selected);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ga.addParam(&lt;/SPAN&gt;&lt;SPAN&gt;"sysparm_transform_map"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"f52a2dd32b193a105f76fb13ed91bf78"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ga.getXMLAnswer(&lt;/SPAN&gt;&lt;SPAN&gt;function&lt;/SPAN&gt;&lt;SPAN&gt;(answer) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (!answer) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alert(&lt;/SPAN&gt;&lt;SPAN&gt;'No response from server.'&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; payload;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; payload = &lt;/SPAN&gt;&lt;SPAN&gt;JSON&lt;/SPAN&gt;&lt;SPAN&gt;.parse(answer);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;catch&lt;/SPAN&gt;&lt;SPAN&gt; (e) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alert(&lt;/SPAN&gt;&lt;SPAN&gt;'Failed to parse response: '&lt;/SPAN&gt;&lt;SPAN&gt; + e.message);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (payload.success) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g_form.addInfoMessage(payload.message || &lt;/SPAN&gt;&lt;SPAN&gt;'Transformation completed.'&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;// If you need to trigger a server-side UI Action after success:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;// gsftSubmit(null, g_form.getFormElement(), '&amp;lt;server_ui_action_sys_id&amp;gt;');&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;alert(payload.message || &lt;/SPAN&gt;&lt;SPAN&gt;'Transformation failed.'&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; } &lt;/SPAN&gt;&lt;SPAN&gt;catch&lt;/SPAN&gt;&lt;SPAN&gt; (err) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g_form.addErrorMessage(&lt;/SPAN&gt;&lt;SPAN&gt;'Unexpected error: '&lt;/SPAN&gt;&lt;SPAN&gt; + err.message);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;---------------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Script Include:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; customTransformUtils = &lt;/SPAN&gt;&lt;SPAN&gt;Class&lt;/SPAN&gt;&lt;SPAN&gt;.create();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;customTransformUtils.prototype = &lt;/SPAN&gt;&lt;SPAN&gt;Object&lt;/SPAN&gt;&lt;SPAN&gt;.extendsObject(&lt;/SPAN&gt;&lt;SPAN&gt;AbstractAjaxProcessor&lt;/SPAN&gt;&lt;SPAN&gt;, {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; transformRecords: &lt;/SPAN&gt;&lt;SPAN&gt;function&lt;/SPAN&gt;&lt;SPAN&gt;() {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.info(&lt;/SPAN&gt;&lt;SPAN&gt;'KS LOG: '&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;// var ids = (gs.getProperty("sysparm_ids") || gs.getUser().getSession().getProperty("sysparm_ids"));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; ids = &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.getParameter(&lt;/SPAN&gt;&lt;SPAN&gt;"sysparm_ids"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; transformMap = &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.getParameter(&lt;/SPAN&gt;&lt;SPAN&gt;"sysparm_transform_map"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.info(&lt;/SPAN&gt;&lt;SPAN&gt;'KS LOG: '&lt;/SPAN&gt;&lt;SPAN&gt; + ids);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gs.info(&lt;/SPAN&gt;&lt;SPAN&gt;'KS LOG: '&lt;/SPAN&gt;&lt;SPAN&gt; + transformMap);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (!ids || !transformMap)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"Missing parameters."&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; arr = ids.split(&lt;/SPAN&gt;&lt;SPAN&gt;','&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; count = &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;for&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; i = &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;; i &amp;lt; arr.length; i++) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; gr = &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;GlideRecord&lt;/SPAN&gt;&lt;SPAN&gt;(current.getTableName ? current.getTableName() : &lt;/SPAN&gt;&lt;SPAN&gt;""&lt;/SPAN&gt;&lt;SPAN&gt;); &lt;/SPAN&gt;&lt;SPAN&gt;// fallback&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gr = &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;GlideRecord&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"u_event_table"&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (!gr.&lt;/SPAN&gt;&lt;SPAN&gt;get&lt;/SPAN&gt;&lt;SPAN&gt;(arr[i]))&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;continue&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (gr.state != &lt;/SPAN&gt;&lt;SPAN&gt;'unprocessed'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;continue&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;var&lt;/SPAN&gt;&lt;SPAN&gt; ts = &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;GlideImportSetTransformer&lt;/SPAN&gt;&lt;SPAN&gt;();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ts.setImportSetTable(gr.getTableName());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ts.setImportSetRun(gr.sys_id);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ts.setMap(transformMap);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ts.transform();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count++;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt; count + &lt;/SPAN&gt;&lt;SPAN&gt;" record(s) transformed successfully."&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; },&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; getParameter: &lt;/SPAN&gt;&lt;SPAN&gt;function&lt;/SPAN&gt;&lt;SPAN&gt;(name) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt; gs.getSession().getProperty(name) || gs.getProperty(name) || &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.getParameter(name);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; },&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; type: &lt;/SPAN&gt;&lt;SPAN&gt;'customTransformUtils'&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;});&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;</description>
      <pubDate>Thu, 27 Nov 2025 04:29:06 GMT</pubDate>
      <guid>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438848#M5510</guid>
      <dc:creator>Karthik152</dc:creator>
      <dc:date>2025-11-27T04:29:06Z</dc:date>
    </item>
    <item>
      <title>Re: UI Action Needed to Transform Staging Records to Target Table</title>
      <link>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438897#M5511</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://www.servicenow.com/community/user/viewprofilepage/user-id/573859"&gt;@Karthik152&lt;/a&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;H3&gt;UI Action (Client Side)&lt;/H3&gt;
&lt;P data-path-to-node="6"&gt;I added the sysparm_table parameter so the script is dynamic and removed the hardcoded table name in the server script.&lt;/P&gt;
&lt;P data-path-to-node="7"&gt;Name: Transform Selected &lt;BR /&gt;Client: True OnClick: transformSelected()&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;function transformSelected() {
    try {
        var selected = g_list.getChecked(); 
        
        if (!selected) {
            alert("Please select at least one import set row.");
            return false;
        } 
        
        // Visual feedback that process is starting
        g_form.addInfoMessage("Starting transformation...");

        var ga = new GlideAjax("customTransformUtils");
        ga.addParam("sysparm_name", "transformRecords");
        ga.addParam("sysparm_ids", selected);
        // Pass the table name dynamically
        ga.addParam("sysparm_table", g_list.getTableName()); 
        ga.addParam("sysparm_transform_map", "f52a2dd32b193a105f76fb13ed91bf78");
        
        ga.getXMLAnswer(function(answer) {
            if (!answer) {
                alert('No response from server.');
                return;
            }

            var payload;
            try {
                payload = JSON.parse(answer);
            } catch (e) {
                alert('Failed to parse response: ' + e.message);
                return;
            }

            if (payload.success) {
                g_form.clearMessages(); // Clear the "Starting..." message
                g_form.addInfoMessage(payload.message);
                
                // Refresh the list to show new statuses
                // Wait 1 second to ensure DB commit is visible
                setTimeout(function(){ 
                    g_list.refresh(); 
                }, 1000);
                
            } else {
                g_form.clearMessages();
                g_form.addErrorMessage(payload.message || 'Transformation failed.');
            }
        });

    } catch (err) {
        g_form.addErrorMessage('Unexpected error: ' + err.message);
    }
}&lt;/LI-CODE&gt;
&lt;P data-path-to-node="7"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Script Include&lt;/H3&gt;
&lt;P data-path-to-node="11"&gt;Name: customTransformUtils &lt;BR /&gt;Client Callable: True&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;var customTransformUtils = Class.create();
customTransformUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    transformRecords: function() {
        var result = {
            success: false,
            message: ''
        };

        try {
            var ids = this.getParameter("sysparm_ids");
            var tableName = this.getParameter("sysparm_table");
            var transformMapID = this.getParameter("sysparm_transform_map");

            if (!ids || !transformMapID || !tableName) {
                result.message = "Missing parameters.";
                return JSON.stringify(result);
            }

            var idArray = ids.split(',');
            var importSetsToProcess = {}; // Object to store unique Import Set IDs
            var rowCount = 0;

            // 1. Prepare the rows
            var grRow = new GlideRecord(tableName);
            for (var i = 0; i &amp;lt; idArray.length; i++) {
                if (grRow.get(idArray[i])) {
                    // Standardize state to 'pending' so the transformer picks it up
                    // Check your specific table field names, usually it's 'import_set_run' or 'sys_import_state'
                    // For standard Import Set Rows, the field is 'sys_import_state'
                    grRow.sys_import_state = 'pending'; 
                    grRow.sys_import_state_comment = 'Manually triggered via UI Action';
                    grRow.update();

                    // Store the parent Import Set ID to process later
                    // We use an object key to ensure we only list each set once
                    importSetsToProcess[grRow.sys_import_set.toString()] = true;
                    rowCount++;
                }
            }

            // 2. Run the Transform on the parent Import Sets
            var setsProcessed = 0;
            for (var setID in importSetsToProcess) {
                var grSet = new GlideRecord('sys_import_set');
                if (grSet.get(setID)) {
                    // This handles the actual transformation logic
                    var transformer = new GlideImportSetTransformer();
                    transformer.setMapID(transformMapID); 
                    transformer.transform(grSet);
                    setsProcessed++;
                }
            }

            result.success = true;
            result.message = rowCount + " row(s) prepared and " + setsProcessed + " Import Set(s) processed.";

        } catch (e) {
            gs.error("Transform Error: " + e.message);
            result.message = "Server error: " + e.message;
        }

        return JSON.stringify(result);
    },

    type: 'customTransformUtils'
});&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="p1"&gt;Happy to help! If this resolved your issue, kindly mark it as the correct answer&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and Helpful and close the thread so others can benefit too.&lt;/P&gt;
&lt;P class="p1"&gt;Warm Regards,&lt;/P&gt;
&lt;P class="p1"&gt;&lt;STRONG&gt;Deepak Sharma&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="p1"&gt;&lt;STRONG&gt;&lt;I&gt;Community Rising Star 2025&lt;/I&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 27 Nov 2025 06:19:51 GMT</pubDate>
      <guid>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438897#M5511</guid>
      <dc:creator>Deepak Shaerma</dc:creator>
      <dc:date>2025-11-27T06:19:51Z</dc:date>
    </item>
    <item>
      <title>Re: UI Action Needed to Transform Staging Records to Target Table</title>
      <link>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438974#M5513</link>
      <description>&lt;P&gt;Thanks for yours efforts, but records are not transferring to target table, If you have any idea to achieve in other way, would be helpful &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 27 Nov 2025 08:01:05 GMT</pubDate>
      <guid>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438974#M5513</guid>
      <dc:creator>Karthik152</dc:creator>
      <dc:date>2025-11-27T08:01:05Z</dc:date>
    </item>
    <item>
      <title>Re: UI Action Needed to Transform Staging Records to Target Table</title>
      <link>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438981#M5514</link>
      <description>&lt;P&gt;Hey, I had a look at the transform setup. Two things to check on the Script Include side: 1. Right now it’s returning a plain string, but the client script is doing JSON.parse(answer), so the server response should be proper JSON. 2. is getParameter has been overridden in the Script Include and is calling this.getParameter() again which causes recursion and will eventually blow up. We should remove that override and just use the default getParameter from AbstractAjaxProcessor.&lt;/P&gt;</description>
      <pubDate>Thu, 27 Nov 2025 08:06:07 GMT</pubDate>
      <guid>https://www.servicenow.com/community/community-central-forum/ui-action-needed-to-transform-staging-records-to-target-table/m-p/3438981#M5514</guid>
      <dc:creator>lakshaysharma</dc:creator>
      <dc:date>2025-11-27T08:06:07Z</dc:date>
    </item>
  </channel>
</rss>

