Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

Setting Catalog Item variables via ReST

Stephen Graham
Giga Expert

I have a requirement to update some variables on a request item via ReST after the item has been logged by an end-user.

I can successfully set the standard fields, but not the variables. When I pass the below body into my PATCH command, the description gets set correctly, but the variable does not:

{
    "description":  "test description",
    "variables":  {
                      "test_field":  "test value"
                  }
}

The 'test_field' is a Single Line Text field in ServiceNow.

1 ACCEPTED SOLUTION

Stephen Graham
Giga Expert

In case anyone else has the same issue, here's the PowerShell script I used to update two variables (Test Field and Test Field2) on an existing RITM:

$instance = "https://<instance>.service-now.com/api/"
$user = ""
$pass = ""
$sys_id = "86d6aa471b233300de6ffc88cc4bcba6" #The sys_id of the RITM

$table = "sc_item_option_mtom" #this table holds the relationship between an RITM and its variables

#Set TLS to 1.2

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Build auth header

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# Set proper headers

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))

$headers.Add('Accept','application/json')

$headers.Add('Content-Type','application/json')

# Specify endpoint uri

$uri = "$instance/now/table/$table"+"?sysparm_query=request_item=$sys_id" #queries for the sys_id of the RITM in the sc_item_option_mtom table

# Specify HTTP method

$method = "GET" #We are just doing a GET because at this point we just want to retrieve the link records, which we can use later to populate the variables in the sc_item_option table  

# Send HTTP request

$response = Invoke-WebRequest -Headers $headers -Method $method -Uri $uri -UseBasicParsing

$response = $response | ConvertFrom-Json #Convert response to a PSObject

$sc_item_option = $response.result.sc_item_option.value #This is the value of the sc_item_option field in the sc_item_option_mtom table. This is a reference field so it will be a sys id. If there are multiple variables, then a list would be returned

foreach ($id in $sc_item_option) #loop through each variable
{
    
    $table2 = 'sc_item_option'
    $uri2 = "$instance/now/table/$table2/$id"+"?sysparm_display_value=all"
    $method2 = 'PATCH'
    
    #perform a GET to find out what the variable's display value is (i.e. which question it relates to)
    $response2 = Invoke-WebRequest -Headers $headers -Method $method -Uri $uri2 -UseBasicParsing

    $response2 = $response2 | ConvertFrom-Json

    $variableName = $response2.result.item_option_new.display_value #This is the display name of the question in ServiceNow
    $variableValue = $response2.result.value.value #This is current value (answer) of the question in ServiceNow

    $method2 = 'PATCH' #PATCH to update the field

    #Instantiate empty body object to populate later
    $body = @{

    }
    
    #Populate the fields with different values depending on the question. The $variableName must exactly match the text of the question on the catalog item in ServiceNow
    If ($variableName -eq 'Test Field')
    {
        $body.add('value', 'testing field 1')
    }
    elseif ($variableName -eq 'Test Field2') 
    {
        $body.clear() #empty the body
        $body.add('value', 'testing field 2')
    }
        
    $bodyJson = $body | ConvertTo-Json

    $response2 = Invoke-WebRequest -Headers $headers -Method $method2 -Uri $uri2 -Body $bodyJson -UseBasicParsing   

}

View solution in original post

6 REPLIES 6

Stephen Graham
Giga Expert

Thanks Chandra,

I think that only works for creating new orders - do you know how to get it to work for updating existing request items?

Thanks!

Stephen Graham
Giga Expert

In case anyone else has the same issue, here's the PowerShell script I used to update two variables (Test Field and Test Field2) on an existing RITM:

$instance = "https://<instance>.service-now.com/api/"
$user = ""
$pass = ""
$sys_id = "86d6aa471b233300de6ffc88cc4bcba6" #The sys_id of the RITM

$table = "sc_item_option_mtom" #this table holds the relationship between an RITM and its variables

#Set TLS to 1.2

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Build auth header

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# Set proper headers

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"

$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))

$headers.Add('Accept','application/json')

$headers.Add('Content-Type','application/json')

# Specify endpoint uri

$uri = "$instance/now/table/$table"+"?sysparm_query=request_item=$sys_id" #queries for the sys_id of the RITM in the sc_item_option_mtom table

# Specify HTTP method

$method = "GET" #We are just doing a GET because at this point we just want to retrieve the link records, which we can use later to populate the variables in the sc_item_option table  

# Send HTTP request

$response = Invoke-WebRequest -Headers $headers -Method $method -Uri $uri -UseBasicParsing

$response = $response | ConvertFrom-Json #Convert response to a PSObject

$sc_item_option = $response.result.sc_item_option.value #This is the value of the sc_item_option field in the sc_item_option_mtom table. This is a reference field so it will be a sys id. If there are multiple variables, then a list would be returned

foreach ($id in $sc_item_option) #loop through each variable
{
    
    $table2 = 'sc_item_option'
    $uri2 = "$instance/now/table/$table2/$id"+"?sysparm_display_value=all"
    $method2 = 'PATCH'
    
    #perform a GET to find out what the variable's display value is (i.e. which question it relates to)
    $response2 = Invoke-WebRequest -Headers $headers -Method $method -Uri $uri2 -UseBasicParsing

    $response2 = $response2 | ConvertFrom-Json

    $variableName = $response2.result.item_option_new.display_value #This is the display name of the question in ServiceNow
    $variableValue = $response2.result.value.value #This is current value (answer) of the question in ServiceNow

    $method2 = 'PATCH' #PATCH to update the field

    #Instantiate empty body object to populate later
    $body = @{

    }
    
    #Populate the fields with different values depending on the question. The $variableName must exactly match the text of the question on the catalog item in ServiceNow
    If ($variableName -eq 'Test Field')
    {
        $body.add('value', 'testing field 1')
    }
    elseif ($variableName -eq 'Test Field2') 
    {
        $body.clear() #empty the body
        $body.add('value', 'testing field 2')
    }
        
    $bodyJson = $body | ConvertTo-Json

    $response2 = Invoke-WebRequest -Headers $headers -Method $method2 -Uri $uri2 -Body $bodyJson -UseBasicParsing   

}