¿Cómo podemos ayudarte?

FlowScript

20 min read

AI Doc Summarizer AI Summary

Es posible gestionar la lógica del flujo del cuestionario utilizando un lenguaje de programación llamado FlowScript.

FlowScript es parte de IdCode. Comparten la misma funcionalidad y parte de la sintaxis, pero FlowScript amplía considerablemente las posibilidades de aplicación.

Es posible añadir FlowScript en cualquier página del cuestionario. El script se ejecutará durante el proceso de guardado de la página, cuando el encuestado haga clic en el botón «Continuar».

FlowScript ejecutará cualquier instrucción disponible en IdCode, permitiendo condiciones de cualquier nivel de complejidad. También es posible utilizar las instrucciones else y while.

FlowScript está compuesto por diferentes elementos, como:

Comandos

Los comandos son instrucciones que se ejecutan cuando FlowScript se ejecuta, como un «salto» a una página específica (goto), «fuera del target» (ot) o la asignación de un valor a un campo de nominativo.

Condiciones

Una condición determina cuándo debe ejecutarse un comando. Por ejemplo, si la condición es verdadera, ejecutar este comando.

Funciones para usar dentro de las condiciones

IdSurvey ofrece muchas funciones que pueden utilizarse tanto en FlowScript como en IdCode. Las funciones que pueden utilizarse dentro de las condiciones permiten realizar controles sobre las preguntas del cuestionario, sobre los campos de nominativos o sobre el estado de las cuotas. Por ejemplo, comprobar cuántas opciones de respuesta fueron seleccionadas en una pregunta de elección múltiple o comprobar si una cuota específica está completa, etc.

Otras funciones especiales

Estas funciones particulares pueden utilizarse tanto dentro de las condiciones como dentro de los comandos. Las funciones especiales son generalmente necesarias solo para FlowScript de gran complejidad.

Sintaxis detallada #

Comandos

Los comandos son instrucciones que se ejecutarán cuando FlowScript se ejecute. Es posible añadir uno o más comandos, con o sin condición. Cada comando debe terminar con el signo «;» (punto y coma)..

Los comandos posibles son:

  • Función GoTo (salto)
  • Función GoToRnd (salto aleatorio)
  • Función Ot (fuera del target)
  • Asignar un valor a un campo de nominativo
  • Asignar respuestas
  • SetVariable (asignar campos de nominativos y respuestas avanzadas).

GoTo #

Saltar a la página o pregunta especificada.

Ejemplo de un salto simple:

goto(P3);

salta a la página P3.

Ejemplo de un salto con secuencia:

goto(P3, P5, P10);

salta a la página P3, luego a la página P5, luego a la página P10.

Nota

  • Un salto simple garantizará la integridad del cuestionario: esto significa que al saltar a una página siguiente, cualquier respuesta dada a las preguntas que fueron omitidas será eliminada. En cambio, si la condición de salto lleva a una página anterior, los datos no serán eliminados. En este caso, la entrevista continuará mostrando las preguntas una por una con las respuestas ya completadas. En ambos casos la entrevista siempre estará poblada solo con las respuestas a las preguntas que fueron efectivamente formuladas, siguiendo las reglas de las condiciones de visualización y saltos establecidos (si una pregunta está filtrada u omitida significa que no se mostrará durante la entrevista, por lo que se espera que las respuestas relacionadas estén en blanco). Sin embargo, es posible evitar que las respuestas sean eliminadas utilizando un salto con secuencia sin especificar la segunda página del salto, añadiendo las comillas simples sin ningún código, por ejemplo GoTo (Q15, '').

GoToRnd #

Muestra páginas o preguntas específicas de forma aleatoria, terminando siempre con la página o pregunta especificada como último parámetro.

Por ejemplo:

gotornd(P5, P6, P10);

Mostrará las páginas P5 y P6 de forma aleatoria, luego terminará con la página P10.

Ot #

Envía al nominativo con la entrevista en curso fuera de objetivo.

Ejemplo de fuera de objetivo con condición:

if(Q1==1 && Q2==3) ot();

Si en la pregunta Q1 se seleccionó la respuesta con código 1 y en la pregunta Q2 se seleccionó la respuesta con código 3, se sale fuera de objetivo.

Asignar valor a campo de nominativo #

