¿Qué plan tengo?
Suite, todas las versiones Growth, Professional, Enterprise o Enterprise Plus

Un flujo de acción es un flujo de trabajo automatizado definido por el usuario. Cada flujo de acción consta de un disparador de flujo de acción, que inicia el flujo, y una o más acciones.

Los pasos de código personalizado permiten ejecutar JavaScript personalizado para realizar transformaciones de datos complejas, formateo y lógica avanzada que no son posibles con las acciones y los pasos predefinidos. Por ejemplo, podría usar un paso de código personalizado para tomar información para enmascarar las partes confidenciales de una dirección de correo electrónico, validar el formato de un correo electrónico o la ID de un pedido, o incluso para calcular fechas futuras para recordatorios de seguimiento.

En este artículo se tratan los siguientes temas:
  • Agregar y configurar pasos de código personalizado
  • Tipos de datos admitidos para las entradas y salidas de código personalizado
  • Plantillas de indicaciones de IA para generar código de JavaScript personalizado para el paso de flujo de acción
  • Ejemplos de pasos de código personalizado

Agregar y configurar pasos de código personalizado

Si tiene que ejecutar código como parte de un flujo de acción, puede agregar un paso de código personalizado. Consulte Tipos de datos admitidos para averiguar qué tipos de datos son compatibles para las entradas y salidas de los pasos de código personalizado.

Para agregar código personalizado a un flujo de acción
  1. Abra un flujo de acción.
  2. En el generador de acciones, debajo de un paso existente, haga clic en el icono Agregar paso ().
  3. En la barra lateral de pasos, bajo Control de flujos y utilidades, haga clic en Código personalizado.
  4. En la barra lateral de pasos, haga clic en Agregar entrada para agregar entradas para el código personalizado.
  5. En la barra lateral de pasos, haga clic en Agregar salida para agregar por lo menos una salida.
  6. En la barra lateral de pasos, bajo Código, ingrese su código de JavaScript personalizado.
  7. Haga clic en Guardar.

Para asegurarse de que el código personalizado esté funcionando como se espera, pruebe su flujo de acción. Si se encuentra con problemas, consulte Resolver los problemas en los pasos de código personalizado.

Agregar entradas a los pasos de código personalizado

Los pasos de código personalizado pueden tener un máximo de 25 entradas.

Para agregar entradas a un paso de código personalizado
  1. Abra un flujo de acción.
  2. En el generador de acciones, haga clic en un paso de código personalizado existente o haga clic en el icono Agregar paso () para agregar un paso de código personalizado.
  3. En la barra lateral de pasos, haga clic en Agregar entrada.
  4. Bajo Seleccionar variable, seleccione una variable de un paso anterior o del disparador de flujo de acción.
    Nota: El tipo de datos de la entrada se deduce de la variable seleccionada.
  5. Verifique el valor Nombre de la entrada, que se rellena automáticamente en función de la variable seleccionada pero se puede editar. Los nombres de las entradas deben cumplir los requisitos.
  6. Haga clic en Guardar.

Agregar salidas a los pasos de código personalizado

Los pasos de código personalizado deben tener por lo menos 1 salida pero pueden tener hasta 25.
Nota: Su código personalizado debe devolver un valor para cada salida definida.
Para agregar salidas a un paso de código personalizado
  1. Abra un flujo de acción.
  2. En el generador de acciones, haga clic en un paso de código personalizado existente o haga clic en el icono Agregar paso () para agregar un paso de código personalizado.
  3. En la barra lateral de pasos, haga clic en Agregar salida.
  4. Escriba un Nombre único para la salida.

    El nombre debe cumplir los requisitos.

  5. Seleccione el Tipo de datos de la salida.
  6. Haga clic en Guardar.

Agregar su código personalizado

El JavaScript en los pasos de código personalizado debe exportar una función que toma un objeto inputs y devuelve un objeto outputs. Cada vez que se agregue un paso de código personalizado a un flujo de acción, ya incluirá este framework, que se puede modificar, ampliar o borrar y comenzar otra vez.

