Sample scripts
Summarize
Summary of Sample Scripts
This collection of sample scripts provides practical examples for ServiceNow customers using CPQ scripting to handle common tasks such as determining CPU core counts, formatting text output, managing product rules, looping through configurations, handling arrays and maps, and working with Salesforce multi-select picklists. These scripts serve as actionable templates to customize and extend CPQ configurations effectively.
Show less
Key Features
- CPU Core Count Determination: Scripts calculate the number of 64, 32, 16-core CPUs needed based on estimated compute capacity and allowed configurations, helping optimize resource allocation.
- Text Field Formatting: Generates formatted strings summarizing CPU core counts, useful for display or reporting purposes within the configuration.
- Product Rule Scripts: Demonstrates how to dynamically populate product lists from database lookups, set quantities, define BOM types (Sales or Manufacturing), and assign hierarchy levels and notes. Includes use of loops to replicate product entries multiple times based on configuration parameters.
- Array and Map Handling: Shows how to query product information using arrays, build maps for quick lookup, and verify conditions across multiple products, supporting complex product validations and summaries.
- Multi-Select Picklist Handling: Illustrates how to convert Salesforce multi-select picklist values into arrays and assign them to corresponding twinned fields in CPQ during On Configure/Reconfigure enrichment events.
- String Concatenation: Provides a method to concatenate multiple field values into a single string, facilitating customized display or processing.
- Conditional Logic Using Contains: Emulates a CONTAINS function using JavaScript’s
includes()method to execute different logic based on whether a field contains specific substrings.
Practical Benefits
- Enables customers to efficiently calculate and allocate computing resources in configurations.
- Facilitates dynamic product list creation and management within CPQ rules, improving automation and accuracy.
- Supports advanced scripting techniques such as looping and conditional checks to handle complex configuration scenarios.
- Provides guidance for integrating Salesforce multi-select picklist data with CPQ fields, ensuring data consistency between systems.
- Helps customers implement common scripting tasks with ready-to-use code snippets, accelerating development and reducing errors.
These sample scripts are essential references for ServiceNow CPQ customers looking to customize their product configurations, automate rule processing, and improve integration with Salesforce data.
View a selection of commonly requested sample scripts.
This article shows some commonly requested sample scripts.
Sample number field determination:
var count64 = 0;
var count32 = 0;
var perCoreProcessing = 40; //assuming 8 processors with 5 TFlops compute
var cpu64Processing = 64*perCoreProcessing;
var cpu32Processing = 32*perCoreProcessing;
var cpu16Processing = 16*perCoreProcessing;
var remainingCompute = cfg.estPeakOps;
if(cfg.allowCPU64 == true) { //64 core allowed so divide by that
count64 = remainingCompute/cpu64Processing;
remainingCompute = remainingCompute%cpu64Processing;
}
if(cfg.allowCPU32 == true) {
count32 = remainingCompute/cpu32Processing;
remainingCompute = remainingCompute%cpu32Processing;
}
return count32;
Sample text field determination:
var retStr = "";
retStr = retStr + "64 vCPUs: " + Math.round(cfg.cpu64Count);
retStr = retStr + "\\n32 vCPUs: " + Math.round(cfg.cpu32Count);
retStr = retStr + "\\n16 vCPUs: " + Math.round(cfg.cpu16Count);
retStr = retStr + "\\n8 vCPUs: " + Math.round(cfg.cpu8Count);
retStr = retStr + "\\n1 vCPUs: " + Math.round(cfg.cpu1Count);
return retStr;
Sample product rule script:
//Base Product
var baseProductP2ID = "BP_ID";
var inputs = {"g2BaseProduct": cfg.g2BaseProduct};
var resultSet = lookup("SELECT Product2Id, ProductName FROM Dummytable WHERE ProductCode = :g2BaseProduct", inputs);
for (var row of resultSet) {
ProductList.id = row.get("Product2Id");
ProductList.quantity = cfg.orderQty;
ProductList.bomType = "SALES";
ProductList.uom = "EA";
ProductList.level = 1;
ProductList.notes = row.get("ProductName");
ProductList.parentProduct = "01t5f000000uJgoAAE"; //parent product identifier. In this case top product being configured from SFDC
baseProductP2ID = row.get("Product2Id");
ProductList.uniqueIdentifier = baseProductP2ID; //Parent
...SF ProductID; not req'd if this has no other children
ProductList.next();
break;
}
Sample product rule script with for loop:
//var timesReplicate = cfg.numberOfComputeClusters; //this doesn't work yet.. If it does, we will replicate that many times easier
var timesReplicate = [1,1,1,1,1,1,1,1,1,1]; //dummy 10 times loop based on 10x boolean true, Double loop for 100
for (var parentStep of timesReplicate) {
for (var step of timesReplicate) {
if(cfg.cpu16Count > 0) {
ProductList.id = "01t5f000000v50CAAQ";
ProductList.quantity=Math.round(cfg.cpu16Count);
ProductList.notes="Provisioning " + Math.round(cfg.cpu16Count) + " number of 16 core vCPUs";
if(cfg.sendDirectlyToProvisioning == true) {
ProductList.bomType = "Manufacturing";
ProductList.level = 2;
} else {
ProductList.bomType = "SALES";
}
ProductList.next();
}
if(cfg.cpu8Count > 0) {
ProductList.id = "01t5f000000v50DAAQ";
ProductList.quantity=Math.round(cfg.cpu8Count);
ProductList.notes="Provisioning " + Math.round(cfg.cpu8Count) + " number of 8 core vCPUs";
if(cfg.sendDirectlyToProvisioning == true) {
ProductList.bomType = "Manufacturing";
ProductList.level = 2;
} else {
ProductList.bomType = "SALES";
}
ProductList.next();
}
if(cfg.cpu32Count > 0) {
ProductList.id = "01t5f000000v50BAAQ";
ProductList.quantity=Math.round(cfg.cpu32Count);
ProductList.notes="Provisioning " + Math.round(cfg.cpu32Count) + " number of 32 core vCPUs";
if(cfg.sendDirectlyToProvisioning == true) {
ProductList.bomType = "Manufacturing";
ProductList.level = 2;
} else {
ProductList.bomType = "SALES";
}
ProductList.next();
}
if(cfg.cpu64Count > 0) {
ProductList.id = "01t5f000000v50JAAQ";
ProductList.quantity=Math.round(cfg.cpu64Count);
ProductList.notes="Provisioning " + Math.round(cfg.cpu64Count) + " number of 64 core vCPUs";
if(cfg.sendDirectlyToProvisioning == true) {
ProductList.bomType = "Manufacturing";
ProductList.level = 2;
} else {
ProductList.bomType = "SALES";
}
ProductList.next();
}
if(cfg.cpu1Count > 0) {
ProductList.id = "01t5f000000v50SAAQ";
ProductList.quantity=Math.round(cfg.cpu1Count);
ProductList.notes="Provisioning " + Math.round(cfg.cpu1Count) + " number of 1 core vCPUs";
if(cfg.sendDirectlyToProvisioning == true) {
ProductList.bomType = "Manufacturing";
ProductList.level = 2;
} else {
ProductList.bomType = "SALES";
}
ProductList.next();
}
}
}
console.log("Added line items 100 times");
return ProductList;
Sample array and map functions:
var productidArr = ["test123", "chtest123"];
var inputs = {"productids": productidArr};
var resultSet = lookup("SELECT uniqueidentifier, bomtype FROM bominformation WHERE productid IN (:productids)", inputs);
var prodTypeMap = new Map();
for (var row of resultSet) {
prodTypeMap.set(row.get("uniqueidentifier"), row.get("bomtype"));
}
var itemTypeManuf = productidArr.every((value) => {return prodTypeMap.get(value) != "Manufacturing";});
if (isGood == false) {
return "Sales type item found";
}
var summary = "";
productidArr.forEach((item, index) => {summary += index + " " + item + ". ";});
return summary;
How to pull multi-select picklist values from SFDC to twinned multi-select picklist field in CPQ in the On Configure/Reconfigure enrichment:
let x = (cfgRequest.yourTwinnedLogikField.value).split(";");
cfgRequest.yourTwinnedLogikField.set("value", x);
return cfgRequest;
How to concatenate field values into a string:
stringVar = "";
stringVar = stringVar.concat(cfg.varible1, cfg.variable2, cfg.variable3);
return stringVar;// returns selected values of "variable1variable2variable3"
How to imitate a CONTAINS function:
var yourVariable = "Field Value"; // Replace with your actual Field value
if (yourVariable.includes("CU")) {
// Code you wish to execute when Field Value contains "CU"
} else if (yourVariable.includes("AL")) {
// Code you wish to execute when Field Value contains "AL"
} else {
// Code you wish to execute when Field Value doesn't contain "CU" or "AL"
};