Permite asignar un valor a cualquier campo de nominativo.

Ejemplo:

{CarBrand} = Jaguar;

Asigna «Jaguar» al campo de nominativo CarBrand.

Ejemplo con condición:

if (Q1==3 && Q2==1) {Subscription} = Netflix;

Si en la pregunta Q1 se seleccionó la respuesta con código 3 y en la pregunta Q2 se seleccionó la respuesta con código 1, asigna «Netflix» al campo de nominativo Subscription.

Asignar respuesta #

Permite asignar una respuesta a cualquier pregunta del cuestionario.

Ejemplo de selección de respuesta:

Q15 = 3;

Selecciona la respuesta con código 3 en la pregunta Q15.

Ejemplo de selección de elección múltiple:

Q15 = '3,4,8';

Selecciona las respuestas con códigos 3, 4 y 8 en la pregunta Q15.

Ejemplo de relleno de una respuesta abierta de una pregunta:

[Q12] = 'Estoy muy satisfecho';

Rellena la respuesta abierta en la pregunta Q12.

List of commands
Asignar valorAsigna el valor a un campo de nominativo{CarBrand} = Jaguar;
Asigna «Jaguar» al campo de nominativo CarBrand.
Asignar respuestaAsigna el código de respuesta a una pregunta.Q15 = 3;
Selecciona la respuesta con código 3 en la pregunta Q15.
Q15 = '3,4,8';
Selecciona las respuestas con códigos 3, 4 y 8 en la pregunta Q15.

[Q12] = 'Estoy muy satisfecho';

Rellena la respuesta abierta en la pregunta Q12.
GoTo
(sencillo)
Salta a una pregunta o página específica.
Para mantener la integridad de la entrevista, cualquier pregunta siguiente que haya sido respondida previamente será eliminada.
goto(P1);
Salta a la página P1.
GoTo
(múltiple)
Salta a las páginas o preguntas especificadas.goto(P1, P2);
Salta a la página P1 y luego a la página P2.
GoToRndSalta aleatoriamente a las páginas (o preguntas) especificadas, terminando siempre con la página (o pregunta) especificada como último parámetro.gotornd(P5, P6, P10);
Mostrará las páginas P5 y P6 de forma aleatoria, luego terminará con la página P10.
Ot
(fuera de target)
Envía al nominativo con la entrevista en curso fuera de target.ot();
SetVariablePermite establecer el valor de una variable creando dinámicamente su nombre.setVariable('{son_name_'+{ison}+'}', Sam);
Este ejemplo obtiene el valor de la variable «ison» (por ejemplo 3) y lo utiliza para crear el nombre de la variable «son_name_3» donde escribirá el valor «Sam».
RecStartInicia la grabación de audio silenciosa en las entrevistas CAPI.recStart();
Inicia la grabación de audio silenciosa (compatible solo con entrevistas de la app CAPI).
RecStopDetiene la grabación de audio silenciosa en las entrevistas CAPI.recStop();
Detiene la grabación de audio silenciosa (compatible solo con entrevistas de la app CAPI).
sendMailEnviar un correo electrónico.sendMail('email@sender.com', {Email}, 'Asunto del correo electrónico', 'texto del correo electrónico');
Envía un correo electrónico desde email@sender.com a la dirección del campo email con el asunto y el texto especificados.
{email_result}=sendMail('email@sender.com', {Email}, 'Asunto del correo electrónico', 'texto del correo electrónico');
Envía el correo electrónico y guarda el resultado en el campo email_result del nominativo.
sendSMSEnviar un SMS.sendsms('Empresa', {mobile}, 'Felicitaciones! Has completado la encuesta');
Envía un SMS con remitente «Empresa» al número de teléfono del campo Mobile del nominativo.
{sms_result}=sendsms('Empresa', {mobile}, 'Felicitaciones! Has completado la encuesta');
Envía el SMS y guarda el resultado en el campo sms_result del nominativo.
Condiciones

Las condiciones permiten especificar el caso en el que uno o más comandos deben ejecutarse. Una condición, en su forma simple, está compuesta por la instrucción if y por una expresión de comparación. A continuación va seguida del comando a ejecutar si la condición es verdadera.

if(Q1==1) ot();

Si en la pregunta Q1 se seleccionó la respuesta con código 1, se sale fuera de target.