Aunque el paso de código personalizado ha sido diseñado para ser lo más fácil de usar posible, no sería extraño que los administradores necesiten ayuda del departamento de ingeniería al implementar estos pasos.

Tenga en cuenta los siguientes requisitos, limitaciones y restricciones:
  • El código para un paso puede tener un máximo de 10.000 caracteres.
  • Su código personalizado debe devolver un valor para cada salida definida para el paso.
  • El código que se usa en los flujos de acción debe poder ejecutarse rápidamente y usar una cantidad razonable de memoria.
  • Se aplican las siguientes restricciones de JavaScript:
    • La función tiene que ser sincrónica. Eso quiere decir que no se admiten async, await y promise.
    • No se admiten las solicitudes de red, como fetch, XMLHttpRequest y jQuery AJAX.
    • No se pueden import (importar) o require (requerir) bibliotecas o módulos externos.
Para agregar su código personalizado
  1. Abra un flujo de acción.
  2. En el generador de acciones, haga clic en un paso de código personalizado existente o haga clic en el icono Agregar paso () para agregar un paso de código personalizado.
  3. Bajo Código, amplíe el ejemplo proporcionado, borre el ejemplo y escriba su propia lógica o utilice una indicación de IA para generar código personalizado.
    Su código debe exportar una función que tome un objeto inputs y devuelva un objeto outputs. Por ejemplo:
    // 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
      }
    }
    Nota: A medida que vaya escribiendo su código, el editor irá ofreciendo sugerencias útiles para operaciones válidas de JavaScript. Los errores tipográficos y el código no válido se marcan con un subrayado rojo ondulado. Pase el mouse por encima de la sección subrayada para ver el mensaje de error.
  4. Haga clic en Guardar.

Tipos de datos admitidos para las entradas y salidas de código personalizado

El paso de código personalizado acepta y devuelve los siguientes tipos de datos, y cada uno aparece en el código como el tipo equivalente de JavaScript.

Tipo de entrada Tipo de datos de JavaScript Ejemplo
Texto cadena “¡Hola!”
Número número 123, -5, 0
Decimal número 12.67, 1.0, 0.0
Verdadero/falso booleano verdadero, falso
Fecha* cadena "2025-10-27"
Fecha y hora* cadena

Una fecha y hora UTC

"2025-10-27T10:30:00Z"

Una fecha y hora con compensación de zona horaria:

"2025-06-22T05:11:28+10:00"

Una fecha y hora UTC con milisegundos:

"2025-03-08T06:01:21.415Z"

Una fecha y hora con compensación de zona horaria y milisegundos:"2025-07-23T13:33:17.031-3:00"
Matriz de texto matriz de cadenas ["¡Hola!", "¿Cómo le va"]
Matriz de números matriz de números [12, 34, 56, 0]
Matriz de decimal matriz de números [2.1, 6.3, 6.01, 0.1]
Matriz de verdadero/falso matriz de booleanos [verdadero, verdadero, falso]
Matriz de fechas matriz de cadenas ["1997-08-29", "2004-07-25", "2011-04-21"]
Matriz de fecha-hora matriz de cadenas ["1977-05-25T12:45Z", "1980-05-21T15:00Z", "1983-05-25T19:30Z"]
Nota: * Las entradas de fecha y fecha-hora se proporcionan para el código como cadenas. Para realizar operaciones de fecha, primero convierta estos valores a objetos Date de JavaScript.
Los siguientes tipos de datos no se admiten como salidas. Si necesita devolver uno de estos tipos, conviértalo a una cadena antes de generarlo como Texto o Matriz de texto:
  • Objeto
  • Matriz de objetos
  • Matriz mixta
  • Matriz de matriz

Plantillas de indicaciones de IA para generar código de JavaScript personalizado para el paso de flujo de acción

Las siguientes indicaciones se pueden usar con las herramientas de IA, como ChatGPT, para generar código para su paso de código personalizado. Las indicaciones incluyen orientación acerca de los tipos de datos admitidos y la estructura requerida para el código.

