Skip To Content

Fórmulas

Puede usar fórmulas para crear formularios más inteligentes con Survey123 for ArcGIS.

Siempre se debe hacer referencia a las preguntas anteriores en las fórmulas con el formato ${field_name}.

Operadores

Entre los operadores compatibles con Survey123 se incluyen los siguientes:

OperadorDescripciónEjemplo

.

La respuesta actual

.=1

|

Calcula dos conjuntos de nodos

//book | //cd

+

Adición

6 + 4

############################################################-

Resta

6 - 4

*

Multiplicación

6 * 4

div

División

8 div 4

=

Igual

price=9.80

!=

No es igual

price!=9.80

<

Menor que

price<9.80

<=

Menor o igual que

price<=9.80

>

Mayor que

price>9.80

>=

mayor o igual que

price>=9.80

o bien,

O

price=9.80 or price=9.70

y

And

price>9.00 and price<9.90

mod

Módulo (resto de la división)

5 mod 2

Entre las funciones compatibles con Survey123 se incluyen las siguientes:

FunciónDescripciónEjemplo

selected(question, value)

Comprueba si se ha seleccionado una respuesta. Se utiliza en las preguntas select_one y select_multiple.

selected(${question_one}, 'a')

count-selected(question)

Devuelve el número de respuestas seleccionadas. Se utiliza en las preguntas select_multiple.

count-selected(${question_one})

string-length(question)

Devuelve la longitud de una cadena no vacía.

string-length(${question_one})

substr(question, start, end)

Devuelve la subcadena empezando en el inicio especificado y se extiende al carácter que se encuentra en índice final -1, donde el inicio y el final empiezan en 0.

substr(${question_one},1 ,2)

not(expression)

Devuelve un valor si la expresión no se ha evaluado.

not(selected(., 'yes'))

if(condition, a, b)

Si es verdadero devuelve a; de lo contrario, devuelve b.

if(selected(${question_one}, 'yes') and selected(${question_two}, 'yes'), 'yes', 'no')

true()

True

true()

false()

False

false()

uuid()

Devuelve una cadena de caracteres de UUID aleatoria.

uuid()

random()

Devuelve un valor aleatorio entre 0 (incluido) y 1 (excluido).

random()

today()

Devuelve la fecha de hoy. Se utiliza en preguntas de fecha.

today()

now()

Devuelve una marca de hora para este instante. Se utiliza en preguntas de hora y de tiempo y hora.

now()

once()

Si una pregunta ya tiene un valor, devuelve el valor existente. Resulta útil cuando se utiliza random() o uuid() en una pregunta repetida para asegurarse de que el valor no va a cambiar cuando navegue por los registros repetidos del formulario.

once(uuid())

boolean(question or value)

Devuelve el valor True si el valor proporcionado no es nulo.

Se recomienda utilizar en su lugar boolean-from-string().

boolean(${question_one})

number(question or value)

Convierte a número. La conversión varía según el tipo de datos.

number(${question_one})

int(question or value)

Convierte a entero. La conversión varía según el tipo de datos.

int(${question_one})

string(question or value)

Convierte a cadena de caracteres. La conversión varía según el tipo de datos.

string({$question_one})

date()

Convierte un número o cadena de caracteres en un objeto de fecha, sin mantener la hora.

date('2017-05-28T04:39:02+10:00')

date-time()

Convierte un número o cadena de caracteres en un objeto de fecha.

date-time('2017-05-28T04:39:02+10:00')

decimal-date-time()

Convierte un objeto de fecha en un número de fecha-hora decimal.

decimal-date-time(${date_question})

decimal-time()

Convierte un objeto de hora en un número que representa una fracción de un día en la zona horaria del dispositivo.

decimal-time(${time_question})

coalesce(value1, value2)

Devuelve el primer valor no vacío. Solo se admiten dos valores.

coalesce(${question_one},${question_two})

concat(value1, value2, …)

Devuelve la concatenación de los valores de la cadena de caracteres.

concat(${question_one}, ' and ', ${question_two})

max(value1, value2, ...)

Devuelve el valor máximo de un rango dado o para una pregunta simple en repeticiones.

max(${question_one},${question_two})

min(value1, value2, ...)

Devuelve el valor mínimo de un rango dado o para una pregunta simple en repeticiones.

min(${question_one},${question_two})

sum(repeat)

Devuelve la suma de todas las respuestas a una pregunta dada en repeticiones.

sum(${question})

count(repeat)

Devuelve la cantidad de respuestas a una pregunta dada en repeticiones.

count(${question})

pulldata()

Devuelve información guardada en un archivo CSV externo o en las propiedades de una respuesta.

pulldata('info','email','name', ${previous_question})

version()

Devuelve la versión de la encuesta definida en la hoja de cálculo de configuración.

version()

boolean-from-string()

Devuelve el valor True si la cadena de caracteres proporcionada es "true" o "1". De lo contrario, devuelve False.

boolean-from-string(${question_one})

contains(string, substring)

Devuelve el valor True si cadena de caracteres indicada contiene la subcadena.

contains(${question_one}, 'red')

starts-with(string, substring)

Devuelve el valor True si cadena de caracteres indicada comienza por la subcadena.

starts-with(${question_one}, 'The')

ends-with(string, substring)

Devuelve el valor True si cadena de caracteres indicada termina por la subcadena.

ends-with(${question_one}, 'hand.')

selected-at(question, number)

Se utiliza en las preguntas select_multiple. Devueve el nombre de la opción seleccionada para el número indicado; Por ejemplo, "2" devolverá la segunda opción seleccionada.

selected-at(${question_one}, 2)

jr:choice-name(choice, 'question')

Se utiliza en las preguntas select_one y select_multiple. Devueve la etiqueta asociada al nombre de la opción de la pregunta indicada. Recuerde que la pregunta debe estar definida dentro de comillas.

jr:choice-name(maybe, '${question_one}')

join(separator, question)

Concatena todas las respuestas de una pregunta determinada en una repetición, separadas por el separador indicado.

join(',', ${question_in_repeat})

Restricciones

Al agregar una restricción a una pregunta de una encuesta, se restringirán las entradas aceptadas para una respuesta. Esto puede incluir un rango de números, combinaciones de letras y números o la coincidencia general de patrones. En su hoja de cálculo, la expresión de la restricción se introduce en el campo de restricción y el texto informativo se introduce en la columna constraint_message de la hoja de cálculo survey. En la expresión de la restricción, la entrada de la pregunta siempre se representa mediante un punto.

Por ejemplo, la siguiente fórmula se puede usar para restringir la entrada de un campo entero únicamente a los números positivos:

.>= 0

Esta fórmula, cuando se aplica a un campo date, impide que el usuario introduzca un valor anterior a la fecha actual:

.>= today()

También se pueden usar cálculos en las restricciones. Esta fórmula realizará un cálculo para impedir que el usuario seleccione fechas comprendidas entre la fecha actual y la de dentro de 14 días:

(.>= today()) and (.- (1000 * 24 * 60 * 60 * 14) <= today())

Nota:

Para evitar errores inesperados, si la fórmula incluye valores decimales entre -1 y 1, recuerde incluir un cero inicial en los valores. Sin el cero inicial, el decimal podría confundirse con el carácter de operación . (o -.). Por ejemplo, la siguiente expresión generaría un error:

.> .25 and .< 24.25

La siguiente expresión se ejecutaría del modo esperado:

.> 0.25 and .< 24.25

Expresiones regulares

También se pueden usar expresiones regulares de una gran variedad de formas para aplicar la coincidencia de patrones con el fin de restringir las respuestas válidas a un formato indicado o para asegurarse de que contenga un contenido específico. Este ejemplo exige que la respuesta a la pregunta contenga la palabra "pattern" en algún lugar.

regex(., 'pattern')

El punto utilizado al principio de estos ejemplos aplica la expresión al campo actual. Al agregar el nombre de otro campo en su lugar, la expresión regular se aplicará a ese campo, lo que resulta ideal para las expresiones relevantes. La coma actúa como separador entre esta definición de campo y la propia expresión.

Esta expresión regular garantiza que la respuesta coincida exactamente con la palabra "pattern", sin nada más antes ni después.

regex(., '^pattern$')

Las expresiones regulares son ideales para confinar la entrada de una pregunta a un formato estándar. Este ejemplo acepta únicamente la introducción de un código postal de cinco dígitos de los Estados Unidos.

regex(., '^\d{5}$')

Este ejemplo contrasta la respuesta con el formato actual de las matrículas de vehículos en Indonesia, como se muestra en la siguiente foto:

Matrícula de vehículos estándar en Indonesia

regex(., '^[A-Z]{1,2}\d{4}[A-Z]{2,3}$')

Los formatos estandarizados de manera más variable pueden requerir expresiones regulares muy complejas. Esta expresión regular utilizada en la aplicación web Survey123 limita la entrada de un campo de cadena de caracteres para que coincida con el formato de una dirección de correo electrónico:

regex(., '^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')

Esta modificación de la expresión anterior restringe la entrada para que coincida con el formato de una dirección de correo electrónico, y acepta caracteres no ingleses:

regex(., '^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\u0400-\uffff\-0-9]+\.)+[a-zA-Z\u0400-\uffff]{2,}))$')

Este ejemplo, aunque también utiliza una expresión regular de la aplicación web Survey123, limita un campo solo para aceptar respuestas que coincidan con el formato de una dirección web:

regex(., ^((https?|ftps?)\\://|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)+(?:[a-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.?)|localhost)(\\:\\d+)?(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]+(?:\\?[^?#\\s/]*)?(?:#[A-Za-z][\\w.:-]*)?)?)?)

Para obtener más información sobre las expresiones regulares, consulte la documentación de Mozilla Developer Network. También puede consultar la hoja de tipos de la plantilla de Survey123 para ver una lista de caracteres y sus funciones en las expresiones regulares.

Nota:

Survey123 utiliza la representación ODK de las expresiones regulares. La única diferencia significativa es que donde JavaScript necesita dos barras invertidas (por ejemplo, \\d para especificar un decimal), Survey123 solo requiere una (por ejemplo, \d para un decimal).

Cálculos

Para una pregunta, los cálculos se efectúan en la columna calculation. A menudo, los cálculos se asocian con el tipo de pregunta calculate, pero también pueden aplicarse a los tipos de preguntas integer, decimal, text y select_one. El resultado del cálculo se puede usar para rellenar las expresiones relevantes o de restricciones haciendo referencia al nombre de campo de la pregunta calculate. Las preguntas de tipo calculate se pueden usar para albergar valores que no es necesario mostrar en el formulario pero que se incluyen en el servicio de entidades.

El tipo de pregunta calculate está oculto y no aparece en el formulario. Significa que también se puede usar para albergar valores que no es necesario mostrar en el formulario, pero que se incluyen en el servicio de entidades.

Por ejemplo, puede crear una pregunta de tipo calculate, llamarla calc e insertar la siguiente expresión en su columna calculation:

${question_1} + ${question_2} + ${question_3}

Use el resultado para definir la relevancia de la siguiente pregunta:

${calc} <= 100

Se pueden usar cálculos con las respuestas en los campos date. Este cálculo estimará el número de años entre la fecha introducida y la actual, lo que permite, por ejemplo, calcular la edad de alguien:

int((today() - ${birth_date}) div (1000 * 24 * 60 * 60 * 365.25))

En ocasiones solo se necesita parte de un valor o una versión truncada de una respuesta completa. El operador substr solo devolverá parte de una cadena de caracteres, definida por los números que aparecen tras él. El primer carácter determina el punto inicial de la selección, mientras que el segundo valor determina la longitud (si no hay un segundo valor, seguirá hasta el final de la cadena de caracteres). En este ejemplo, el operador substr lo elimina todo menos la cadena de caracteres comprendida entre los caracteres 10 y 15:

substr(${previous_question}, 10, 15)

Cuando el primero número es negativo, substr empieza a contar desde el final de la cadena de caracteres en lugar de hacerlo desde el principio. Este ejemplo solo devolverá los cinco últimos caracteres de la respuesta:

substr(${previous_question}, -5)

La columna de cálculo también se puede utilizar para las funciones de agregar en repeticiones. Para obtener más información, consulte Repeticiones.

Funciones matemáticas complejas

La columna calculation también puede gestionar operaciones matemáticas más complejas. Este ejemplo determina el área de un trazado a partir de su radio usando las funciones de raíz cuadrática y pi:

pi() * pow(${plotRadius}, 2)

En la siguiente tabla se muestran otras funciones matemáticas que puede usar en Survey123:

FunciónDescripciónEjemplo

pi()

Devuelve pi.

pi()

acos(value)

Devuelve el arcocoseno del valor.

acos(${question_one})

asin(value)

Devuelve el arcoseno del valor.

asin(${question_one})

atan(value)

Devuelve el arco tangente del valor.

atan(${question_one})

cos(value)

Devuelve el coseno del valor.

cos(${question_one})

sin(value)

Devuelve el seno del valor.

sin(${question_one})

tan(value)

Devuelve la tangente del valor expresada en grados de un ángulo.

tan(${question_one})

exp(value)

Devuelve el exponente natural del valor.

exp(${question_one})

exp10(value)

Devuelve 10 a la potencia del valor.

exp10(${question_one})

log(value)

Devuelve el logaritmo natural del valor.

log(${question_one})

log10(value)

Devuelve el logaritmo en base 10 del valor.

log10(${question_one})

sqrt(value)

Devuelve la raíz cuadrada del valor.

sqrt(${question_one})

atan2(value1, value2)

Devuelve el arco tangente del cociente de los valores.

atan2(${question_one},${question_two})

round(value, power)

Devuelve el valor redondeado.

round(${question_one}, 5)

pow(value, power)

Devuelve el valor a la potencia especificada.

pow(${question_one}, 3)

Las siguientes prácticas recomendadas se deben respetar al usar los cálculos:

  • Cuando use random(), considere la posibilidad de agregar una constante para evitar un resultado cero (0), por ejemplo, random()+0.5. Un valor 0 puede generar una respuesta en blanco.
  • Como en el caso de las restricciones, debe asegurarse de que todos los valores decimales entre -1 y 1 de la fórmula tienen un 0, ya que comenzar con un punto decimal generará errores.
  • El tipo de datos de un resultado de cálculo depende del tipo de datos de cada elemento del cálculo. Si se realiza un cálculo con dos enteros, el resultado será un entero. Si un cálculo contiene un tipo de datos de cadena de caracteres, puede ocurrir que un operador + concatene valores en lugar de sumarlos. Para evitar resultados inesperados, use la función number() para garantizar que los valores de cadenas de caracteres de un cálculo se tratan como números. Por ejemplo, el cálculo para agregar question1 (de tipo integer) a question2 (de tipo text) sería ${question1} + number(${question2}).
    Nota:

    El tipo de vinculación predeterminado de XLSForm para una pregunta de cálculo es de string. Para sobrescribir este valor predeterminado, puede indicar explícitamente el tipo en la hoja de cálculo. Agregue a la hoja de cálculo una columna denominada bind::type e introduzca el tipo requerido (por ejemplo, int o decimal) para la pregunta.

Aplicación de formato de fecha

La función format-date se puede utilizar en el campo calculation para aplicar formato a los valores de fecha y hora. Esto puede resultar útil si desea mostrar partes de fechas a los usuarios o mantenerlas como cadenas de caracteres.

En este ejemplo, el valor incluido en una pregunta de hora o de fecha y hora anterior se devuelve con formato de 24 horas:

format-date(${previous_time},'%H:%M')

Los calificadores que se pueden utilizar en la función format-date son los siguientes:

CalificadorDescripción

%Y

Año con 4 dígitos

%y

Año con 2 dígitos

%m

Mes relleno con 0

%n

Mes numérico

%b

Nombre de mes abreviado

%d

Día del mes relleno con 0

%e

Día del mes

%H

Hora rellena con 0 (formato de 24 horas)

%h

Hora (formato de 24 horas)

%M

Minuto relleno con 0

%S

Segundo relleno con 0

%3

Marcas de milisegundo relleno con 0 (000-999)

%a

Texto abreviado del día, con tres letras

%W

Número de semana

Valores vacíos

Cuando use restricciones y cálculos que hacen referencia a otras preguntas, piense en lo que sucederá cuando esa pregunta esté vacía (es decir, cuando no tenga respuesta). Los valores vacíos se representan de la forma siguiente:

  • NaN (no es un número) para las preguntas de tipo integer y decimal. Es un valor especial que representa la ausencia de un valor válido.
  • '' (una cadena de caracteres vacía) para las preguntas de tipo text. El tipo de datos predeterminado para las preguntas select_one, select_mulitple y hidden es también de texto. Cuando esos tipos de preguntas estén vacías, contendrán una cadena de caracteres vacía.

Dependiendo de que el valor sea un número o un texto, el comportamiento en los cálculos será diferente.

En las preguntas de tipo integer o decimal, el comportamiento será el siguiente:

  • Cualquier expresión matemática con un valor NaN generará un error y la pregunta quedará vacía.
  • Las funciones min() y max() completan y hacen caso omiso de cualquier valor NaN (es decir, que no sea un número).
  • La comparación del valor NaN con cualquier otro valor solo será verdadera en un cálculo de una comparación de valores "no es igual". Las demás expresiones darán el resultado falso.

En las preguntas de texto, el comportamiento será el siguiente:

  • La concatenación de preguntas de tipo text se completará si hay valores vacíos. Por ejemplo, "Hello" + ${firstName} + ", how are you?" generará "Hello , how are you?" cuando firstName esté vacío en la pregunta.
  • Las funciones min() y max() completan y hacen caso omiso de cualquier cadena de caracteres vacía.
  • Una respuesta de texto vacía es igual a otra respuesta de texto vacía y es siempre inferior a un texto no vacío.

Puede determinar si una pregunta está vacía usando la función string-length. La función string-length se puede usar con todos los tipos de preguntas. Por ejemplo, string-length(${Question1}) devolverá 0 si Question1 está vacía.

Preguntas select_multiple

Las respuestas a los tipos de preguntas select_multiple se almacenan de un modo distinto a otras, ya que cada respuesta activada se introduce en el orden en el que se seleccionó, separada de las demás por comas. Por ejemplo, al seleccionar las respuestas A y B en ese orden, las respuestas aparecerán como "A,B".

Algunas características de XLSForm no funcionarán con las preguntas select_multiple. Por ejemplo, si introduce la respuesta "A" en la columna relevant de una pregunta que hace referencia a la pregunta select_multiple, y la respuesta de la encuesta es "A,B", la respuesta no se considerará relevante. En este caso, la solución sería usar la función selected(), que comprobará si alguno de los valores aparece en la lista.

La siguiente expresión, cuando se usa en la columna relevant de una pregunta, mostraría la pregunta si el usuario ha seleccionado "A" como una de las respuestas en la pregunta select_multiple a la que se hace referencia. Las respuestas adicionales a la pregunta select_multiple no cambiarán este comportamiento.

selected(${previous_question}, 'A')

Trabajar con contenido externo

Usando la función pulldata() en la columna calculation de una pregunta, puede precargar datos de un archivo CSV incluido en la carpeta media de la encuesta. La función pulldata() requiere la especificación de los cuatro parámetros siguientes en orden:

  1. El nombre del archivo CSV que contiene la lista de valores. El nombre no incluye el sufijo de nombre de archivo .csv.
  2. El nombre de la columna del archivo CSV que contiene el valor que se desea devolver.
  3. El nombre del campo de clave del archivo CSV que se usará para buscar el valor.
  4. El valor de clave que se debe buscar en el campo de clave.

Estos valores se pueden definir directamente o a través de variables definidas en cualquier otro punto de la encuesta. En el siguiente ejemplo, el cálculo devolverá la dirección de correo electrónico de alguien mencionado en una pregunta anterior de un archivo CSV llamado info:

pulldata('info','email','name', ${previous_question})

La misma función pulldata() funciona también en la columna constraints e impide que el usuario envíe respuestas que no están en el archivo CSV. En la columna constraints, esta misma fórmula impedirá que el formulario acepte valores que no estén en la columna name del archivo CSV.

La función pulldata() tiene algunas limitaciones. El nombre del campo de clave tiene la misma limitación que la columna name de la hoja de cálculo choices, lo que significa que esos valores no pueden tener espacios ni caracteres que no sean ASCII. Además, como son archivos CSV, usar una coma en cualquiera de estos campos hará que la función pulldata() genere resultados incorrectos.

Nota:

No puede utilizar la función pulldata() para rellenar los valores de las preguntas select_multiple.

Si los valores de su archivo CSV tienen más de 255 caracteres, necesitará introducir un valor mayor en la columna bind::esri:fieldLength tanto para la pregunta que está completando con el contenido del CSV como para cualquier pregunta que se utilice como entrada de la función pulldata(). Si su archivo CSV contiene valores mayores que la longitud máxima de uno de estos campos, la respuesta a la encuesta no se puede enviar y mostrará un error de Código 1000.

Al utilizar la función pulldata(), los nombres de las columnas CSV no podrán contener espacios, guiones ni otros caracteres especiales.

Otros usos de la extracción de datos

La función pulldata() también extrae las propiedades proporcionadas por el dispositivo ofreciendo dos parámetros: "@property" y el nombre de la propiedad que se pretende extraer. Este ejemplo devolverá el desplazamiento UTC del dispositivo, lo cual ayudará a los usuarios a registrar la zona horaria en la que se realizó una encuesta.

pulldata("@property", 'utcoffset')

Para obtener más información sobre las propiedades que se pueden extraer, consulte Propiedades del dispositivo y del usuario.

La función pulldata() puede extraer y deconstruir los valores de las preguntas de geopunto. Para obtener más información, consulte Geopuntos.

La función pulldata() puede extraer los datos EXIF y JSON de las preguntas de imagen. Para obtener más información, consulte Contenido multimedia.