Mon édition
Suite, toutes les versions Growth, Professional, Enterprise ou Enterprise Plus

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.

Cet article aborde les sujets suivants :
  • Ajout et configuration d’étapes avec code personnalisé
  • Types de données pris en charge pour les entrées et sorties de code personnalisé
  • Modèles d’invites d’IA permettant de générer du code JavaScript pour les étapes de votre workflow d’actions
  • Exemples d’étapes avec code personnalisé

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é.

Pour ajouter du code personnalisé à un workflow d’actions
  1. Ouvrez un workflow d’actions.
  2. Dans le créateur d’actions, sous une étape existante, cliquez sur l’icône Ajouter une étape ().
  3. Dans la barre latérale d’étape, sous Contrôle des workflows et des services, cliquez sur Code personnalisé.
  4. Dans la barre latérale d’étape, cliquez sur Ajouter une entrée pour ajouter des entrées pour le code personnalisé.
  5. Dans la barre latérale d’étape, cliquez sur Ajouter une sortie pour ajouter au moins une sortie.
  6. Dans la barre latérale d’étape, sous Code, saisissez votre code JavaScript personnalisé.
  7. 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.

Pour ajouter des entrées aux étapes avec code personnalisé
  1. Ouvrez un workflow d’actions.
  2. 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é.
  3. Dans la barre latérale d’étape, cliquez sur Ajouter une entrée.
  4. 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.
  5. 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.
  6. Cliquez sur Enregistrer.

Ajout de sorties aux étapes avec code personnalisé

Les étapes avec code personnalisé doivent avoir au moins 1 sortie et ne peuvent pas en avoir plus de 25.
Remarque – Votre code personnalisé doit renvoyer une valeur pour chaque sortie définie.
Pour ajouter des sorties aux étapes avec code personnalisé
  1. Ouvrez un workflow d’actions.
  2. 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é.
  3. Dans la barre latérale d’étape, cliquez sur Ajouter une sortie.
  4. Saisissez un nom unique pour la sortie.

    Les noms des sorties doivent satisfaire ces exigences.

  5. Sélectionnez le type de données pour la sortie.
  6. 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.

N’oubliez pas les exigences, limitations et restrictions suivantes :
  • 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, await et promise.
    • Les demandes réseau, comme fetch, XMLHttpRequest et jQuery AJAX, ne sont pas prises en charge.
    • Vous ne pouvez pas utiliser import ou require pour des bibliothèques ou des modules externes.
Pour ajouter votre code personnalisé
  1. Ouvrez un workflow d’actions.
  2. 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é.
  3. 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.
  4. 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 »]
Remarque - * Les entrées de date et date/heure sont fournies à votre code sous la forme de chaînes. Pour effectuer des opérations sur les dates, vous devez d’abord convertir ces valeurs en objets Date JavaScript Date.
Les types de données suivants ne sont pas pris en charge comme sorties (si vous avez besoin de renvoyer l’un de ces types de données, commencez par le convertir en chaîne avant de le renvoyer comme Texte ou Tableau de texte) :
  • 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é

Les exemples suivants montrent comment l’étape avec code personnalisé peut être utilisée dans des scénarios d’automatisation courants :
  • 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
Remarque – Zendesk fournit ces exemples JavaScript à titre informatif uniquement. Zendesk ne garantit pas la compatibilité avec votre cas d’utilisation spécifique et ne fournit pas l’assistance pour la rédaction ou le débogage de code JavaScript personnalisé. Commencez toujours par tester votre code dans un environnement de test et évitez d’inclure des données sensibles.

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.

Vous pouvez utiliser cette approche pour des tâches comme :
  • 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

L’exemple suivant renvoie trois nombres aléatoires comme sorties individuelles :
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]
  }
}
Cet exemple renvoie trois nombres aléatoires dans un tableau, et non pas individuellement.
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
  }
}
Réalisé par Zendesk