Indicación 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>

Indicación 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>

Ejemplos de pasos de código personalizado

Los siguientes ejemplos muestran cómo el paso de código personalizado se puede usar para atender escenarios comunes de automatización:
  • Formatear los detalles básicos del ticket y convertirlos en un comentario legible para el ser humano
  • Calcular la próxima hora a partir de ahora
  • Validar el formato de una dirección de correo electrónico
  • Enmascarar una dirección de correo electrónico
  • Mapear un identificador interno a un nombre legible para el ser humano
  • Verificar si hay elementos en la lista que comienzan con caracteres específicos
  • Comparar dos listas de valores
  • Encontrar la ID de un pedido dentro de texto
  • Generar un número aleatorio
  • Generar tres números aleatorios entre uno y siete
Nota: Zendesk ofrece estos ejemplos de JavaScript con fines informativos únicamente. Zendesk no garantiza la compatibilidad con ningún uso en particular ni ofrece soporte para escribir o depurar el JavaScript personalizado. Siempre pruebe el código en un entorno de prueba primero, y evite incluir datos confidenciales.

Formatear los detalles básicos del ticket y convertirlos en un comentario legible para el ser humano

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,
  }
}

Calcular la próxima hora a partir de ahora

En el ejemplo, la hora actual es 2025-10-27T09:17:00Z. Por lo tanto, el siguiente código devuelve 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(),
  }
}

Validar el formato de una dirección de correo electrónico

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
  }
}

Enmascarar una dirección de correo electrónico

Este ejemplo reemplaza partes de una dirección de correo electrónico con caracteres de asterisco. Por ejemplo, ¿Podría confirmar que su dirección de correo electrónico es 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}`
  }
}

Mapear un identificador interno a un nombre legible para el ser humano

Los mapeos como estos son útiles para convertir las ID internas, como la etiqueta de un campo de ticket desplegable, a nombres más fáciles de comprender como un valor que se muestra en un menú desplegable.

Este método se puede usar para tareas como:
  • Traducir las ID del canal de Slack a nombres de canales
  • Convertir las ID de los proyectos de JIRA en nombres de proyectos
  • Mapear los estados de los tickets de Zendesk a los estados correspondientes de los asuntos de Jira
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,
  }
}

Verificar si hay elementos en la lista que comienzan con caracteres específicos

Este ejemplo verifica si hay elementos en la lista que comienzan con caracteres específicos. Por ejemplo, si está buscando elementos que comienzan con “cliente” y su lista de etiquetas contiene [“error_crítico”, “cliente_24601”, “escalamiento”], el resultado sería true porque “cliente_24601” comienza con “cliente”.

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
  }
}

Comparar dos listas de valores

Este ejemplo compara dos listas y elimina todos los valores de la primera lista que también están presentes en la segunda.

Por ejemplo, dada una lista de destinatarios CC de un ticket y una lista de usuarios no permitidos, los usuarios no permitidos que se encuentren en la lista de destinatarios CC serán excluidos de la lista de salida (cleanCCs). Este método también se puede usar para filtrar las etiquetas que deben eliminarse de un ticket o usuario.

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,
  }
}

Encontrar la ID de un pedido dentro de texto

Este ejemplo extrae la ID de un pedido de una cadena de texto, como un comentario de ticket. Puede ajustar la expresión regular (/GO-\d{8,9}/) de ser necesario para que coincida con el formato de la ID específica de su pedido.

// 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),
  }
}

Generar un número aleatorio

Este ejemplo genera un número aleatorio dentro de los límites especificados. Puede cambiar el valor 52 para establecer el límite superior que desee para el número aleatorio.

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
  }
}

Generar tres números aleatorios entre uno y siete

El siguiente ejemplo devuelve tres números aleatorios como salidas individuales:
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]
  }
}
Este ejemplo devuelve tres número aleatorios en una matriz y no individualmente:
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
  }
}
Tecnología de Zendesk