Example script that queries the Opportunity table

  • Release version: Zurich
  • Updated July 31, 2025
  • 2 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Example Script That Queries the Opportunity Table

    This example script demonstrates how to query the Salesforce Opportunity table within ServiceNow using three custom spoke actions:Get All Opportunities,Get Opportunities for Account Id, andGet Opportunity Details. The script is structured into three main parts: selecting the appropriate action and preparing inputs, calling the action, and processing the action outputs. This enables ServiceNow customers to integrate Salesforce opportunity data efficiently into remote tables.

    Show full answer Show less

    Selecting a Spoke Action and Preparing Inputs

    The script determines which Salesforce spoke action to invoke based on parameters passed in the vquery argument:

    • If a Salesforce opportunity record ID is provided, it calls Get Opportunity Details.
    • If a Salesforce account ID is provided, it calls Get Opportunities for Account Id. If the account ID is undefined, the script logs an info message and stops execution.
    • If no specific parameters are provided, it defaults to Get All Opportunities.

    This conditional logic ensures that the script targets the correct data retrieval method and handles missing or undefined Salesforce account relationships gracefully.

    Calling the Spoke Action

    The script uses snfd.FlowAPI.executeAction to invoke the selected Salesforce spoke action dynamically by name, passing the prepared input parameters. The outputs from this call contain the requested opportunity data or error information.

    Processing the Action Outputs

    After receiving the outputs, the script checks if the call was successful. If an error occurred, it throws an exception which is caught in the outer try-catch block for error handling.

    When successful, it iterates over the returned opportunity records and maps key Salesforce Opportunity fields (such as Amount, CloseDate, Name, Probability, AccountId, StageName, Type, and the record Id) into the columns of the ServiceNow remote table. Importantly, the Salesforce opportunity record Id is assigned to the remote table’s sysid field, ensuring proper integration with lists and forms and enabling future queries by this ID.

    If the action returns an informational message, the script displays it to the user.

    Error Handling and Execution Structure

    The entire logic is wrapped inside a try-catch block to capture and report errors clearly to system administrators using ServiceNow’s messaging system. This robust error handling supports troubleshooting and operational reliability when integrating Salesforce data.

    Practical Benefits for ServiceNow Customers

    • Provides a reusable, clear pattern to query Salesforce Opportunity data using ServiceNow spokes.
    • Enables integration of Salesforce opportunities into ServiceNow remote tables with accurate field mappings.
    • Handles missing data scenarios gracefully with informative messages.
    • Supports robust error handling and user feedback for smoother operational experience.

    This example script queries the opportunity table using the Get All Opportunities, Get Opportunities for Account Id, and Get Opportunity Details custom actions.

    The example script consists of three distinct parts:
    1. The first part selects the correct custom action and prepares inputs for it.
    2. The second part makes a call to the action.
    3. The third part processes the outputs of the action.

    Selecting a spoke action and preparing the inputs

    In this section of the script, select one of the three custom actions that you are prepared to get opportunities from the Salesforce application:
    • Get All Opportunities
    • Get Opportunities for Account Id
    • Get Opportunity Details
    You can decide which action to call based on the parameters included in the v_query function argument.
    /****** Choose action and prepare action inputs *****/
    var action = null;
    var inputs = {};
    
    // look up opportunity by salesforce record id
    if (v_query.isGet()) {
    
      action = "get_opportunity_details";
      inputs.salesforce_opportunity_record_id = v_query.getSysId();
          
    
    // look up opportunities by salesforce account id
    } else if (v_query.getParameter("u_sf_account_id")) {
    
        if (v_query.getParameter("u_sf_account_id") == "undefined") {
          gs.addInfoMessage(“Opportunities cannot be retrieved because “ +
                            “this “Account does not have associated “    +
                            “Salesforce Account. Please contact System “ +
                             “Administrator.");
          return;
    
        } else {
          action = "get_opportunities_for_account_id";
          inputs.salesforce_account_id = v_query.getParameter("u_sf_account_id");
        }
    
    // look up all opportunities
    } else {
      action = "get_all_opportunities";
    }
    

    Note that this script configures an information message if the Salesforce account is undefined when it’s required by the action. The undefined value comes from the relationship that is described in Using a related list to create the connection between the Customer Account and the Salesforce Opportunities.

    When the Salesforce account is undefined, there’s nothing to query for in this case and the function returns without calling the spoke action.

    Calling the spoke action

    In this section of the script, call the action using the names of the Salesforce spoke and the selected action and store the outputs of the call.

    /***** Call action *****/
    var outputs =
            sn_fd.FlowAPI.executeAction("sn_salesforce_spok." + action, inputs);
    

    Processing the action output

    In this section of the script, process the outputs starting with the check for errors.

    /***** Process action outputs *****/
    if (outputs.status != "Success") {
    throw new Error(outputs.error_message);
    }
    

    If the query doesn’t return any errors, the script must process the returned records and add them as rows into the remote table. Map the Salesforce Opportunity fields into the remote table columns.

    var opportunities = outputs.opportunities.data;
    
     for (var i = 0; i < opportunities.length; i++) {
      var opportunity = opportunities[i];
      v_table.addRow({
        "u_sf_amount": opportunity.Amount,
        "u_sf_close_date": opportunity.CloseDate,
        "u_sf_name": opportunity.Name,
        "u_sf_probability": opportunity.Probability + "%",
        "u_sf_account_id": opportunity.AccountId,
        "u_sf_stage": opportunity.StageName,
        “u_sf_type": opportunity.Type,
        "sys_id": opportunity.Id,
      });
    }
    

    Note that the Salesforce opportunity record Id is assigned to the remote table sys_id. This verifies that lists and forms for the remote table function properly and that we are able to extract the record Id using v_query.getSysId() the next time that the remote table script is invoked.

    Then display the information message if it was passed by the query.

    if (outputs.info_message) {
      gs.addInfoMessage(outputs.info_message);
    }
    

    Putting the remote table script sections together

    The three sections of the script are included in the try-catch block to provide for error handling.

    (function executeQuery(v_table, v_query) {
    
      try {
    
        // place code here from: <Selecting a spoke action and preparing the inputs>
    
        // place code here from: <Calling the spoke action>
    
        // place code here from: <Processing the action output>  	
            
      } catch (error) {
        gs.addErrorMessage("Error retrieving  Salesforce Opportunities. “ +
                           “Please contact System Administrator.");
        gs.addErrorMessage("System Error: " + error.message);
      }
    
    })(v_table, v_query);