API de flux : ServiceNow Fluent
L’API Flow définit les flux et les flux secondaires [sys_hub_flow], qui automatisent les processus business avec des composants réutilisables à plusieurs étapes.
Créez un flux à l’aide de l’objet Flux. Pour plus d'informations, consultez Objet de flux.
Créez un flux secondaire à l’aide de l’objet Subflow. Pour plus d'informations, consultez Objet de flux secondaire.
Pour en savoir plus sur les flux, reportez-vous à la section Exploring flows. Pour en savoir plus sur les flux secondaires, reportez-vous à la rubrique Exploring subflows.
Objet de flux
Créez un flux [sys_hub_flow] pour exécuter une séquence d’actions et une logique de flux lorsqu’un ensemble de conditions de déclenchement se produit.
Les flux ne s’exécutent que lorsque leurs conditions de déclenchement sont remplies. Utilisez des flux pour une automatisation pilotée par les événements qui nécessite un déclencheur cohérent et prédéfini.
- Un objet de configuration qui définit les propriétés de configuration du flux.
- Une fonction wfa.trigger qui définit le moment de l’exécution du flux.
- Fonction One Body qui définit les actions et la logique de flux à exécuter.
- Zéro ou plusieurs fonctions wfa.action
- Zéro ou plusieurs fonctions wfa.flow_logic
| Nom | Type | Description |
|---|---|---|
| configuration | Objet | Requis. Objet contenant les propriétés de configuration des métadonnées pour l’objet ou la fonction Fluent. |
| $id | Chaîne ou numéro | Requis. ID unique pour l’objet de métadonnées. Lorsque vous créez l’application, cet ID est haché en une sys_id unique. Pour en savoir plus, consultez ServiceNow Fluent Constructions linguistiques. Format : |
| nom | Chaîne | Requis. Nom d’affichage du flux. Le nom du flux doit être significatif et descriptif pour identifier facilement son objectif. |
| description | Chaîne | Description de l’action du flux. |
| exécuter en tant que | Chaîne |
Détermine sous quel contexte utilisateur les actions de flux sont exécutées. Le paramètre utilisateur système s’exécute en tant qu’utilisateur privilégié qui contourne les ACL basées sur les rôles. Le paramètre utilisateur s’exécute avec les privilèges et les rôles de l’utilisateur qui a démarré le flux. Valeurs valides : système, utilisateur Par défaut : user |
| runWithRoles | Chaîne | Spécifiez les rôles que le flux utilise lors de l’exécution. Pour en savoir plus sur l’exécution d’un flux avec des rôles, reportez-vous à la rubrique Flow roles. |
| Priorité du flux | Chaîne |
Définit la priorité d’exécution du flux dans le moteur de flux. Valeurs valides : FAIBLE, MOYEN, ÉLEVÉ Par défaut : MOYEN |
| Protection | Chaîne |
Définit si le flux est en lecture seule (lecture) ou modifiable (chaîne vide). Valeurs valides : lire, « » Par défaut : '' |
| accès | Chaîne |
Définit si un flux est public ou privé. Valeurs valides : public, package_private Par défaut : public |
| Variables de flux | Objet | Objet définissant les variables de données disponibles pour le flux à l’aide de types de colonnes. Utilisez la fonction get_table_schema pour extraire les définitions de champ. |
| wfa.déclencheur | Fonction | Définit le moment de l’exécution du flux. Lorsque les conditions de déclenchement sont remplies, le système exécute le flux à l’aide des données fournies par le déclencheur. Pour plus d’informations sur la fonction wfa.trigger , reportez-vous à la section WFA. Fonction de déclenchement. |
| Corps du flux | Fonction |
Flow body est un Arrow function script en TypeScript qui représente les étapes d’exécution dans le flux. Le corps du flux reçoit le params paramètre en tant qu’entrée, qui contient les wfa.trigger objets et flowVariables . Les étapes de consistent Flow body en ces types de fonctions :
Vous pouvez utiliser ces valeurs de paramètre dans la fonction Corps de flux.
|
Cet exemple crée un flux qui s’exécute lorsqu’un incident est créé avec une valeur de champ d’origine vide. Le flux alerte les gestionnaires et les membres de l’équipe en fonction de la gravité de l’incident.
import { action, Flow, wfa, trigger } from '@servicenow/sdk/automation'
export const incidentSeverityAlertFlow = Flow(
{
$id: Now.ID['incident_severity_alert_flow'],
name: 'Incident Severity Alert Flow',
description: 'Alerts managers and team members based on incident severity for incidents with empty origin',
},
wfa.trigger(
trigger.record.created,
{ $id: Now.ID['empty_origin_incident_trigger'] },
{
table: 'incident',
condition: 'origin=NULL',
run_flow_in: 'background',
run_on_extended: 'false',
run_when_setting: 'both',
run_when_user_setting: 'any',
run_when_user_list: [],
}
),
(params) => {
wfa.action(
action.core.log,
{ $id: Now.ID['log_incident_short_description'] },
{
log_level: 'info',
log_message: `Incident created: ${wfa.dataPill(params.trigger.current.short_description, 'string')}`,
}
)
wfa.flowLogic.if(
{
$id: Now.ID['check_severity_high'],
condition: `${wfa.dataPill(params.trigger.current.severity, 'string')}=1`,
annotation: 'High severity (1)',
},
() => {
const assignmentGroup = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_assignment_group'] },
{
table: 'sys_user_group',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.assignment_group, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
const manager = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_manager_details'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(assignmentGroup.Record.manager, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendNotification,
{ $id: Now.ID['send_urgent_email_to_manager'] },
{
table_name: 'incident',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
notification: 'high_severity_incident_manager_notification',
}
)
wfa.flowLogic.forEach(
wfa.dataPill(params.trigger.current.additional_assignee_list, 'array.string'),
{ $id: Now.ID['foreach_additional_assignees_high'] },
() => {
const assignee = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_assignee_details_high'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.additional_assignee_list, 'array.string')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendSms,
{ $id: Now.ID['send_sms_to_assignee_high'] },
{
recipients: `${wfa.dataPill(assignee.Record.phone, 'string')}`,
message: `High severity incident: ${wfa.dataPill(params.trigger.current.short_description, 'string')}`,
}
)
}
)
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['update_work_notes_high'] },
{
table_name: 'incident',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
values: TemplateValue({
work_notes: `Manager ${wfa.dataPill(manager.Record.name, 'string')} notified via email and team notified via SMS.`,
}),
}
)
}
)
wfa.flowLogic.elseIf(
{
$id: Now.ID['check_severity_medium'],
condition: `${wfa.dataPill(params.trigger.current.severity, 'string')}=2`,
annotation: 'Medium severity (2)',
},
() => {
wfa.flowLogic.forEach(
wfa.dataPill(params.trigger.current.additional_assignee_list, 'array.string'),
{ $id: Now.ID['foreach_additional_assignees_medium'] },
() => {
const assignee = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_assignee_details_medium'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.additional_assignee_list, 'array.string')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendSms,
{ $id: Now.ID['send_sms_to_assignee_medium'] },
{
recipients: `${wfa.dataPill(assignee.Record.phone, 'string')}`,
message: `Medium severity incident: ${wfa.dataPill(params.trigger.current.short_description, 'string')}`,
}
)
}
)
}
)
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['update_incident_to_in_progress'] },
{
table_name: 'incident',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
values: TemplateValue({ state: '2' }),
}
)
}
)
Cet exemple s’exécute lorsqu’une demande de changement est approuvée et en informe le demandeur.
import { action, Flow, wfa, trigger } from '@servicenow/sdk/automation'
export const changeRequestApprovalNotificationFlow = Flow(
{
$id: Now.ID['change_request_approval_notification_flow'],
name: 'Change Request Approval Notification Flow',
description: 'Sends formatted notification to requester when change request is approved',
},
wfa.trigger(
trigger.record.updated,
{ $id: Now.ID['change_request_approved_trigger'] },
{
table: 'change_request',
condition: 'approval=approved',
run_flow_in: 'background',
trigger_strategy: 'unique_changes',
run_when_user_list: [],
run_when_setting: 'both',
run_on_extended: 'false',
run_when_user_setting: 'any',
}
),
(params) => {
const requester = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_requester_details'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.requested_by, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendEmail,
{ $id: Now.ID['send_approval_notification_email'] },
{
table_name: 'change_request',
watermark_email: true,
ah_subject: `Change Request ${wfa.dataPill(params.trigger.current.number, 'string')} - Approved`,
ah_body: `Your change request has been approved.`,
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
ah_to: wfa.dataPill(requester.Record.email, 'string'),
}
)
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['update_work_notes_notification_sent'] },
{
table_name: 'change_request',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
values: TemplateValue({
work_notes: `Approval notification sent to ${wfa.dataPill(requester.Record.name, 'string')} (${wfa.dataPill(requester.Record.email, 'string')})`,
}),
}
)
}
)
Objet de flux secondaire
Créez un flux secondaire [sys_hub_flow] pour exécuter une séquence réutilisable d’actions et une logique de flux lorsqu’il est appelé par un flux ou une API.
Les flux secondaires s’exécutent lorsqu’ils sont appelés par un flux ou une API. Utilisez des flux secondaires pour l’automatisation sur demande qui peuvent être appelés par plusieurs flux.
- Un objet de configuration qui définit les propriétés de configuration du flux secondaire.
- Zéro ou un objet d’entrées qui définit les entrées de flux secondaire.
- Zéro ou une sortie : objet qui définit les sorties de flux secondaire.
- Zéro ou une variable de flux Objet qui définit les variables de flux.
- Fonction One Body qui définit les actions, la logique de flux et les flux secondaires à exécuter.
- Zéro ou plusieurs fonctions wfa.action
- Zéro ou plusieurs fonctions wfa.flow_logic
| Nom | Type | Description |
|---|---|---|
| configuration | Objet | Requis. Objet contenant les propriétés de configuration des métadonnées pour l’objet ou la fonction Fluent. |
| $id | Chaîne ou numéro | Requis. ID unique pour l’objet de métadonnées. Lorsque vous créez l’application, cet ID est haché en une sys_id unique. Pour en savoir plus, consultez ServiceNow Fluent Constructions linguistiques. Format : |
| nom | Chaîne | Requis. Nom d’affichage du flux secondaire. Le nom du flux secondaire doit être significatif et descriptif pour identifier facilement son objectif. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| description | Chaîne | Description de l’action du flux. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| exécuter en tant que | Chaîne |
Détermine dans quel contexte utilisateur les actions de flux secondaire sont exécutées. Valeurs valides : système, utilisateur Par défaut : user Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| runWithRoles | Tableau | Spécifiez les rôles que le flux secondaire utilise lors de son exécution. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| Priorité du flux | Chaîne |
Définit la priorité d’exécution du flux secondaire dans le moteur de flux. Valeurs valides : FAIBLE, MOYEN, ÉLEVÉ Par défaut : moyen Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| Protection | Chaîne |
Définit si le flux secondaire est en lecture seule (lecture) ou modifiable (chaîne vide). Valeurs valides : lire, ' ' Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| accès | Chaîne |
Définit la visibilité/l’accessibilité du flux secondaire pour les autres auteurs de flux secondaires. Valeurs valides : public, package_private Par défaut : public Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| catégorie | Chaîne | Catégorie pour organiser le flux secondaire. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| entrées | Objet | Objet définissant les paramètres d’entrée à l’aide de types de colonnes. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| sorties | Objet | Objet définissant les paramètres de sortie à l’aide de types de colonnes. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| Variables de flux | Objet | Objet définissant les variables de données disponibles pour le flux secondaire à l’aide de types de colonnes. Cette propriété fait partie de l’objet de configuration du flux secondaire. |
| Corps du flux | Fonction |
Flow body est un Arrow function script en TypeScript qui représente les étapes d’exécution dans le flux. Le corps du flux reçoit le _params paramètre en tant qu’entrée, qui contient les inputs objets et flowVariables . Les étapes de consistent Flow body en ces types de fonctions :
Vous pouvez utiliser ces valeurs de paramètre dans la fonction Corps de flux.
|
Cet exemple utilise le nom d’un nouvel utilisateur et l’emplacement du bureau pour rechercher un enregistrement utilisateur, envoyer une notification de bienvenue et rechercher un actif matériel non affecté ainsi qu’un emplacement de bureau disponible. S’il y a un actif d’ordinateur portable et un emplacement de bureau disponibles, chacun est affecté au nouvel utilisateur.
import { Subflow, action, wfa } from '@servicenow/sdk/automation'
import { BooleanColumn, ReferenceColumn, StringColumn } from '@servicenow/sdk/core'
export const newUserOnboardingSubflow = Subflow(
{
$id: Now.ID['new_user_onboarding_subflow'],
name: 'New User Onboarding Subflow',
description: 'Sends welcome notification, assigns laptop and desk, returns assignment results',
inputs: {
user_sys_id: ReferenceColumn({
label: 'User',
referenceTable: 'sys_user',
mandatory: true,
}),
office_location: ReferenceColumn({
label: 'Office Location',
referenceTable: 'cmn_location',
mandatory: true,
}),
},
outputs: {
laptop_assigned: BooleanColumn({ label: 'Laptop Assigned' }),
desk_assigned: BooleanColumn({ label: 'Desk Assigned' }),
laptop_number: StringColumn({ label: 'Laptop Asset Number', maxLength: 40 }),
desk_number: StringColumn({ label: 'Desk Asset Number', maxLength: 40 }),
},
flowVariables: {
laptop_found: BooleanColumn({ label: 'Laptop Found Flag', default: false }),
desk_found: BooleanColumn({ label: 'Desk Found Flag', default: false }),
},
},
(params) => {
const user = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_user'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.inputs.user_sys_id, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendNotification,
{ $id: Now.ID['send_welcome_notification'] },
{
table_name: 'sys_user',
record: wfa.dataPill(params.inputs.user_sys_id, 'reference'),
notification: 'new_user_welcome_notification',
}
)
const availableLaptop = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_available_laptop'] },
{
table: 'alm_hardware',
conditions: 'assigned_to=NULL^install_status=1^substatus=available',
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.flowLogic.if(
{
$id: Now.ID['check_laptop_available'],
condition: `${wfa.dataPill(availableLaptop.Record.sys_id, 'reference')}!=NULL`,
annotation: 'Available laptop found',
},
() => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['assign_laptop'] },
{
table_name: 'alm_hardware',
record: wfa.dataPill(availableLaptop.Record.sys_id, 'reference'),
values: TemplateValue({
assigned_to: wfa.dataPill(params.inputs.user_sys_id, 'reference'),
install_status: '2',
substatus: 'in_use',
}),
}
)
}
)
wfa.flowLogic.else(
{ $id: Now.ID['no_laptop_available'] },
() => {
wfa.action(
action.core.log,
{ $id: Now.ID['log_no_laptop'] },
{
log_level: 'warn',
log_message: `No available laptop found for ${wfa.dataPill(user.Record.name, 'string')} — manual assignment required.`,
}
)
}
)
const availableDesk = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_available_desk'] },
{
table: 'alm_asset',
conditions: `assigned_to=NULL^location=${wfa.dataPill(params.inputs.office_location, 'reference')}^install_status=1^substatus=available`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.flowLogic.if(
{
$id: Now.ID['check_desk_available'],
condition: `${wfa.dataPill(availableDesk.Record.sys_id, 'reference')}!=NULL`,
annotation: 'Available desk found at office location',
},
() => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['assign_desk'] },
{
table_name: 'alm_asset',
record: wfa.dataPill(availableDesk.Record.sys_id, 'reference'),
values: TemplateValue({
assigned_to: wfa.dataPill(params.inputs.user_sys_id, 'reference'),
install_status: '2',
substatus: 'in_use',
}),
}
)
}
)
wfa.flowLogic.else(
{ $id: Now.ID['no_desk_available'] },
() => {
wfa.action(
action.core.log,
{ $id: Now.ID['log_no_desk'] },
{
log_level: 'warn',
log_message: `No available desk at office location for ${wfa.dataPill(user.Record.name, 'string')} — manual assignment required.`,
}
)
}
)
wfa.action(
action.core.sendNotification,
{ $id: Now.ID['send_onboarding_complete'] },
{
table_name: 'sys_user',
record: wfa.dataPill(params.inputs.user_sys_id, 'reference'),
notification: 'user_onboarding_complete_notification',
}
)
wfa.flowLogic.assignSubflowOutputs(
{
$id: Now.ID['assign_outputs'],
annotation: 'Return laptop and desk assignment results',
},
params.outputs,
{
laptop_assigned: true,
desk_assigned: true,
laptop_number: wfa.dataPill(availableLaptop.Record.asset_tag, 'string'),
desk_number: wfa.dataPill(availableDesk.Record.asset_tag, 'string'),
}
)
}
)
WFA. Fonction de déclenchement
Exécutez un flux lorsque les conditions de démarrage d’un type de déclencheur spécifique sont remplies. Les déclencheurs déterminent quand un flux s’exécute et quelles données sont disponibles à partir des conditions de démarrage du flux.
Ajoutez une fonction wfa.trigger à la Flow Body fonction d’un objet Flux .
- déclencheur.enregistrement.créé
- déclencheur.enregistrement.mis à jour
- trigger.record.createdOrUpdated
- déclencheur.planifié.quotidien
- déclencheur.planifié.hebdomadaire
- déclencheur.planifié.mensuel
- déclencheur.planifié.répétition
- trigger.scheduled.runOnce
- trigger.application.inboundEmail
- trigger.application.slaTask
- déclencheur.application.knowledgeManagement
- trigger.application.remoteTableQuery
Pour en savoir plus sur les actions disponibles, reportez-vous à la section Workflow Studio flow trigger types.
| Nom | Type | Description |
|---|---|---|
| déclencher | Chaîne | Nom du déclencheur spécifique à exécuter. Tous les noms d’actions utilisent une notation à points qui commence par trigger. Par exemple, trigger.record.created, trigger.scheduled.daily ou trigger.application.serviceCatalog. |
| configuration | Objet | Requis. Objet contenant les propriétés de configuration des métadonnées pour l’objet ou la fonction Fluent. |
| $id | Chaîne ou numéro | Requis. ID unique pour l’objet de métadonnées. Lorsque vous créez l’application, cet ID est haché en une sys_id unique. Pour en savoir plus, consultez ServiceNow Fluent Constructions linguistiques. Format : |
| entrées | Objet | Objet contenant tous les paramètres d’entrée requis par le déclencheur, tels qu’une table ou une condition. |
Cet exemple exécute un flux lorsqu’un enregistrement d’incident de priorité élevée est créé.
// Trigger definition - defines when the flow starts
wfa.trigger(
trigger.record.created, // TriggerDefinition - record creation event
{
$id: Now.ID['incident_trigger'], // string | guid, mandatory - unique identifier
annotation: 'When high priority incident is created' // string, optional - describes trigger purpose
},
{
table: 'incident', // string, mandatory - table name to monitor
condition: 'priority=1^ORpriority=2', // string, optional - encoded query filter
run_on_extended: 'false', // string, optional, default: 'false' - run on child tables
run_flow_in: 'any', // string, optional, default: 'any' - 'any', 'background', or 'foreground'
run_when_setting: 'both', // string, optional, default: 'both' - 'both', 'non_interactive', or 'interactive'
run_when_user_list: [], // Array, optional, default: [] - need to use runQuery to get user sys_ids from sys_user table
run_when_user_setting: 'any' // string, optional, default: 'any' - 'any', 'one_of', or 'not_one_of'
}
)
Cet exemple démarre un flux quotidiennement à 9 heures.
// ✅ CORRECT - Daily trigger at specific time
wfa.trigger(
trigger.scheduled.daily,
{
$id: Now.ID['daily_report_trigger'],
annotation: 'Runs daily at 9 AM'
},
{
time: Time({ hours: 9, minutes: 0, seconds: 0 })
}
)
Cet exemple démarre un flux lorsqu’il y a une réponse par e-mail à un enregistrement d’incident.
// Trigger when email arrives for incident table
wfa.trigger(
trigger.application.inboundEmail, // TriggerDefinition - inbound email event
{
$id: Now.ID['incident_email_trigger'], // string | guid, mandatory
annotation: 'Process emails for incident table' // string, optional
},
{
target_table: 'incident', // string, optional - table for email replies/forwards
email_conditions: '', // string, optional - filter which emails trigger the flow
order: 100, // number, optional - execution order when multiple email triggers exist
stop_condition_evaluation: true // boolean, optional - stop evaluating other triggers if this one matches
}
)
// Access email data in flow body:
(_params) => {
const emailSubject = _params.trigger.email.subject // Email subject
const emailBody = _params.trigger.email.body // Email body
const emailFrom = _params.trigger.email.from // Sender email address
}
WFA.Fonction Action
Exécutez une instance d’action spécifique à partir d’un flux ou d’un flux secondaire. Les actions déterminent les données qui sont générées, mises à jour ou récupérées.
Ajoutez des fonctions wfa.action à la Flow Body fonction d’un objet de flux ou de flux secondaire .
- action.core.createRecord
- action.core.createOrUpdateRecord
- action.core.deleteRecord
- action.core.lookUpRecord
- action.core.lookUpRecords
- action.core.updateRecord
- action.core.updateMultipleRecords
- action.core.sendNotification
- action.core.sendEmail
- action.core.sendSms
- action.core.askForApproval
- action.core.attendrel’approbation
- action.core.createTask
- action.core.log
- action.core.waitForCondition
- action.core.waitForMessage
- action.core.slaPercentageTimer
Pour en savoir plus sur les actions disponibles, reportez-vous à la section Workflow Studio actions.
| Nom | Type | Description |
|---|---|---|
| action | Chaîne | Nom de l’action spécifique à exécuter. Tous les noms d’actions utilisent une notation à points qui commence par action.core. Par exemple, action.core.lookUpRecord, action.core.lookUpRecords, action.core.createRecord ou action.core.updateRecord. |
| configuration | Objet | Requis. Objet contenant les propriétés de configuration des métadonnées pour l’objet ou la fonction Fluent. |
| $id | Chaîne ou numéro | Requis. ID unique pour l’objet de métadonnées. Lorsque vous créez l’application, cet ID est haché en une sys_id unique. Pour en savoir plus, consultez ServiceNow Fluent Constructions linguistiques. Format : |
| entrées | Objet | Objet contenant tous les paramètres d’entrée requis par l’action, tels que les table_name ou les valeurs. |
Cet exemple s’exécute lorsqu’une demande de changement est approuvée et en informe le demandeur. Le flux utilise les actions Rechercher des enregistrements, Envoyer un e-mail et Mettre à jour l’enregistrement.
import { action, Flow, wfa, trigger } from '@servicenow/sdk/automation'
export const changeRequestApprovalNotificationFlow = Flow(
{
$id: Now.ID['change_request_approval_notification_flow'],
name: 'Change Request Approval Notification Flow',
description: 'Sends formatted notification to requester when change request is approved',
},
wfa.trigger(
trigger.record.updated,
{ $id: Now.ID['change_request_approved_trigger'] },
{
table: 'change_request',
condition: 'approval=approved',
run_flow_in: 'background',
trigger_strategy: 'unique_changes',
run_when_user_list: [],
run_when_setting: 'both',
run_on_extended: 'false',
run_when_user_setting: 'any',
}
),
(params) => {
const requester = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_requester_details'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.requested_by, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendEmail,
{ $id: Now.ID['send_approval_notification_email'] },
{
table_name: 'change_request',
watermark_email: true,
ah_subject: `Change Request ${wfa.dataPill(params.trigger.current.number, 'string')} - Approved`,
ah_body: `Your change request has been approved.`,
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
ah_to: wfa.dataPill(requester.Record.email, 'string'),
}
)
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['update_work_notes_notification_sent'] },
{
table_name: 'change_request',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
values: TemplateValue({
work_notes: `Approval notification sent to ${wfa.dataPill(requester.Record.name, 'string')} (${wfa.dataPill(requester.Record.email, 'string')})`,
}),
}
)
}
)
Cet exemple exécute un flux lorsqu’un enregistrement de demande de changement est créé ou mis à jour avec un impact élevé. Le flux exécute les options Mettre à jour l’enregistrement pour marquer la demande de changement comme à risque élevé, Rechercher un enregistrement pour trouver le groupe portant le nom CAB, Envoyer une notification pour envoyer une notification de changement à risque élevé au groupe CAB et l’action Journal pour documenter à la fois la mise à jour de l’enregistrement et la notification envoyée.
import { action, Flow, wfa, trigger } from '@servicenow/sdk/automation'
export const changeRiskTaggingFlow = Flow(
{
$id: Now.ID['change_risk_tagging_flow'],
name: 'Change Risk Tagging Flow',
description: 'Tags change requests with high-risk label when created or updated with high impact',
},
wfa.trigger(
trigger.record.createdOrUpdated,
{ $id: Now.ID['change_risk_trigger'] },
{
table: 'change_request',
condition: 'active=true^impact=1',
run_flow_in: 'background',
run_on_extended: 'false',
run_when_setting: 'both',
run_when_user_setting: 'any',
run_when_user_list: [],
}
),
(params) => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['tag_high_risk'] },
{
table_name: 'change_request',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
values: TemplateValue({
risk: 'high',
work_notes: 'Automatically tagged as high-risk due to high impact.',
}),
}
)
const cab = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_cab_group'] },
{
table: 'sys_user_group',
conditions: 'name=CAB^active=true',
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.sendNotification,
{ $id: Now.ID['notify_cab_high_risk'] },
{
table_name: 'change_request',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
notification: 'high_risk_change_cab_notification',
}
)
wfa.action(
action.core.log,
{ $id: Now.ID['log_risk_tagged'] },
{
log_level: 'warn',
log_message: `Change ${wfa.dataPill(params.trigger.current.number, 'string')} tagged as high-risk. CAB group ${wfa.dataPill(cab.Record.name, 'string')} notified.`,
}
)
}
)
wfa.flow_logic fonction
Exécutez une instance de logique de flux spécifique à partir d’un flux ou d’un flux secondaire. La logique de flux détermine comment et quand les données sont utilisées.
Ajoutez wfa.flow_logic fonctions à la Flow Body fonction d’un objet de flux ou de flux secondaire .
- if
- elseIf
- sinon
- forEach
- waitForADuration
- exitLoop, endFlow, skipIteration, setFlowVariables et assignSubflowOutputs
Pour en savoir plus sur la logique de flux disponible, reportez-vous à la section Workflow Studio flow logic.
| Nom | Type | Description |
|---|---|---|
| configuration | Objet | Requis. Objet contenant les propriétés de configuration des métadonnées pour l’objet ou la fonction Fluent. |
| $id | Chaîne ou numéro | Requis. ID unique pour l’objet de métadonnées. Lorsque vous créez l’application, cet ID est haché en une sys_id unique. Pour en savoir plus, consultez ServiceNow Fluent Constructions linguistiques. Format : |
| Annotation | Chaîne | Décrivez ce que fait cette instance de logique de flux. Par exemple, annotation : « La priorité est critique ». |
| condition | Chaîne | Requis dans une fonction wfa.flow_logic.if et wfa.flow_logic.elseIf . Valeurs de données qui doivent être vraies pour exécuter cette logique de flux. Par exemple, condition : '\${_params.trigger.current.priority}=1',. |
| Élément | Tableau | Requis dans une fonction wfa.flow_logic.forEach . Un tableau ou une collection d’enregistrements sur lesquels itérer. En règle générale, cette liste d’enregistrements est générée dynamiquement à partir d’un appel de fonction wfa.action à l’action action.core.lookUpRecords . Par exemple, un problème. Le tableau d’enregistrements peut être généré à partir d’une action action.core.lookUpRecords . |
| étiquette | Chaîne | Afficher la valeur décrivant cette instance de logique de flux. Par exemple, étiquetez : « Si la priorité est critique ». |
| variables | Schéma | Requis dans une fonction wfa.flow_logic.assignSubflowOutputs et wfa.flow_logic.setFlowVariables . Schéma produit par l’API FlowVariables qui définit la structure de données des variables de flux. Par exemple, le schéma flowVars peut être généré à partir de FlowVariables.Important : Utilisez toujours _params.flowVariables comme argument pour cette propriété. La transmission d’un schéma incorrect entraînera des erreurs de validation. |
| Corps de logique de flux | Fonction | Flow logic body est un Arrow function in TypeScript qui représente les étapes d’exécution dans la logique de flux. Le corps du flux reçoit le _params paramètre en tant qu’entrée, qui contient les wfa.trigger objets et flowVariables . Les étapes de consistent Flow logic body en ces appels de fonctions :
|
Cet exemple montre comment vérifier les conditions dans l’enregistrement de déclenchement. Si l’enregistrement actuel a une priorité de 1, il affecte l’enregistrement à une équipe de priorité critique. Sinon, si la valeur de priorité de l’enregistrement actuel est de 2, il affecte l’enregistrement à une équipe de priorité élevée. Si aucune des deux conditions n’est remplie, l’enregistrement est affecté à une équipe générale.
// Flow body showing if/elseIf/else usage
(_params) => {
wfa.flow_logic.if(
{
$id: Now.ID['check_critical_priority'],
condition: `\${_params.trigger.current.priority}=1`,
annotation: 'Priority is critical',
},
() => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['assign_critical_team'], annotation: 'Assign to critical team' },
{ record: _params.trigger.current, table_name: 'incident', values: 'assignment_group=critical_team' }
)
}
)
wfa.flow_logic.elseIf(
{ $id: Now.ID['check_high_priority'], condition: `\${_params.trigger.current.priority}=2`, annotation: 'Priority is high' },
() => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['assign_high_team'], annotation: 'Assign to high team' },
{ record: _params.trigger.current, table_name: 'incident', values: 'assignment_group=high_team' }
)
}
)
wfa.flow_logic.else(
{ $id: Now.ID['assign_default'], annotation: 'Default assignment' },
() => {
wfa.action(
action.core.updateRecord,
{ $id: Now.ID['assign_general_team'], annotation: 'Assign to general team' },
{ record: _params.trigger.current, table_name: 'incident', values: 'assignment_group=general_team' }
)
}
)
}
Cet exemple parcourt une liste d’enregistrements de problèmes pour trouver des enregistrements non affectés, les affecter à un groupe de triage de problèmes et envoyer un e-mail au groupe.
// Flow body showing forEach usage with lookUpRecords
(_params) => {
//Find all the newly created problem records for the past day
const problems = wfa.action(
action.core.lookUpRecords,
{
$id: Now.ID['daily_unassigned_new_problems_triage_flow_step1'],
annotation: 'Find all the newly created problem records for the past day',
},
{
table: 'problem',
conditions:
'sys_created_onONYesterday@javascript:gs.beginningOfYesterday()@javascript:gs.endOfYesterday()',
}
)
//Iterate over the problems
wfa.flow_logic.forEach(
problems.Records,
{ $id: Now.ID['daily_unassigned_new_problems_triage_flow_step2'], annotation: 'Iterate each problem' },
(item) => {
//Check if the problem is not assigned
wfa.flow_logic.if(
{
$id: Now.ID['daily_unassigned_new_problems_triage_flow_step3'],
condition: `\${item.assignment_group}ISEMPTY`,
annotation: 'Check if problem is not assigned',
},
() => {
wfa.action(
action.core.updateRecord,
{
$id: Now.ID['daily_unassigned_new_problems_triage_flow_step4'],
annotation: 'Update the problem record state',
},
{ table_name: 'problem', record: item, values: 'state=1' }
)
//Send notification to the group
wfa.action(
action.core.sendNotification,
{
$id: Now.ID['daily_unassigned_new_problems_triage_flow_step5'],
annotation: 'Send notification to the group',
},
{
table_name: 'problem',
record: item,
notification: '',
}
)
}
)
}
)
}
Cet exemple définit les variables de flux sur des valeurs dynamiques stockées dans des pastilles de données.
import { FlowVariables } from '@servicenow/sdk/automation'
const flowVars = FlowVariables({
incidentPriority: IntegerColumn({ label: 'Incident Priority' }),
assignedGroup: StringColumn({ label: 'Assigned Group' }),
threshold: IntegerColumn({ label: 'Threshold' }),
actionResult: StringColumn({ label: 'Action Result' }),
})
(_params) => {
// Lookup action result
const lookupResult = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_config'], annotation: 'Get configuration' },
{ table: 'sys_properties', conditions: 'name=incident.threshold' }
)
// Set flow variables using datapills from trigger, action outputs, and other flow variables
wfa.flow_logic.setFlowVariables(
{
$id: Now.ID['set_variables_with_datapills'],
annotation: 'Set variables from trigger and action outputs',
},
_params.flowVariables,
{
incidentPriority: _params.trigger.current.priority, // Trigger datapill
assignedGroup: _params.trigger.current.assignment_group, // Trigger datapill
threshold: lookupResult.Record.value, // Action output datapill
actionResult: _params.flowVariables.status, // Flow variable datapill
}
)
}
Cet exemple affecte des sorties de flux secondaire à l’aide de variables de flux.
// Flow body showing assignSubflowOutputs usage with flow variables
import { FlowVariables } from '@servicenow/sdk/automation'
const flowVars = FlowVariables({
userEmail: StringColumn({ label: 'User Email' }),
userName: StringColumn({ label: 'User Name' }),
isApproved: BooleanColumn({ label: 'Is Approved' }),
})
(_params) => {
// Call a subflow that returns user information
const subflowResult = wfa.subflow(
userInfoSubflow,
{ $id: Now.ID['get_user_info'], annotation: 'Get user information' },
{ userId: _params.trigger.current.caller_id }
)
// Assign subflow outputs to flow variables in one operation
wfa.flow_logic.assignSubflowOutputs(
{ $id: Now.ID['assign_outputs'], annotation: 'Assign user info to flow variables' },
flowVars,
{
userEmail: subflowResult.email,
userName: subflowResult.name,
isApproved: subflowResult.approved,
}
)
// Now flow variables can be used throughout the flow
// Access via _params.flowVariables.userEmail, etc.
}
Fonction wfa.dataPill
Référencez une valeur de pastille de données d’exécution spécifique à partir d’une action ou d’une entrée de logique de flux.
Ajoutez des fonctions wfa.dataPill aux paramètres d’entrée d’une action ou d’une fonction flow_logic . Définissez une constante pour chaque pastille de données que vous souhaitez utiliser. En règle générale, cette constante stocke la sortie d’une fonction wfa.action ou wfa.flow_logic.
| Nom | Type | Description |
|---|---|---|
| d’expression | Chaîne | Requis. Référence de notation par points aux données d’exécution que vous souhaitez utiliser comme valeur d’entrée. Les valeurs d’exécution couramment utilisées comprennent les données de déclenchement, les sorties d’action et les sorties de flux secondaire.
|
| Type | Chaîne | Requis. Type de données des données, par exemple chaîne, booléen, nombre entier ou référence. Pour obtenir la liste des types de données de champ disponibles, reportez-vous à la section Field types reference. |
Cet exemple utilise un enregistrement d’e-mail non lié pour créer un incident ou une tâche en fonction des valeurs de l’e-mail entrant. Cet exemple utilise l’objet params pour faire référence aux données dans le déclencheur. Cet exemple définit également les constantes sender, senderManager, p3Incident et attachments pour stocker la sortie des actions et la logique de flux à utiliser dans les fonctions ultérieures de wfa.dataPill.
import { action, Flow, wfa, trigger } from '@servicenow/sdk/automation'
export const emailIncidentTaskFlow = Flow(
{
$id: Now.ID['email_incident_task_flow'],
name: 'Email Incident/Task Creation Flow',
description: 'Creates incidents or tasks based on email content with "raise incident or task" in subject',
},
wfa.trigger(
trigger.application.inboundEmail,
{ $id: Now.ID['inbound_email_trigger'] },
{
email_conditions: 'subjectLIKEraise incident or task',
target_table: 'incident',
}
),
(params) => {
wfa.action(
action.core.log,
{ $id: Now.ID['log_email_received'] },
{
log_level: 'info',
log_message: `Email received from: ${wfa.dataPill(params.trigger.from_address, 'string')}, Subject: ${wfa.dataPill(params.trigger.subject, 'string')}`,
}
)
const sender = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_sender'] },
{
table: 'sys_user',
conditions: `email=${wfa.dataPill(params.trigger.from_address, 'string')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
// Internal P1 path — two tasks
wfa.flowLogic.if(
{
$id: Now.ID['check_internal_p1'],
condition: `${wfa.dataPill(sender.Record.email, 'string')}LIKEservicenow^${wfa.dataPill(params.trigger.subject, 'string')}LIKEP1`,
annotation: 'Internal sender with P1 subject',
},
() => {
const senderManager = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_sender_manager'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(sender.Record.manager, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)
wfa.action(
action.core.createTask,
{ $id: Now.ID['task_for_manager'] },
{
task_table: 'incident',
field_values: TemplateValue({
priority: 1,
assigned_to: wfa.dataPill(senderManager.Record.sys_id, 'reference'),
short_description: wfa.dataPill(params.trigger.inbound_email.body, 'reference'),
urgency: 1,
impact: 1,
}),
}
)
wfa.action(
action.core.createTask,
{ $id: Now.ID['task_for_sender'] },
{
task_table: 'incident',
field_values: TemplateValue({
priority: 1,
assigned_to: wfa.dataPill(sender.Record.sys_id, 'reference'),
short_description: wfa.dataPill(params.trigger.subject, 'string'),
urgency: 1,
impact: 1,
}),
}
)
}
)
// External / non-P1 path — P3 incident + copy attachments
wfa.flowLogic.else({ $id: Now.ID['create_p3_incident_branch'] }, () => {
const p3Incident = wfa.action(
action.core.createRecord,
{ $id: Now.ID['create_p3_incident'] },
{
table_name: 'incident',
values: TemplateValue({
priority: 4,
short_description: wfa.dataPill(params.trigger.subject, 'string'),
description: `From: ${wfa.dataPill(params.trigger.from_address, 'string')}\n\n${wfa.dataPill(params.trigger.inbound_email.body, 'reference')}`,
contact_type: 'email',
caller_id: wfa.dataPill(sender.Record.sys_id, 'reference'),
}),
}
)
const attachments = wfa.action(
action.core.getAttachmentsOnRecord,
{ $id: Now.ID['get_email_attachments'] },
{ source_record: wfa.dataPill(params.trigger.inbound_email.sys_id, 'reference') }
)
wfa.flowLogic.forEach(
wfa.dataPill(attachments.parameter, 'records'),
{ $id: Now.ID['copy_attachments_loop'] },
() => {
wfa.action(
action.core.copyAttachment,
{ $id: Now.ID['copy_attachment'] },
{
target_record: wfa.dataPill(p3Incident.record, 'reference'),
attachment_record: wfa.dataPill(attachments.parameter, 'records'),
table: 'incident',
}
)
}
)
wfa.action(
action.core.sendEmail,
{ $id: Now.ID['confirm_p3_email'] },
{
table_name: 'incident',
ah_to: wfa.dataPill(params.trigger.from_address, 'string'),
ah_subject: `Incident Created: ${wfa.dataPill(params.trigger.subject, 'string')}`,
ah_body: `Your request has been received and a P3 incident has been created. Our team will be in touch shortly.`,
record: wfa.dataPill(p3Incident.record, 'reference'),
}
)
})
}
)