Un workflow d’actions est un workflow automatisé défini par l’utilisateur. Chaque workflow d’actions consiste en un déclencheur de workflow d’actions, qui lance le workflow, et d’une ou plusieurs actions.
Les étapes avec code personnalisé vous permettent d’exécuter JavaScript pour effectuer des transformations de données complexes, de les formater et d’utiliser la logique avancée (tout cela est impossible avec les actions et les étapes prédéfinies). Par exemple, vous pourriez utiliser une étape avec code personnalisé pour masquer les parties confidentielles d’une adresse e-mail, valider le format d’un e-mail ou d’un ID de commande, ou encore calculer les dates futures pour les messages de rappel.
Ajout et configuration d’étapes avec code personnalisé
Si vous avez besoin d’exécuter du code dans le cadre d’un workflow d’actions, vous pouvez ajouter une étape avec code personnalisé. Consultez Types de données pris en charge pour savoir quels types de données sont pris en charge pour les entrées et les sorties des étapes avec code personnalisé.
- Ouvrez un workflow d’actions.
- Dans le créateur d’actions, sous une étape existante, cliquez sur l’icône Ajouter une étape (
). - Dans la barre latérale d’étape, sous Contrôle des workflows et des services, cliquez sur Code personnalisé.
- Dans la barre latérale d’étape, cliquez sur Ajouter une entrée pour ajouter des entrées pour le code personnalisé.
- Dans la barre latérale d’étape, cliquez sur Ajouter une sortie pour ajouter au moins une sortie.
- Dans la barre latérale d’étape, sous Code, saisissez votre code JavaScript personnalisé.
- Cliquez sur Enregistrer.
Pour vérifier que le code personnalisé fonctionne comme prévu, testez votre workflow d’actions. Si vous rencontrez des problèmes, consultez Étapes avec code personnalisé - Dépannage.
Ajout d’entrées aux étapes avec code personnalisé
Les étapes avec code personnalisé peuvent avoir 25 entrées maximum.
- Ouvrez un workflow d’actions.
- Dans le Créateur d’actions, cliquez sur une étape avec code personnalisé existante ou sur l’icône Ajouter une étape (
) pour ajouter une étape avec code personnalisé. - Dans la barre latérale d’étape, cliquez sur Ajouter une entrée.
- Sous Sélectionner une variable, sélectionnez une variable d’une étape précédente ou le déclencheur du workflow d’actions.Remarque – Le type de données de l’entrée est déduit de la variable sélectionnée.
- Vérifiez la valeur du nom de l’entrée, qui est automatiquement renseigné en fonction de la variable sélectionnée, mais qui est modifiable. Les noms des entrées doivent satisfaire ces exigences.
- Cliquez sur Enregistrer.
Ajout de sorties aux étapes avec code personnalisé
- Ouvrez un workflow d’actions.
- Dans le Créateur d’actions, cliquez sur une étape avec code personnalisé existante ou sur l’icône Ajouter une étape (
) pour ajouter une étape avec code personnalisé. - Dans la barre latérale d’étape, cliquez sur Ajouter une sortie.
- Saisissez un nom unique pour la sortie.
Les noms des sorties doivent satisfaire ces exigences.
- Sélectionnez le type de données pour la sortie.
- Cliquez sur Enregistrer.
Ajout de votre code personnalisé
Le code JavaScript dans les étapes avec code personnalisé doit exporter une fonction qui prend un objet entrées et renvoie un objet sorties. Chaque fois que vous ajoutez une étape avec code personnalisé à un workflow d’actions, elle est pré-remplie avec ce cadre, que vous pouvez modifier, développer ou supprimer pour commencer de zéro.
Bien que l’étape avec code personnalisé soit conçue pour être la plus conviviale et intuitive possible, les administrateurs peuvent cependant avoir besoin de l’aide des ingénieurs pour implémenter ces étapes.
- Le code d’une étape ne doit pas dépasser 10 000 caractères.
- Votre code personnalisé doit renvoyer une valeur pour chaque sortie définie pour l’étape.
- Le code que vous utilisez dans les workflows d’actions doit s’exécuter rapidement et utiliser une quantité de mémoire raisonnable.
- Les restrictions JavaScript suivantes s’appliquent :
- La fonction doit être synchrone. Cela signifie qu’il n’y a pas de prise en charge de
async,awaitetpromise. - Les demandes réseau, comme
fetch,XMLHttpRequestet jQuery AJAX, ne sont pas prises en charge. - Vous ne pouvez pas utiliser
importourequirepour des bibliothèques ou des modules externes.
- La fonction doit être synchrone. Cela signifie qu’il n’y a pas de prise en charge de
- Ouvrez un workflow d’actions.
- Dans le Créateur d’actions, cliquez sur une étape avec code personnalisé existante ou sur l’icône Ajouter une étape (
) pour ajouter une étape avec code personnalisé. - Sous Code, développez l’exemple fourni, supprimez-le et rédigez votre propre logique, ou utilisez une invite pour que l’IA génère votre code personnalisé.Votre code doit exporter une fonction qui prend un objet entrées et renvoie un objet sorties. Par exemple :
// In the Inputs section for this step, add an input named status. // In the Outputs section for this step, add a text output named message. module.exports = (inputs) => { // Access inputs using inputs.<name> const msg = 'Your text was ' + inputs.status + '.' // This return must include all outputs. return { message: msg } }Remarque – Quand vous rédigez votre code, l’éditeur vous suggère pour des opérations JavaScript valides. Les fautes de frappe et le code non valide sont soulignés avec une ligne ondulée rouge. Placez votre curseur sur la section soulignée pour afficher le message d’erreur. - Cliquez sur Enregistrer.
Types de données pris en charge pour les entrées et sorties de code personnalisé
L’étape avec code personnalisé accepte et renvoie les types de données ci-dessous (ils s’affichent dans votre code sous la forme des types JavaScript équivalents).
| Type d’entrée | Type de données JavaScript | Exemple |
|---|---|---|
| Texte | chaîne | « Bonjour ! » |
| Nombre | chiffre | 123, -5, 0 |
| Décimal | chiffre | 12.67, 1.0, 0.0 |
| Vrai/faux | booléen | Vrai/faux |
| Date | chaîne | « 2025-10-27 » |
| Date et heure* | chaîne |
Date et heure UTC : « 2025-10-27T10:30:00Z » Date et heure avec décalage horaire : « 2025-06-22T05:11:28+10:00 » Date et heure UTC avec millisecondes : « 2025-03-08T06:01:21.415Z » Date et heure avec décalage horaire et millisecondes : « 2025-07-23T13:33:17.031-3:00 » |
| Tableau de texte | tableau de chaînes | [« Bonjour ! », « Comment allez-vous ? »] |
| Tableau de nombres | tableau de nombres | [12, 34, 56, 0] |
| Tableau décimal | tableau de nombres | 2.1, 6.3, 6.01, 0.1 |
| Tableau vrai/faux | tableau de booléens | [true, true, false] |
| Tableau de dates | tableau de chaînes | [« 1997-08-29 », « 2004-07-25 », « 2011-04-21 »] |
| Tableau date/heure | tableau de chaînes | [« 1977-05-25T12:45Z », « 1980-05-21T15:00Z », « 1983-05-25T19:30Z »] |
- Objet
- Tableau d’objets
- Tableau mixte
- Tableau de tableaux
Modèles d’invites d’IA permettant de générer du code JavaScript pour les étapes de votre workflow d’actions
Les invites suivantes peuvent être utilisées avec des outils d’IA, comme ChatGPT, pour générer le code pour votre étape avec code personnalisé. Les invites incluent des conseils sur les types de données prises en charge et la structure requise pour le code.
Invite 1
Write a piece of JavaScript code. The code must export a function that takes an inputs object and returns an outputs object, for example:
module.exports = (inputs) => {
let msg = "Your text was " + inputs.inputText + "."
return {
outputMessage: msg
}
}
Supported data types:
Strings, numbers, booleans, dates (YY-MM-DD) and datetimes (YY-MM-DDTHH:mm:SSZ) are supported. Arrays of those are supported too.
Objects, arrays of arrays, and arrays of objects are not supported. When used as inputs or outputs they must be stringified and passed as strings.
Check for missing or invalid data, and ensure it is handled gracefully by returning a valid output:
for strings, output the empty string ""
for numbers, output -1
for booleans, output false
for arrays, output the empty array []
for objects, output the empty object {}
Comment the code:
Include a comment at the top which briefly describes what the code does.
Include comments directing the reader to create the inputs and outputs, for example: // Make sure to create the following inputs: field_tag (Text).
In comments, refer to variable types with the following friendly names:
string: use "Date" for dates, "Date and time" for datetimes, else use "Text"
number: use "Number” or "Decimal"
boolean: use "True/False"
array: use "Number array", "Text array" etc
The code should... <DESCRIBE WHAT YOU WANT YOUR CODE TO DO HERE>
Invite 2
Write a piece of JavaScript code. The code must export a function that takes an inputs object and returns an outputs object, for example:
module.exports = (inputs) => {
let msg = "Your text was " + inputs.inputText + "."
return {
outputMessage: msg
}
}
Supported input and output data types:
Strings, numbers, booleans, dates (YY-MM-DD) and datetimes (YY-MM-DDTHH:mm:SSZ) are supported. Arrays of those are supported too.
Objects, arrays of arrays, and arrays of objects are not supported. When used as inputs or outputs they must be stringified and passed as strings.
Comment the code:
Include a comment at the top which briefly describes what the code does.
Include comments directing the reader to create the inputs and outputs, for example: // Make sure to create the following inputs: field_tag (Text).
In comments, refer to variable types with the following friendly names:
string: use "Date" for dates, "Date and time" for datetimes, else use "Text"
number: use "Number" or "Decimal"
boolean: use "True/False"
array: use "Number array", "Text array" etc
The code should... <DESCRIBE WHAT YOU WANT YOUR CODE TO DO HERE>
Exemples d’étapes avec code personnalisé
- Formatage des détails de ticket de base en commentaire dans un format lisible
- Calcul de l’heure suivante à partir de maintenant
- Validation du formatage pour une adresse e-mail
- Masquage d’une adresse e-mail
- Mappage d’un identifiant interne avec un nom dans un format lisible
- Détection des éléments d’une liste qui commencent par des caractères spécifiques
- Comparaison de deux listes de valeurs
- Recherche d’un ID de commande dans un texte
- Génération d’un nombre aléatoire
- Génération de trois nombres aléatoires entre un et sept
Formatage des détails de ticket de base en commentaire dans un format lisible
module.exports = (inputs) => {
// This code takes text inputs 'status' and 'priority', and a number input 'ticket_id', and outputs a friendly message combining these values.
// Make sure to create the following inputs:
// status (Text)
// priority (Text)
// ticket_id (Number)
const message = `Ticket ${inputs.ticket_id} has status ${inputs.status} and priority ${inputs.priority}.`
// Make sure to create the following outputs:
// message (Text)
return {
message,
}
}
Calcul de l’heure suivante à partir de maintenant
Dans cet exemple, l’heure est actuellement 2025-10-27T09:17:00Z. Donc le code suivant renvoie 2025-10-27T10:00:00Z.
module.exports = (inputs) => {
// This code calculates the next full hour from the current UTC time
// No inputs required
// Make sure to create the following outputs:
// nextHour (Date and time)
// Create a Date object for the current time
const nextHour = new Date()
// Round up to the next hour by:
// 1. Setting minutes, seconds, and milliseconds to 0
nextHour.setUTCMinutes(0, 0, 0)
// 2. Adding 1 hour
nextHour.setUTCHours(nextHour.getUTCHours() + 1)
return {
nextHour: nextHour.toISOString(),
}
}
Validation du formatage pour une adresse e-mail
module.exports = (inputs) => {
// This code takes a text input 'emailAddress',
// uses regex to do a basic check whether it is a valid email format,
// and outputs a boolean 'emailIsValid'.
// Make sure to create the following inputs:
// emailAddress (Text)
// Simple email regex pattern
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
const emailIsValid = emailRegex.test(inputs.emailAddress)
// Make sure to create the following outputs:
// emailIsValid (True/False)
return {
emailIsValid
}
}
Masquage d’une adresse e-mail
Cet exemple remplace des portions d’une adresse e-mail par des astérisques. Par exemple, « Pourriez-vous confirmer que votre adresse e-mail est bien d******n@zendesk.com ? ».
// This code takes an email address input and returns a masked version where the local part is partially replaced with '*', preserving the first and last characters.
// Make sure to create the following input:
// emailToMask (Text)
// Make sure to create the following output:
// maskedEmail (Text)
module.exports = (inputs) => {
const [emailName, emailDomain] = inputs.emailToMask.split("@")
let maskedEmailName = emailName
if (emailName.length > 2) {
maskedEmailName = emailName[0]
maskedEmailName += "*".repeat(emailName.length-2)
maskedEmailName += emailName[emailName.length-1]
}
return {
maskedEmail: `${maskedEmailName}@${emailDomain}`
}
}
Mappage d’un identifiant interne avec un nom dans un format lisible
Ce type de mappage est pratique pour convertir les identifiants internes, comme le marqueur d’un champ de ticket de liste déroulante, en noms plus conviviaux, comme une valeur affichée dans une liste déroulante.
- Traduction des ID de canaux Slack en noms de canaux
- Conversion des ID de projets JIRA en noms de projets
- Mappage des statuts des tickets Zendesk avec les statuts des tickets JIRA correspondants
const optionMap = {
option_01_ivory: 'ivory',
option_02_cream: 'cream',
option_03_white: 'white',
option_04_bone: 'bone',
}
module.exports = (inputs) => {
// This code takes a text input 'optionTag',
// and outputs the corresponding 'optionName' based on a predefined mapping.
// If the input is missing or does not match any tag, it returns an empty string.
// Make sure to create the following inputs:
// optionTag (Text)
const optionName = optionMap[inputs.optionTag] || ''
// Make sure to create the following outputs:
// optionName (Text)
return {
optionName,
}
}
Détection des éléments d’une liste qui commencent par des caractères spécifiques
Cet exemple vérifie si certains éléments d’une liste commencent par des caractères spécifiques. Par exemple, si vous cherchez les éléments qui commencent par « client » et que votre liste de marqueurs contient [“bug_critique”, “client_24601”, “remontée”], le résultat serait true, car « client_24601 » commence par « client ».
module.exports = (inputs) => {
// This code takes a text array 'tags' and a text string 'searchTerm',
// and outputs a boolean 'matchFound' indicating whether any tag begins with the searchTerm.
// Make sure to create the following inputs:
// tags (Text array)
// searchTerm (Text)
const matchFound = inputs.tags.some(tag => tag.startsWith(inputs.searchTerm))
// Make sure to create the following outputs:
// matchFound (True/False)
return {
matchFound
}
}
Comparaison de deux listes de valeurs
Cet exemple compare deux listes et supprime de la première toutes les valeurs qui sont aussi présentes dans la seconde.
Par exemple, supposons que vous avez une liste de CC pour les tickets et une liste d’utilisateurs interdits, les utilisateurs interdits trouvés dans la liste de CC seront exclus de la liste de sortie (cleanCCs). Cette méthode peut aussi être utilisée pour filtrer et éliminer les marqueurs qui doivent être supprimés d’un ticket ou d’un utilisateur.
module.exports = (inputs) => {
// This code takes two number arrays: ticketCCs and disallowedUsers,
// and outputs a number array cleanCCs which includes only those items from ticketCCs that are NOT in disallowedUsers.
// Make sure to create the following inputs:
// ticketCCs (Number array)
// disallowedUsers (Number array)
const cleanCCs = inputs.ticketCCs.filter(cc => !inputs.disallowedUsers.includes(cc))
// Make sure to create the following outputs:
// cleanCCs (Number array)
return {
cleanCCs,
}
}
Recherche d’un ID de commande dans un texte
Cet exemple extrait un ID de commande d’une chaîne de texte, comme un commentaire de ticket. Vous pouvez modifier l’expression régulière (/GO-\d{8,9}/) pour qu’elle corresponde à votre format d’ID de commande spécifique.
// Regex for order number: "GO-" followed by 8 or 9 digits
const ORDER_NUMBER_REGEX = /GO-\d{8,9}/
// Searches comment for order number and returns it if found.
const findOrderNumber = comment => comment.match(ORDER_NUMBER_REGEX)[0]
module.exports = (inputs) => {
// This code uses regex to look for an orderNumber with pattern "GO-" followed by 8 or 9 digits
// Make sure to create the following inputs:
// commentBody (Text)
const orderNumber = findOrderNumber(inputs.commentBody)
// Make sure to create the following outputs:
// orderNumber (Text)
// matchFound (True/False)
return {
orderNumber,
matchFound: Boolean(orderNumber),
}
}
Génération d’un nombre aléatoire
Cet exemple génère un nombre aléatoire avec les limites que vous spécifiez. Vous pouvez modifier la valeur 52 afin de configurer la limite supérieure de votre choix pour votre nombre aléatoire.
module.exports = (inputs) => {
// This code outputs a random integer number between 1 and 52 inclusive.
// No inputs required.
// Make sure to create the following outputs:
// randomNumber (Number)
const randomNumber = Math.floor(Math.random() * 52) + 1
return {
randomNumber
}
}
Génération de trois nombres aléatoires entre un et sept
module.exports = (inputs) => {
// This code outputs three unique random integer numbers between 1 and 7 inclusive.
// No inputs required.
// Make sure to create the following outputs:
// randomNumber1 (Number)
// randomNumber2 (Number)
// randomNumber3 (Number)
const numbers = []
while (numbers.length < 3) {
const candidate = Math.floor(Math.random() * 7) + 1
if (!numbers.includes(candidate)) {
numbers.push(candidate)
}
}
return {
randomNumber1: numbers[0],
randomNumber2: numbers[1],
randomNumber3: numbers[2]
}
}
module.exports = (inputs) => {
// This code outputs an array of three unique random numbers between 1 and 7 inclusive.
// No inputs required.
// Make sure to create the following outputs:
// randomNumbers (Number array)
const numbers = []
while (numbers.length < 3) {
const candidate = Math.floor(Math.random() * 7) + 1
if (!numbers.includes(candidate)) {
numbers.push(candidate)
}
}
return {
randomNumbers: numbers
}
}