Es posible utilizar diferentes símbolos de comparación y operadores lógicos para combinar múltiples condiciones.

if(Q1>5 && Q2!=1) goto(P5);

Si en la pregunta Q1 se seleccionó una respuesta con código mayor que 5 y en la pregunta Q2 no se seleccionó la respuesta con código 1, se envía a la página P5.

Es posible utilizar expresiones con múltiples factores para realizar cálculos algebraicos o para combinar texto de respuestas abiertas, campos de nominativos y secuencias.

if([Q1]+[Q2]<100) goto(P5);

Si la suma del número introducido en la respuesta abierta de las preguntas Q1 y Q2 es inferior a 100, se envía a la página P1.

Notas

  • Las expresiones con múltiples factores pueden utilizarse antes y después del signo de comparación.
  • La sintaxis de las condiciones de FlowScript es la misma que la de IdCode.

Centrémonos en todos los temas necesarios para crear condiciones de cualquier nivel de complejidad:

  • Símbolos de comparación
  • Operadores lógicos
  • if…then (para especificar los comandos a ejecutar cuando la condición es verdadera)
  • if…then…else (para añadir comandos a ejecutar cuando la condición es falsa)
  • while (ejecuta comandos mientras la condición sea verdadera)
  • Lista de funciones para usar en condiciones

Símbolos de comparación #

Los símbolos de comparación para usar dentro de las expresiones de las condiciones son:

  • == igual
  • != diferente
  • < menor
  • > mayor
  • <= menor o igual
  • >= mayor o igual

Operadores lógicos #

Las condiciones pueden combinarse entre sí utilizando paréntesis y los operadores lógicos habituales:

  • && y
  • || o
  • ! negación

Ejemplo:

( Q1==1 || Q1==2) && ( Q2==1||Q2==2 )

Si en la pregunta Q1 se seleccionó la opción con código 1 o con código 2, y en la pregunta Q2 se seleccionó la opción con código 1 o con código 2.

( !Q1==1 ) || ( (Q2== 1 || Q2==2) && (Q3==1||Q3==2) )

Si la condición «Q1 igual a 1» no es verdadera, o si en la pregunta Q2 se seleccionó la opción con código 1 o con código 2, y en Q3 se seleccionó la opción con código 1 o con código 2.

Nota

  • El operador && prevalece sobre el operador ||. Esto significa que cuando no se utilizan paréntesis, las condiciones AND prevalecen sobre las condiciones OR. El operador de negación ! prevalece sobre todos los demás operadores.

If…then #

La instrucción if…then permite establecer la condición en la que uno o más comandos deben ejecutarse

if(condición) comando;

Si la condición es verdadera, ejecutar el comando.

Ejemplo:

if(Q8==3 && [Q2]<18) ot();

Si en la pregunta Q8 se seleccionó la opción con código 3 y en la respuesta abierta de la pregunta Q2 se introdujo un valor inferior a 18, se sale fuera de target.

Ejemplo de condición con múltiples comandos:

if(Q2==3 && Q2!=1) { {Car_Owned}=ningún; ot(); }

Si en la pregunta Q2 se seleccionó la opción con código 3 y en la pregunta Q2 no se seleccionó la opción 1, el campo de nominativo «Car_Owned» se rellenará con «ningún», luego se sale fuera de target.

Nota

  • Después de cada condición es posible añadir un grupo de comandos encerrando las condiciones entre llaves. FlowScript procesará un máximo de 1000 instrucciones por cada grupo.

If…then…else #

La instrucción if…then…else amplía las posibilidades de la instrucción if…then permitiendo añadir comandos a ejecutar cuando la condición es falsa.

La sintaxis es la siguiente:

if(<span style="font-size: revert;">condición</span>) {comando si la condición es verdadera} else {comando si la condición es falsa}

Por ejemplo:

if(Q1==1) goto(P2); else goto(P5);

Si en la pregunta Q1 se seleccionó la opción de respuesta con código 1, se envía a la página P2, de lo contrario (si la condición es falsa) se va a la página P5..

While #

While permite repetir uno o más comandos mientras la condición sea verdadera. Con la instrucción while es posible crear bucles dentro del FlowScript. El uso de esta instrucción generalmente se limita a necesidades particularmente complejas. No debe confundirse con los bucles de secciones del cuestionario

