Funciones
Funciones de cadena
Al trabajar con cadenas dentro de expresiones, es importante usar comillas simples (’’) para encerrar cadenas literales. Sin embargo, surge una excepción cuando se quieren incluir comillas simples dentro de una cadena literal. En tales casos, puede usar comillas dobles ("") para encerrar toda la cadena.
Por ejemplo:
- Correcto: if(${yesno} = 1, “a string with ‘single quotes’ in it”, “no single quotes here”)
- Incorrecto: if(${yesno} = 1, ‘a string with ‘single quotes’ in it’, ’no single quotes here’)
Con respecto a las comillas tipográficas, es fundamental ser consciente de su presencia, ya que pueden causar problemas en las expresiones. Muchos editores de texto enriquecido convierten automáticamente las comillas rectas ("" o ‘’) en comillas tipográficas o curvas ("" o ‘’), lo que puede resultar en errores de sintaxis o comportamiento inesperado. Para evitar esto, asegúrese de usar consistentemente comillas rectas (’’) en sus expresiones.
rtSurvey admite varias funciones, incluyendo:
string(field): Convierte un campo a cadena.- Ejemplo:
string(34.8)se convertirá en'34.8'.
- Ejemplo:
string-length(field): Devuelve la longitud de un campo de cadena.- Ejemplo:
string-length(.) > 3 and string-length(.) < 10puede usarse para garantizar que el campo actual tenga entre 3 y 10 caracteres.
- Ejemplo:
substr(fieldorstring, startindex, endindex): Devuelve una subcadena que comienza enstartindexy termina justo antes deendindex. Los índices comienzan en 0 para el primer carácter de la cadena.- Ejemplo:
substr(${phone}, 0, 3)devolverá los primeros tres dígitos de un número de teléfono.
- Ejemplo:
concat(a, b, c, ...): Concatena campos (y/o cadenas) juntos.- Ejemplo:
concat(${firstname}, ' ', ${lastname})devolverá un nombre completo combinando los valores en los camposfirstnameylastname.
- Ejemplo:
linebreak(): Devuelve un carácter de salto de línea.- Ejemplo:
concat(${field1}, linebreak(), ${field2}, linebreak(), ${field3})devolverá una lista de tres valores de campo con saltos de línea entre ellos.
- Ejemplo:
lower(): Convierte una cadena a todos los caracteres en minúsculas.- Ejemplo:
lower('Street Name')devolverá “street name”.
- Ejemplo:
upper(): Convierte una cadena a todos los caracteres en mayúsculas.- Ejemplo:
upper('Street Name')devolverá “STREET NAME”.
- Ejemplo:
Funciones de select_one y select_multiple
count-selected(field): Devuelve el número de elementos seleccionados en un campo select_multiple.- Ejemplo:
count-selected(.) = 3puede usarse como expresión de restricción para garantizar que se seleccionen exactamente tres opciones.
- Ejemplo:
selected(field, value): Devuelve verdadero o falso dependiendo de si el valor especificado fue seleccionado en el campo select_one o select_multiple.- Ejemplo:
selected(${color}, 'Blue')puede usarse como expresión de relevancia para mostrar un grupo o campo solo si el encuestado seleccionó “Azul” como su color favorito. - Nota: El segundo parámetro siempre debe especificar el valor de la opción, no la etiqueta de la opción. Use el valor de la columna de valor en la hoja de cálculo de opciones de la definición del formulario.
- Ejemplo:
selected-at(field, number): Devuelve el elemento seleccionado en la posición especificada en un campo select_multiple. Cuando el número pasado es 0, devuelve el primer elemento seleccionado; cuando el número es 1, devuelve el segundo elemento seleccionado, y así sucesivamente.- Ejemplo:
selected-at(${fruits}, 0) = 'Apple'puede usarse como expresión de relevancia para mostrar un grupo o campo solo si la primera opción seleccionada es “Apple”. - Nota: El valor devuelto será el valor de la opción, no la etiqueta de la opción.
- Ejemplo:
choice-label(field, value): Devuelve la etiqueta de una opción de campo select_one o select_multiple, según se define en la hoja de cálculo de opciones de la definición del formulario.- Ejemplo 1:
choice-label(${country}, ${country})devolverá la etiqueta de la opción de la opción actualmente seleccionada en el campo llamadocountry. - Ejemplo 2:
choice-label(${languages}, selected-at(${languages}, 0))devolverá la etiqueta de la primera opción seleccionada en el campo llamadolanguages. - Nota: Esta función recupera la etiqueta de la opción, no el valor.
- Ejemplo 1:
Funciones de campos repetidos
En rtSurvey, si desea hacer la(s) misma(s) pregunta(s) varias veces, puede colocar un campo dentro de un grupo de repetición. Esto da como resultado múltiples instancias del mismo campo. Las siguientes funciones pueden ayudarle a trabajar con estos campos repetidos y los datos repetidos que producen.
join(string, repeatedfield): Para un campo dentro de un grupo de repetición, genera una lista separada por cadena de valores. El primer parámetro especifica el delimitador a usar para separar los valores.- Ejemplo:
join(', ', ${member_name})generará una lista única separada por comas de todos los nombres ingresados.
- Ejemplo:
join-if(string, repeatedfield, expression): Funciona exactamente comojoin(), excepto que verifica cada instancia en el grupo de repetición usando la expresión suministrada. Si la expresión se evalúa como falsa, el elemento se omitirá de la salida.- Ejemplo:
join-if(', ', ${member_name}, ${age} >= 18)generará una lista separada por comas de nombres solo de miembros adultos (aquellos con edades de 18 años o más).
- Ejemplo:
count(repeatgroup): Devuelve el número actual de veces que un grupo de repetición se ha repetido.- Ejemplo:
count(${groupname})devolverá el número de instancias del grupo.
- Ejemplo:
count-if(repeatgroup, expression): Funciona exactamente comocount(), excepto que verifica cada instancia en el grupo de repetición usando la expresión suministrada.- Ejemplo:
count-if(${members}, ${age} >= 18)devolverá el conteo de miembros adultos según el campo de edad dentro del grupo de repetición “members”.
- Ejemplo:
sum(repeatedfield): Para un campo dentro de un grupo de repetición, calcula la suma de todos los valores.- Ejemplo:
sum(${loan_amount})devolverá el valor total de todos los préstamos.
- Ejemplo:
sum-if(repeatedfield, expression): Funciona exactamente comosum(), excepto que verifica cada instancia usando la expresión suministrada.- Ejemplo:
sum-if(${loan_amount}, ${loan_amount} > 500)devolverá el valor total de todos los préstamos superiores a 500.
- Ejemplo:
min(repeatedfield): Para un campo dentro de un grupo de repetición, calcula el mínimo de todos los valores.- Ejemplo:
min(${member_age})devolverá la edad del miembro más joven del grupo.
- Ejemplo:
min-if(repeatedfield, expression): Funciona exactamente comomin(), excepto que verifica cada instancia usando la expresión suministrada.- Ejemplo:
min-if(${member_age}, ${member_age} >= 18)devolverá la edad del adulto más joven del grupo.
- Ejemplo:
max(repeatedfield): Para un campo dentro de un grupo de repetición, calcula el máximo de todos los valores.- Ejemplo:
max(${member_age})devolverá la edad del miembro más viejo del grupo.
- Ejemplo:
max-if(repeatedfield, expression): Funciona exactamente comomax(), excepto que verifica cada instancia usando la expresión suministrada.- Ejemplo:
max-if(${member_age}, ${member_age} >= 18)devolverá la edad del adulto más viejo del grupo.
- Ejemplo:
index(): Llamado dentro de un grupo de repetición, devuelve el número de índice para el grupo o instancia actual.- Ejemplo:
index()cuando se usa dentro de un grupo de repetición devolverá 1 para la primera instancia, 2 para la segunda, y así sucesivamente.
- Ejemplo:
indexed-repeat(repeatedfield, repeatgroup, index): Referencia un campo o grupo que está dentro de un grupo de repetición desde fuera de ese grupo de repetición.- Ejemplo 1:
indexed-repeat(${name}, ${names}, 1)devolverá el primer nombre disponible cuando el campo de nombre está dentro de un grupo de repetición anterior llamado “names”. - Ejemplo 2:
indexed-repeat(${name}, ${names}, index())obtendrá el nombre correspondiente al número de instancia del grupo de repetición actual.
- Ejemplo 1:
rank-index(index, repeatedfield): Esta función calcula el rango ordinal de la instancia especificada de un campo repetido para su uso fuera del grupo de repetición. El rango de 1 se asigna a la instancia con el valor más alto.- Ejemplo:
rank-index(1, ${random_draw})calcula el rango de la primera instancia según el valor de su camporandom_drawen comparación con los valores de otras instancias.
- Ejemplo:
rank-index-if(index, repeatedfield, expression): Esta función funciona de manera similar arank-index(), pero verifica cada instancia en el grupo de repetición del campo repetido usando la expresión suministrada.- Ejemplo:
rank-index-if(1, ${age}, ${age} >= 18)calcula el rango de edad dentro del conjunto de adultos, considerando solo instancias donde la edad sea mayor o igual a 18.
- Ejemplo:
Funciones numéricas
| Operador | Operación | Ejemplo | Respuesta de ejemplo |
|---|---|---|---|
+ | Suma | 1 + 1 | 2 |
- | Resta | 3 - 2 | 1 |
* | Multiplicación | 3 * 2 | 6 |
div | División | 10 div 2 | 5 |
mod | Módulo | 9 mod 2 | 1 |
rtSurvey admite funciones numéricas, incluyendo:
number(field): Convierte el valor del campo a un número.- Ejemplo:
number('34.8')= 34.8
- Ejemplo:
int(field): Convierte el valor del campo a un entero.- Ejemplo:
int('39.2')= 39
- Ejemplo:
min(field1, ..., fieldx): Devuelve el valor mínimo entre los campos pasados.- Ejemplo:
min(${father_age}, ${mother_age})devolverá la edad del padre o la madre, la que sea menor.
- Ejemplo:
max(field1, ..., fieldx): Devuelve el valor máximo entre los campos pasados.- Ejemplo:
max(${father_age}, ${mother_age})devolverá la edad del padre o la madre, la que sea mayor.
- Ejemplo:
format-number(field): Formatea el valor de un campo entero o decimal según la configuración regional del usuario.- Ejemplo:
format-number(${income})podría formatear “120000” como “120,000”.
- Ejemplo:
round(field, digits): Redondea el valor del campo numérico al número especificado de dígitos después del punto decimal.- Ejemplo:
round(${interest_rate}, 2)
- Ejemplo:
abs(number): Devuelve el valor absoluto de un número.pow(base, exponent): Devuelve el valor del primer parámetro elevado a la potencia del segundo parámetro.log10(fieldorvalue): Devuelve el logaritmo en base diez del campo o valor pasado.sin(fieldorvalue): Devuelve el seno del campo o valor pasado, expresado en radianes.cos(fieldorvalue): Devuelve el coseno del campo o valor pasado, expresado en radianes.tan(fieldorvalue): Devuelve la tangente del campo o valor pasado, expresado en radianes.asin(fieldorvalue): Devuelve el arcoseno del campo o valor pasado, expresado en radianes.acos(fieldorvalue): Devuelve el arcocoseno del campo o valor pasado, expresado en radianes.atan(fieldorvalue): Devuelve la arcotangente del campo o valor pasado, expresado en radianes.atan2(x, y): Devuelve el ángulo en radianes subtendido en el origen por el punto con coordenadas (x, y) y el eje x positivo.sqrt(fieldorvalue): Devuelve la raíz cuadrada no negativa del campo o valor pasado.exp(x): Devuelve el valor de e^x.pi(): Devuelve el valor de pi.
Funciones de fecha y hora
Los valores de fecha en rtSurvey se almacenan como cadenas en formato YYYY-MM-DD. Los valores de fecha y hora se almacenan como cadenas ISO 8601 (YYYY-MM-DDTHH:MM:SS). Use decimal-date-time() para convertir a un número para aritmética (p. ej., cálculo de duraciones).
today(): Devuelve la fecha de hoy como cadena en formatoYYYY-MM-DD. Se evalúa una vez cuando se abre el formulario.- Ejemplo:
today()→'2024-03-15' - Uso común: columna
defaultpara prellenar la fecha de hoy, o enrelevant/constraintpara comparar con un campo de fecha.
- Ejemplo:
now(): Devuelve la fecha y hora actuales como cadena ISO 8601. Se evalúa cada vez que se calcula la expresión.- Ejemplo:
now()→'2024-03-15T14:32:00.000+03:00' - Uso común: registrar la marca de tiempo exacta de un evento específico durante la encuesta.
- Ejemplo:
date(value): Convierte un valor (cadena o número) a una cadena de fecha.- Ejemplo:
date('2024-03-15')→'2024-03-15'
- Ejemplo:
date-time(value): Convierte un valor a una cadena de fecha y hora.- Ejemplo:
date-time(${event_timestamp})
- Ejemplo:
decimal-date-time(value): Convierte una cadena de fecha o fecha y hora a un número decimal que representa milisegundos desde la época Unix dividido por 86400000 (días fraccionarios desde 1970-01-01). Úselo para realizar aritmética en fechas.- Ejemplo — Duración en días entre dos fechas:
decimal-date-time(${end_date}) - decimal-date-time(${start_date}) - Ejemplo — Duración en minutos entre dos fechas y horas:
(decimal-date-time(${end_time}) - decimal-date-time(${start_time})) * 1440
- Ejemplo — Duración en días entre dos fechas:
format-date(date, format): Formatea un valor de fecha usando una cadena de patrón.- Tokens de formato:
%Y(año de 4 dígitos),%y(año de 2 dígitos),%m(mes 01–12),%d(día 01–31),%a(día de la semana abreviado),%b(nombre del mes abreviado) - Ejemplo:
format-date(today(), '%d/%m/%Y')→'15/03/2024'
- Tokens de formato:
format-date-time(datetime, format): Formatea un valor de fecha y hora usando una cadena de patrón. Acepta todos los tokens deformat-datemás:%H(hora 00–23),%h(hora 01–12),%M(minutos 00–59),%S(segundos 00–59),%3(milisegundos),%P(AM/PM)- Ejemplo:
format-date-time(now(), '%d/%m/%Y %H:%M')→'15/03/2024 14:32'
Funciones booleanas
boolean(value): Convierte cualquier valor a booleano. Devuelvetruepara cadenas no vacías, números distintos de cero ytrue; devuelvefalsepara cadenas vacías,0yfalse.boolean-from-string(string): Devuelvetruesi la cadena es'1'o'true'(sin distinción de mayúsculas); devuelvefalseen caso contrario.true(): Devuelve el valor booleanotrue.- Ejemplo: En la columna
required,true()es equivalente ayes.
- Ejemplo: En la columna
false(): Devuelve el valor booleanofalse.- Ejemplo:
if(${skip_section} = 'yes', false(), true())— establecer dinámicamente como requerido.
- Ejemplo:
not(expression): Devuelve la negación lógica de la expresión.- Ejemplo:
not(${consent} = 'yes')— muestra una advertencia cuando NO se dio consentimiento. - Ejemplo:
not(selected(${issues}, 'none'))— requiere detalles solo si no se seleccionó “ninguno”.
- Ejemplo:
Funciones de cadena adicionales
starts-with(string, prefix): Devuelvetruesistringcomienza conprefix.- Ejemplo:
starts-with(${phone}, '+254')verifica si el número de teléfono comienza con el código de país de Kenia.
- Ejemplo:
contains(string, substring): Devuelvetruesistringcontienesubstring.- Ejemplo:
contains(${email}, '@')verifica que una dirección de correo tenga un signo@.
- Ejemplo:
substring-before(string, needle): Devuelve la parte destringque aparece antes de la primera ocurrencia deneedle.- Ejemplo:
substring-before(${full_name}, ' ')extrae la primera palabra (nombre de pila).
- Ejemplo:
substring-after(string, needle): Devuelve la parte destringque aparece después de la primera ocurrencia deneedle.- Ejemplo:
substring-after(${email}, '@')extrae la parte de dominio de una dirección de correo.
- Ejemplo:
normalize-space(string): Elimina el espacio en blanco al inicio y al final, y colapsa todas las secuencias de espacio en blanco internas en un solo espacio.translate(string, search_chars, replace_chars): Reemplaza cada carácter enstringque aparece ensearch_charscon el carácter correspondiente enreplace_chars.- Ejemplo:
translate(${phone}, ' -()', '')elimina espacios, guiones y paréntesis de un número de teléfono.
- Ejemplo:
Funciones matemáticas adicionales
floor(number): Devuelve el mayor entero menor o igual quenumber.- Ejemplo:
floor(4.9)= 4,floor(-2.1)= -3
- Ejemplo:
ceiling(number): Devuelve el menor entero mayor o igual quenumber.- Ejemplo:
ceiling(4.1)= 5,ceiling(-2.9)= -2
- Ejemplo:
random(): Devuelve un número decimal aleatorio entre 0.0 (inclusive) y 1.0 (exclusivo).- Ejemplo:
int(random() * 6) + 1→ número aleatorio del 1 al 6 (lanzamiento de dados)
- Ejemplo:
coalesce(a, b): Devuelveasiano está vacío; de lo contrario devuelveb. Útil como respaldo cuando un campo podría estar vacío.- Ejemplo:
coalesce(${preferred_name}, ${full_name})— usa el nombre preferido si está establecido, de lo contrario usa el nombre completo.
- Ejemplo:
once(value): Evalúavaluey lo almacena, pero solo si el campo actual está vacío. Si el campo ya tiene un valor,once()devuelve el valor existente sin cambios.- Ejemplo:
once(today())en la columnadefaultestablece la fecha de hoy una vez y no se actualiza si el encuestador vuelve a abrir el formulario. - Ejemplo:
once(uuid())genera un UUID una vez y lo mantiene estable entre reediciones.
- Ejemplo:
Funciones geográficas
area(geoshape_value): Calcula el área en metros cuadrados encerrada por un valor de geoshape (polígono).- Ejemplo:
area(${field_boundary})— calcula el área de un campo encuestado en m². - Ejemplo:
round(area(${field_boundary}) div 10000, 2)— convertir a hectáreas.
- Ejemplo:
distance(coordinates): Calcula la longitud total del trayecto en metros de un geotrace (línea), o la distancia entre dos geopoints.- Para un geotrace:
distance(${route})devuelve la longitud total del trayecto en metros. - Para dos geopoints:
distance(concat(${point_a}, ' ', ${point_b}))devuelve la distancia entre ellos.
- Para un geotrace:
Funciones de validación
regex(value, pattern): Devuelvetruesivaluecoincide con la expresión regularpattern. Úselo en la columnaconstraintpara validación basada en patrones.- Ejemplo:
regex(., '^[0-9]{10}$')— validar un número de 10 dígitos. - Ejemplo:
regex(., '^[A-Z]{2}[0-9]{6}$')— validar un formato de número de pasaporte. - Ejemplo:
regex(., '^[^@]+@[^@]+\.[^@]{2,}$')— verificación básica del formato de correo electrónico.
- Ejemplo:
checklist(min, max, v1, v2, ...): Evalúa una lista de expresiones booleanas y devuelvetruesi el número de valorestrueestá entreminymax(inclusive).- Ejemplo:
checklist(2, 3, ${q1} = 'yes', ${q2} = 'yes', ${q3} = 'yes')— pasa si exactamente 2 o 3 de las tres condiciones son verdaderas.
- Ejemplo:
weighted-checklist(min, max, v1, w1, v2, w2, ...): Comochecklist(), pero cada valor tiene un peso. La suma de pesos de los valores verdaderos debe estar entreminymax.
Funciones de utilidad
uuid(): Genera un UUID aleatorio (formato RFC 4122 v4) como cadena.- Normalmente se usa con
once()para generar un ID único estable:once(uuid())
- Normalmente se usa con
version(): Devuelve el valor del atributoversiondel formulario según se establece en la hoja de trabajo de configuración.position(): Cuando se llama dentro de un grupo de repetición, devuelve el índice basado en 1 de la instancia de repetición actual.thousandsep(length, separator, value): Formatea un número con un separador de miles.- Ejemplo:
thousandsep(0, ',', 1234567)→'1,234,567'
- Ejemplo:
substr-jsonpath(value, jsonpath): Extrae una subcadena de una cadena JSON usando una expresión JSONPath.- Ejemplo:
substr-jsonpath(${api_response}, '$.data.name')— extrae el camponamede una cadena JSON almacenada enapi_response.
- Ejemplo: