Um fluxo de ação é um fluxo de trabalho automatizado e definido pelo usuário. Cada fluxo de ação consiste em um gatilho, que inicia o fluxo, e em uma ou mais ações.
As etapas de código personalizado permitem executar JavaScript personalizado para fazer transformações de dados complexas, formatação e lógica avançada que não são possíveis com as ações e etapas predefinidas. Por exemplo, você pode usar uma etapa de código personalizado para mascarar partes confidenciais de um endereço de e-mail, validar o formato de um e-mail ou um ID de pedido, ou até mesmo para calcular datas futuras para o envio de lembretes de acompanhamento.
Adição e configuração de etapas de código personalizado
Se você precisa executar código como parte de um fluxo de ação, pode adicionar uma etapa de código personalizado. Consulte os tipos de dados com suporte para saber quais tipos de dados têm suporte para entradas e saídas de etapas de código personalizado.
- Abra um fluxo de ação.
- No criador de ações, abaixo de uma etapa existente, clique no ícone Adicionar etapa (
). - Na barra lateral da etapa, em Controle de fluxo e utilitários, clique em Código personalizado.
- Na barra lateral da etapa, clique em Adicionar entrada para adicionar entradas para o código personalizado.
- Na barra lateral da etapa, clique em Adicionar saída para adicionar pelo menos uma saída.
- Na barra lateral da etapa, em Código, insira seu código JavaScript personalizado.
- Clique em Salvar.
Para garantir que o código personalizado funcione conforme o esperado, teste seu fluxo de ação. Se você encontrar problemas, consulte Resolução de problemas em etapas de código personalizado.
Adição de entradas a etapas de código personalizado
As etapas de código personalizado podem ter no máximo 25 entradas.
- Abra um fluxo de ação.
- No criador de ações, clique em uma etapa de código personalizado existente ou clique no ícone Adicionar etapa (
) para adicionar uma etapa de código personalizado. - Na barra lateral da etapa, clique em Adicionar entrada.
- Em Selecione a variável,selecione uma variável de uma etapa anterior ou do gatilho do fluxo de ação.Observação: o tipo de dados da entrada é inferido a partir da variável selecionada.
- Verifique o valor do nome de entrada, que é preenchido automaticamente com base na variável selecionada, mas pode ser editado. Os nomes de entrada devem cumprir estes requisitos.
- Clique em Salvar.
Adição de saídas a etapas de código personalizado
- Abra um fluxo de ação.
- No criador de ações, clique em uma etapa de código personalizado existente ou clique no ícone Adicionar etapa (
) para adicionar uma etapa de código personalizado. - Na barra lateral da etapa, clique em Adicionar saída.
- Insira um nome exclusivo para a saída.
Ele deve cumprir estes requisitos.
- Selecione o tipo de dados da saída.
- Clique em Salvar.
Adição de código personalizado
O JavaScript nas etapas de código personalizado deve exportar uma função que recebe um objeto de entrada e retorna um objeto de saída. Cada vez que você adiciona uma etapa de código personalizado a um fluxo de ação, ela é preenchida automaticamente com essa estrutura, que você pode modificar, expandir ou apagar e começar do zero.
Embora a etapa de código personalizado seja projetada para ser o mais fácil de usar possível, os administradores ainda podem precisar de suporte técnico ao implementar essas etapas.
- O código para uma etapa pode ter no máximo 10.000 caracteres.
- O código personalizado deve retornar um valor para cada saída definida para a etapa.
- O código utilizado nos fluxos de ação deve ser executado rapidamente e usar uma quantidade razoável de memória.
- As seguintes restrições de JavaScript se aplicam:
- A função deve ser síncrona. Isso significa que não há suporte para o uso de
async,awaitepromise. - Não há suporte para solicitações de rede, como
fetch,XMLHttpRequeste jQuery AJAX. - Não é possível
importnemrequirebibliotecas ou módulos externos.
- A função deve ser síncrona. Isso significa que não há suporte para o uso de
- Abra um fluxo de ação.
- No criador de ações, clique em uma etapa de código personalizado existente ou clique no ícone Adicionar etapa (
) para adicionar uma etapa de código personalizado. - Em Código, você pode expandir o exemplo fornecido, apagar o exemplo e escrever sua própria lógica ou usar uma solicitação de IA para gerar um código personalizado.O código deve exportar uma função que recebe um objeto de entrada e retorna um objeto de saída. Por exemplo:
// 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 } }Observação: à medida que você escreve seu código, o editor oferece sugestões úteis para operações válidas em JavaScript. Erros de digitação e códigos inválidos são marcados com um sublinhado vermelho ondulado. Passe o cursor do mouse sobre a parte sublinhada para visualizar a mensagem de erro. - Clique em Salvar.
Tipos de dados com suporte para entradas e saídas de código personalizado
A etapa de código personalizado aceita e retorna os seguintes tipos de dados, cada um dos quais aparece em seu código como o tipo JavaScript equivalente.
| Tipo de entrada | Tipo de dados JavaScript | Exemplo |
|---|---|---|
| Texto | cadeia de caracteres | "Olá!" |
| Número | número | 123, -5, 0 |
| Decimal | número | 12.67, 1.0, 0.0 |
| Verdadeiro/falso | booliano | true, false |
| Data* | cadeia de caracteres | "2025-10-27" |
| Data e hora* | cadeia de caracteres |
Uma data e hora em UTC "2025-10-27T10:30:00Z" Uma data e hora com um deslocamento de fuso horário: "2025-06-22T05:11:28+10:00" Uma data e hora em UTC com milissegundos: "2025-03-08T06:01:21.415Z" Uma data e hora com deslocamento de fuso horário e milissegundos:"2025-07-23T13:33:17.031-3:00" |
| Matriz de texto | matriz de cadeia de caracteres | ["Olá!", "Como você está?"] |
| Matriz numérica | matriz de números | [12, 34, 56, 0] |
| Matriz decimal | matriz de números | [2.1, 6.3, 6.01, 0.1] |
| Matriz verdadeira/falsa | matriz de boolianos | [true, true, false] |
| Matriz de datas | matriz de cadeia de caracteres | ["1997-08-29", "2004-07-25", "2011-04-21"] |
| Matriz de data/hora | matriz de cadeia de caracteres | ["1977-05-25T12:45Z", "1980-05-21T15:00Z", "1983-05-25T19:30Z"] |
- Objeto
- Matriz de objeto
- Matriz mista
- Matriz matriz
Modelos de solicitação de IA para gerar código JavaScript personalizado para a etapa do seu fluxo de ação
A seguintes solicitações podem ser usadas com ferramentas de IA, como o ChatGPT, para gerar código para sua etapa de código personalizado. As solicitações incluem orientações sobre os tipos de dados permitidos e a estrutura necessária do código.
Solicitação 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>
Solicitação 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>
Exemplos de etapas de código personalizado
- Formatação dos detalhes básicos do ticket em um comentário legível por humanos
- Cálculo da próxima hora a partir de agora
- Validação da formatação de um endereço de e-mail
- Mascaramento de um endereço de e-mail
- Mapeamento de um identificador interno para um nome legível por humanos
- Verificação de itens começando com caracteres específicos em uma lista
- Comparação de duas listas de valores
- Localização do ID de um pedido no texto
- Geração de um número aleatório
- Geração de três números aleatórios entre um e sete
Formatação dos detalhes básicos do ticket em um comentário legível por humanos
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,
}
}
Cálculo da próxima hora a partir de agora
No exemplo, o horário atual é 2025-10-27T09:17:00Z. Consequentemente, o código a seguir retorna 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(),
}
}
Validação da formatação de um endereço de 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
}
}
Mascaramento de um endereço de e-mail
Este exemplo substitui partes de um endereço de e-mail por caracteres de asterisco. Por exemplo: "Poderia confirmar se o seu endereço de e-mail é 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}`
}
}
Mapeamento de um identificador interno para um nome legível por humanos
Mapeamentos como este são úteis para converter IDs internos, como a tag de um campo de lista suspensa de um ticket, em nomes mais fáceis de entender para o usuário, como um valor exibido em uma lista suspensa.
- Converter IDs de canais do Slack em nomes de canais
- Converter IDs de projetos do JIRA em nomes de projetos
- Mapear status de tickets do Zendesk para os status de problemas correspondentes no 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,
}
}
Verificação de itens começando com caracteres específicos em uma lista
Este exemplo verifica se algum item em uma lista começa com caracteres específicos. Por exemplo, se você está procurando itens que começam com “customer” e sua lista de tags contém [“critical_bug”, “customer_24601”, “escalation”], o resultado será true porque “customer_24601” começa com “customer”.
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
}
}
Comparação de duas listas de valores
Este exemplo compara duas listas e remove todos os valores da primeira lista que também estão presentes na segunda.
Por exemplo, dada uma lista de CCs de tickets e uma lista de usuários não permitidos, quaisquer usuários não permitidos encontrados na lista de CCs são excluídos da lista de saída (cleanCCs). Esse método também pode ser usado para filtrar tags que devem ser removidas de um ticket ou usuário.
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,
}
}
Localização do ID de um pedido no texto
Este exemplo extrai um ID de pedido de uma cadeia de caracteres de texto, como um comentário em um ticket. Você pode ajustar a expressão regular (/GO-\d{8,9}/) conforme necessário para corresponder ao formato específico do seu ID de 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),
}
}
Geração de um número aleatório
Este exemplo gera um número aleatório dentro dos limites que você especifica. Você pode alterar o valor 52 para definir o limite máximo desejado para o número aleatório.
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
}
}
Geração de três números aleatórios entre um e sete
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
}
}