La sintaxis es la siguiente:

while(<span style="font-size: revert;">condición</span>) comando;

For example:

{j}=0; 
while ({j} <= {i})
	{
		{total}= {total}+[Q1][{j}];
		{j}++;
	}

Asigna el valor 0 a la variable j.

Si el valor de la variable j es inferior al valor de la variable i, rellena el campo «total» añadiendo el valor anterior del campo «total» a la cantidad introducida en la pregunta abierta Q1 de j, luego incrementa el campo j en 1.

Nota

  • En este ejemplo hemos llamado «variables» a lo que normalmente identificamos como «campos de nominativos». Técnicamente, no existe distinción entre variables y campos de nominativos. En IdSurvey los campos de nominativos pueden utilizarse como variables, de la misma manera que en cualquier lenguaje de programación.
List of functions that can be used within conditions
CountCodePermite contar el número de opciones seleccionadas.if(CountCode (Q1) >= 3)
Comprueba si en la pregunta Q3 se seleccionaron tres o más opciones..
ResponsesCodeOfDevuelve los códigos de las respuestas seleccionadas en una pregunta.if(Q2==responsesCodeOf(Q1)
Comprueba si la respuesta seleccionada en la pregunta Q2 tiene el mismo código que la seleccionada en la pregunta Q1.
CountResponsesWithCodePermite contar el número de preguntas a las que se respondió con un código de respuesta específico.if(CountResponsesWithCode(Q1,Q2,Q3,Q4,Q5,Q6,99) >= 3)
Comprueba si el código 99 fue respondido en un mínimo de tres preguntas entre Q1, Q2, Q3, Q4, Q5 y Q6.
CountResponsesWithTextPermite contar el número de preguntas a las que se respondió con un texto o número específico.if(CountResponsesWithText (Q1,Q2,Q3,Q4,Q5,Q6,'mar') >= 3)
Comprueba si la palabra «mar» fue introducida en al menos 3 de las respuestas de texto de las preguntas Q1, Q2, Q3, Q4, Q5 y Q6.
CheckQuotaPermite verificar si una determinada cuota está abierta o completa.if(CheckQuota ('Padres') == 1)
Comprueba si la cuota «Padres» está completa.
CompareDateCompara dos fechas. Devuelve -1 si la primera fecha precede a la segunda, 0 si son iguales y 1 si la primera fecha es posterior a la segunda.if(compareDate({fecha_de_nacimiento}, ‘2010-10-01') == -1)
Comprueba si la fecha en el campo «fecha_de_nacimiento» precede a la fecha especificada.
ModuleDevuelve la secuencia CATI, CAWI o CAPI según el módulo con el que se distribuye actualmente la entrevista.if(module()==cawi)
Comprueba si la entrevista se distribuye actualmente a través de CAWI.
ContainsTextPermite verificar la presencia de un texto específico dentro de una respuesta abierta.if(ContainsText ([Q1],'mar')==1)
Comprueba si la respuesta de texto a la pregunta Q1 contiene la palabra «mar».
StartWithTextCompara el inicio de una secuencia con una secuencia especificada.if(StartWithText({Mobile},'+39')==1)
Comprueba si el campo Mobile comienza con «+39».
EndWithTextCompara el final de una secuencia con una secuencia especificada.if(EndWithText({Identification},'123')==1)
Comprueba si el campo Identification termina con «123».
Otras funciones especiales

Las siguientes funciones fueron desarrolladas para gestionar excepciones especiales y pueden utilizarse tanto dentro de condiciones como de comandos. El uso de estas funciones generalmente se limita a requisitos complejos específicos.

GetVariablePermite obtener el valor de una variable (del nominativo o de una pregunta) creando dinámicamente el nombre de la variable.getVariable('{fecha_de_nacimiento_hijo_'+{ison}+'}')
Obtiene el valor de la variable «ison» (por ejemplo 3) y lo utiliza para generar el nombre de la variable «fecha_de_nacimiento_hijo_3» obteniendo el valor relacionado.
JoinPermite forzar la combinación de secuencias evitando que sean interpretadas como números. Por ejemplo 10+02+12 da 24, mientras que join(10,02,12) da 100212.join(10,02,12)
Crea la secuencia 100212.
join(text,02,[Q1])
Crea la secuencia text02respuestaAbiertaQ1.
RandomCrea un número aleatorio entre el número mínimo y el número máximo indicados. Es posible especificar un nombre para guardar el número generado y utilizarlo posteriormente.random(1, 10)
Crea un número aleatorio entre 1 y 10.
random(1, 10, 'mi número aleatorio')
Crea un número aleatorio entre 1 y 10 y lo guarda con el nombre especificado. Utilizando la misma sintaxis (en el FlowScript de cualquier otra página del cuestionario) se volverá a llamar al número guardado y generado la primera vez.
ReplaceReemplaza el texto especificado dentro de una secuencia. (Disponible a partir de IdSurvey 8.1)Replace([Q1], 'coche', 'autobús')
Devuelve la secuencia de la respuesta de texto de la pregunta Q1 reemplazando la palabra «coche» por «autobús».
Replace({teléfono}, '+39', '')

Devuelve el campo teléfono sin el prefijo +39.
GetItemByRankingDevuelve la etiqueta o el código del elemento según su posición. (Disponible a partir de IdSurvey 8.1)GetItemByRanking(Q1, 1, label)
Devuelve la etiqueta del elemento en primera posición en la pregunta de arrastrar y soltar (o – para la matriz – devuelve el texto de la fila donde se selecciona la respuesta con código 1).
GetItemByRanking(Q15, 3, code)

Devuelve el código del elemento en tercera posición en la pregunta de arrastrar y soltar (o – para la matriz – devuelve el código de la fila donde se selecciona la respuesta con código 3).

GetItemByRanking(Q1, 1, auto)

o
GetItemByRanking(Q1, 1)

Devuelve la etiqueta del elemento en primera posición en la pregunta de arrastrar y soltar. Si la etiqueta no está disponible se obtiene el código.
getResponseDevuelve la respuesta seleccionada (como secuencia) y permite especificar los datos a recuperar y el formato del separador de respuestas múltiples. (Disponible a partir de IdSurvey 8.1)getResponse(Q1)
o
getResponse(Q1, auto)
Devuelve la respuesta abierta (si está disponible) o la etiqueta de la respuesta seleccionada en la pregunta Q1. En caso de respuestas múltiples, se obtienen todas las opciones separadas por el carácter pipe » | «.
getResponse(Q1, auto, ', ')
Como el ejemplo anterior pero en caso de respuestas múltiples, se obtienen todas las opciones separadas por una coma y un espacio.
getResponse(Q1, opentext)
Devuelve la respuesta de texto de la pregunta Q1.
getResponse(Q1, label)
Devuelve la etiqueta de la respuesta seleccionada en la pregunta Q1.

getResponse(Q1, code)

Devuelve el código de la respuesta seleccionada en la pregunta Q1. En caso de respuestas múltiples, se obtienen todas las opciones separadas por el carácter pipe » | «.

getResponse(Q1, code, ', ')

Devuelve el código de la respuesta seleccionada en la pregunta Q1. En caso de respuestas múltiples, se obtienen todas las opciones separadas por una coma y un espacio.

getResponse(Q1, commentbox)

Devuelve el texto introducido en el Campo de texto tras línea.
FindContactId

y

Current

Devuelve el id del primer contacto que cumple una condición de búsqueda en la encuesta actual o, si se especifica, en la encuesta indicada. Si no encuentra coincidencias, devuelve un valor vacío.

En la condición de búsqueda, los campos se evalúan en el contexto del contacto encontrado por la función; para compararlos con los valores del contacto actual es necesario usar current(campo).

findcontactid(({Email}=='juan.perez@correo.es'))
Devuelve el id del primer contacto de la encuesta actual con email igual a juan.perez@correo.es.

findcontactid(({Email}=='juan.perez@correo.es'), 3050)

Devuelve el id del primer contacto de la encuesta 3050 con email igual a juan.perez@correo.es.

findcontactid(({Email}==current({Email})), 3050)

Devuelve el id del primer contacto de la encuesta 3050 con email igual al del contacto actual.
CloneContactDuplica el contacto actual.CloneContact();
Duplica el contacto actual en la misma encuesta. Si el FlowScript se ejecuta de nuevo, por ejemplo al volver a la página, el contacto no se duplica otra vez.

CloneContact(true);

Duplica el contacto actual en la misma encuesta permitiendo la creación de múltiples duplicados. Si el FlowScript se ejecuta de nuevo, el contacto puede duplicarse nuevamente.

CloneContact(false, 123);

Duplica el contacto actual en la encuesta 123. Si el FlowScript se ejecuta de nuevo, el contacto no se duplica otra vez.

CloneContact(true, 123);

Duplica el contacto actual en la encuesta 123 permitiendo la creación de múltiples duplicados. Si el FlowScript se ejecuta de nuevo, el contacto puede duplicarse nuevamente.

Nota: en modo CAPI la duplicación solo está permitida en la misma encuesta.

Nota: los contactos clonados en encuestas en modo de prueba se eliminan al alcanzarse el número máximo de entrevistas de prueba o al desactivarse el test mode.

Shorthand if…then…else #

En FlowScript es posible utilizar la instrucción if…then…else incluso en la forma conocida como «shorthand». Esta forma es necesaria para utilizar las condiciones dentro de otros comandos o para introducir el texto dinámico en el cuerpo del cuestionario. Técnicamente, la forma «shorthand» del if permite añadir una condición dentro de funciones que solo aceptan expresiones. A pesar de la diferente sintaxis, la lógica y el funcionamiento no difieren del funcionamiento normal del if…then…else.

condición ? expresión_condición_verdadera : expresión_condición_falsa

Por ejemplo:

(Q1==1)?'privado':'empresa'

Si en la pregunta Q1 se seleccionó la opción con código 1, devuelve la secuencia «privado», de lo contrario devuelve «empresa».

(Q1==1)?{código_fiscal}:{número_identificación_fiscal}

Si en la pregunta Q1 se seleccionó la opción con código 1, devuelve el valor del campo de nominativo llamado «código_fiscal», de lo contrario devuelve «número_identificación_fiscal».

([Q1]>1)?'¿Qué edad tienen tus hijos?':'¿Qué edad tiene tu hijo?'

Si en la pregunta abierta Q1 se introdujo un número mayor que 1 (número de hijos), se mostrará el texto de la pregunta en forma plural, de lo contrario se mostrará la forma singular.

En el siguiente ejemplo mostraremos cómo crear condiciones if else «shorthand» combinadas.

( [Q1]>=4 ) ? 'positivo' : ( [Q1]<=2 ) ? 'negativo' : ( [Q1]==3 ) ? 'neutro' : ' '

i en la pregunta abierta Q1 se introdujo un valor mayor o igual a 4, el sistema devuelve la secuencia «positivo», de lo contrario comprueba si se introdujo un valor menor o igual a 2 y en este caso devuelve la secuencia «negativo»; de lo contrario comprueba si se introdujo el valor 3: en este caso devolverá la secuencia «neutro», de lo contrario devolverá una secuencia vacía.

Language special features

FlowScript da prioridad a la velocidad de programación y a la simplicidad de las expresiones, a expensas de la ortodoxia del lenguaje. Esto genera algunas peculiaridades que pueden confundir a un usuario experto en otros lenguajes de programación.

Secuencias con o sin comillas simples, ¿cuáles son las diferencias? #

La sintaxis completa y correcta de las secuencias requiere el uso de comillas simples. Si la secuencia incluye solo una palabra (es decir, sin espacios), es posible omitir las comillas simples.

Por lo tanto, la sintaxis [D1]==Marco is equal to [D1]=='Marco'.

La condición [D1]=='muy satisfecho' no puede escribirse sin comillas simples, ya que son necesarias para determinar el inicio y el final de una secuencia.

Asimetría de las comparaciones #

Los elementos que se comparan dentro de las condiciones (los elementos antes y después del operador de comparación) NO son iguales. El que aparece después del operador de comparación siempre se interpreta como una secuencia, mientras que el que precede al operador, si es una secuencia libre (sin comillas simples), se interpreta como un código de pregunta.

Por ejemplo, la condición D1==1 verifica si en la pregunta con código D1 se dio una respuesta con código 1″. Si invierto el orden de los elementos obtendré la condición 1==D1 que significa «verifica si en la pregunta con código 1 se dio una respuesta con código D1», lo cual es completamente diferente.

Por lo tanto, tenga siempre presente que las comparaciones NO son, en general, invertibles.

[/toggle]
What are your feelings
Tabla de contenidos