Exemplos de ExpressionScript
From LimeSurvey Manual
Estrutura
A primeira parte do artigo descreve para que podem ser utilizadas as expressões e onde pesquisar/adicionar uma expressão. A segunda parte apresenta exemplos de como utilizar expressões.
Categorias de expressões
O LimeSurvey utiliza expressões para os seguintes fins:
Relevância
Finalidade: ocultar grupos de perguntas/perguntas
A relevância controla se um grupo de perguntas ou uma pergunta é apresentado ou ocultado. Se o resultado da expressão for "verdadeiro" (ou seja, 1), o elemento será apresentado. Caso contrário (se o resultado da expressão for "falso", ou seja, 0), o elemento será ocultado.
Validação
Finalidade: validar entradas/ações em perguntas/perguntas secundárias/respostas
A validação controla se a entrada do participante numa pergunta ou ação é válida ou não. Se o resultado da expressão for "verdadeiro" (ou seja, 1), a classe "good" será aplicada ao elemento e à mensagem de validação. Caso contrário, se o resultado da expressão for "falso" (ou seja, 0), a classe "error" será aplicada ao elemento e à mensagem de validação. Pode declarar um estilo para estas classes no ficheiro template.css.
Saída de texto
Finalidades: (fazer algo e) escrever algum texto
Uma expressão pode ser utilizada para escrever algum texto. Por exemplo, pode testar ou calcular algo e definir a saída consoante o resultado do teste ou do cálculo. Também pode ser utilizada para inserir o texto da pergunta, as respostas, os tipos de pergunta, ... de uma pergunta utilizada antes da expressão. A saída de texto pode ser utilizada em qualquer local onde seja apresentado texto e pode devolver qualquer tipo de resultado.
| Caso de utilização | Descrição |
|---|---|
| Microajuste | Ajustar um texto, por exemplo, escrever "Sr." ou "Sra." consoante uma pergunta sobre o género colocada anteriormente |
| Cálculo | Calcular um valor e escrevê-lo, por exemplo, "O rendimento do seu agregado familiar é xxx" |
| Referência | Inserir um texto de um elemento, por exemplo, "O seu nome é xxx. Qual é a sua idade?" |
Armazenamento de respostas
Finalidades: (fazer algo,) (escrever algum texto) e armazenar algo na base de dados
O tipo de pergunta Equação pode ser utilizado para armazenar algo na base de dados. Pode fazer algo com uma expressão, apresentar a pergunta de equação (que é semelhante a um texto) e armazenar o resultado da expressão na base de dados. A resposta é guardada na tabela de respostas. Depois, o resultado pode ser utilizado na funcionalidade de estatísticas ou importado para um dos formatos disponibilizados pela funcionalidade de exportação do LimeSurvey.
Exemplos de expressões
Inserir uma resposta de uma pergunta anterior
Utilizar uma pergunta de equação oculta para preencher automaticamente uma resposta
Problema: Imagine que tem duas perguntas, Q1 e Q2. A Q1 pergunta aos participantes a sua idade. A Q2 divide os participantes em três grupos: idade inferior a 20 anos, idade igual a 20 anos, idade superior a 20 anos. Assim, a Q2 deve utilizar os valores "1", "2", "3", que correspondem às condições acima. Além disso, não devemos esquecer-nos de tornar a Q2 invisível (a pergunta não será apresentada no inquérito, mas os valores serão guardados, através do "processo em segundo plano", na tabela de respostas).
Para preencher a base de dados utilizando o tipo de pergunta Equação:
- Primeiro, crie uma pergunta com o código Q1 como pergunta de entrada numérica.
- Depois, crie outra pergunta com o código Q2 como pergunta de equação.
- No separador "Definições de apresentação" da Q2:
- defina o campo "Ocultar sempre esta pergunta" como "Ligado"
- escreva no campo "Equação" a expressão:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Criar uma página de resumo utilizando marcadores
Este tutorial demonstra como pode criar uma visão geral no final do inquérito, listando todas as perguntas e respostas através de marcadores do ExpressionScript. Mostra também como limitar essa visão geral apenas às perguntas respondidas.
O nosso exemplo pode ser descarregado aqui: Exemplo de inquérito com campos de substituição.
Tipos de pergunta utilizados aqui:
1. Perguntas com escolha única / perguntas de texto/numéricas simples
- Lista de Seleção (Dropdown)
- Lista (Botões de opção) [L]
- Sim/Não [Y]
- Texto livre longo [T]
- Texto livre curto [S]
- Entrada numérica [N]
- Equação [*]
2. Pergunta com perguntas secundárias
- Textos curtos múltiplos [Q]
- Escolha múltipla [M]
- Tabela [F]
- Matriz (Sim/Não/Incerto) [C]
- Matriz (Escolher entre 10 Pontos) [B]
3. Perguntas com 2 escalas
- Matriz com duas escalas [1]
4. Perguntas com escalas X e Y
- Matriz (Números) [:]
5. Perguntas pré-definidas
- Texto [X]
Neste exemplo simples, a nossa visão geral será uma lista simples com:
- Texto da pergunta: Resposta do utilizador
Perguntas com escolha única / perguntas de texto/numéricas simples
Para todos estes tipos de pergunta, o LimeSurvey guardará uma única resposta:
- Lista de Seleção (Dropdown)
- Lista (Botões de opção)
- Lista com comentário
- Escolher entre 5 Pontos
- Sim/Não
- Texto livre curto
- Texto livre longo
- Texto livre muito longo
- Entrada numérica
- Equação
- Data
- Género
Assumindo que o código da pergunta é q1, podemos referenciar o texto da pergunta e a resposta utilizando:
- {q1.question}: {q1.shown}
Exemplo:
- Que idade tem?: 25
Se pretender verificar se a pergunta foi respondida, pode colocar uma instrução IF em torno do resultado:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
Isto "traduz-se" em: SE a pergunta com o código q1 não estiver vazia, apresentar "- " E o texto da pergunta E ": " E o texto da resposta (a função join() junta elementos numa nova cadeia de caracteres); SENÃO: não apresentar nada ("" significa cadeia de caracteres vazia).
Pergunta com perguntas secundárias
Para todos estes tipos de pergunta, o LimeSurvey utiliza perguntas secundárias:
- Textos curtos múltiplos
- Escolha múltipla
- Escolha múltipla com comentários
- Tabela
- Matriz (Escolher entre 5 Pontos)
- Matriz (Escolher entre 10 Pontos)
- Matriz (Sim/Não/Incerto)
- Matriz (Aumentar/Manter/Reduzir)
- Matriz por coluna
Assumindo que o código da pergunta é q2 e que as perguntas secundárias estão numeradas SQ001, SQ002, (numeração automática feita pelo LimeSurvey), podemos referenciar o texto da pergunta e a resposta utilizando:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
Para perguntas de escolha múltipla, faz sentido não mostrar o texto da pergunta secundária assinalada, mas sim mostrar um Y por cada opção selecionada:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Note que, atualmente, não é possível apresentar o texto de perguntas com perguntas secundárias, veja este pedido de funcionalidade.
Exemplo 1 (assumindo que o tipo de pergunta é Escolha múltipla)
- Conhece estas marcas de automóveis?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Se quiser apresentar apenas os itens selecionados, pode colocar uma instrução IF em torno do resultado e verificar o valor da caixa de seleção:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Utilize a função listifop se quiser apresentar uma lista apenas com os itens selecionados, por exemplo: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
Onde that.q2 é expandido para todas as perguntas secundárias de q2. Consulte self, this e that para mais detalhes.
Exemplo 2 (assumindo que o tipo de pergunta é Matriz (Escolher entre 10 Pontos))
- Classifique a qualidade das marcas de automóveis abaixo numa escala de 1=muito má a 10=muito boa?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Se quiser apresentar apenas os itens classificados, pode colocar uma instrução IF em torno do resultado e verificar se a pergunta secundária atual foi respondida utilizando:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Utilize a função listifop se, por exemplo, quiser apresentar apenas uma lista dos itens selecionados com valor superior a oito, por exemplo: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
Pergunta com duas escalas
Vamos assumir que são utilizados os seguintes códigos:
- Códigos das perguntas: q4
- Códigos das perguntas secundárias: SQ001, SQ002, ...
- Códigos das respostas Escala 1: A1, A2, ...
- Códigos das respostas Escala 2: B1, B2, ...
Exemplo para se referir à resposta da terceira pergunta secundária e da segunda escala: q4_SQ003_1 - Pergunta 4, pergunta secundária 3, segunda escala.
Vamos apresentar os resultados de ambas as escalas e das duas primeiras perguntas secundárias:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
Para apresentar o texto da pergunta secundária, tem de adicionar o ID da escala ao campo de substituição (embora os textos sejam iguais para ambas as escalas). Assim, em vez de {q4_SQ001.question} temos de utilizar {q4_SQ001_0.question} ou {q4_SQ001_1.question}.
Se quiser exportar/apresentar apenas os resultados das perguntas secundárias com pelo menos uma resposta, utilize esta sintaxe para cada pergunta secundária:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
Pergunta com escalas X e Y
Isto aplica-se a todas as perguntas em matriz que permitem uma resposta para cada célula (e não apenas para cada linha, como mostrado anteriormente):
- Tabela de textos
- Matriz (Números)
Códigos utilizados (pressupostos):
- Código da pergunta: q5
- Códigos das perguntas secundárias: SQ001, SQ002, ...
- Códigos das respostas: A1, A2, ...
Para se referir ao resultado de uma determinada pergunta secundária de uma determinada coluna, tem de utilizar CódigoDaPergunta . '_' . CódigoDaPerguntaSecundária . '_' . CódigoDaResposta. Exemplo para se referir à resposta da terceira pergunta secundária e da segunda coluna: q5_SQ003_A2.
Vamos apresentar os resultados das colunas 1 a 3 das duas primeiras perguntas secundárias:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
Como, nestes tipos de pergunta, cada célula (combinação dos eixos X e Y) corresponde a uma opção de resposta, é necessário verificar a existência de dados para cada célula. Exemplo:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
Ocultar pergunta se a resposta da pergunta anterior estiver vazia
| Objetivo | Ocultar pergunta se a resposta da pergunta anterior estiver vazia |
| Tipo | Relevância da pergunta |
| Exemplo | Pergunta um: código da pergunta "name", texto da pergunta "Qual é o seu nome?" Pergunta dois: texto da pergunta "{name}, que idade tem?" A fazer: ocultar a pergunta dois se o campo de texto da pergunta um estiver vazio |
| Expressão | !is_empty(name) |
| Descrição | is_empty() determina se uma variável é considerada vazia. O "!" nega o resultado. Assim, se a variável não estiver vazia, a expressão será verdadeira e a pergunta é apresentada |
| Passos | Crie/edite a pergunta dois Insira "!is_empty(name)" em "Equação de relevância:" |
| Ficheiro de exemplo | Hide_question_if_empty_question_group.zip |
![]()
| |
Ocultar grupo de perguntas se a resposta da pergunta anterior for Sim ou Não
| Objetivo | Ocultar grupo de perguntas se a resposta da pergunta anterior for Sim ou Não |
| Tipo | Relevância do grupo de perguntas |
| Exemplo | Página um, Grupo de perguntas um, Pergunta um: código da pergunta "PET", texto da pergunta "Tem um animal de estimação?" -Sim -Não Página dois, Grupo de perguntas dois: Título "Sobre o(s) seu(s) animal(ais) de estimação" A fazer: mostrar/ocultar o grupo de perguntas dois consoante a resposta da pergunta um seja Sim/Não |
| Expressão | PET == "Y" |
| Descrição | PET é o código da pergunta cuja resposta pretende verificar. Se não utilizar um sufixo, o EM utilizará "Qcode.code". Assim, compara o código da resposta da pergunta PET com o valor "Y". Se o participante responder "Sim", a expressão é verdadeira e o grupo de perguntas "Sobre o(s) seu(s) animal(ais) de estimação" será apresentado. |
| Passos | Crie/edite o grupo de perguntas dois Insira "PET == "Y"" em "Equação de relevância:" |
| Ficheiro de exemplo | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Apresentar o valor de um campo de pergunta de resposta múltipla
| Objetivo | Apresentar o valor de um campo de pergunta de resposta múltipla |
| Tipo | Referência |
| Exemplo | Pergunta um: código da pergunta "AskChildAge", texto da pergunta "Que idade têm os seus filhos?". Códigos das perguntas secundárias -Child1 -Child2 -Child3 - ChildXXX Pergunta dois: código da pergunta "ReportChildAge", texto da pergunta "Sobre o seu primeiro filho: - CHILD1 tem AGE1." |
| Expressão | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| Descrição | Pretende utilizar o valor de uma pergunta secundária numa pergunta seguinte. Pode aceder ao valor da pergunta secundária com este tipo de expressão: QcodeQuestion_QcodeSubquestion.value |
| Passos | Crie/edite a segunda pergunta Insira este texto na descrição: "Sobre o seu primeiro filho: - {AskChildAge_Child1.question} tem {AskChildAge_Child1.value}." |
| Ficheiro de exemplo | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
Validar o número de caixas de seleção marcadas por linha numa pergunta "Matriz (Números)" com caixas de seleção
| Objetivo | Validar o número de caixas marcadas por linha |
| Tipo | Validação |
| Exemplo | Pergunta do tipo "Matriz (Números) (Disposição de caixa de seleção)" |
| Expressão | sum(...) |
| Descrição | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) determina se pelo menos X caixas de seleção da linha A estão marcadas. Se pretender verificar as três linhas (A, B, C), pode ligar a expressão utilizando "&&": (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| Passos | Crie/edite uma pergunta do tipo "Matriz (Números) (Disposição de caixa de seleção)". Insira a expressão acima em "Validação da equação da pergunta" nas definições avançadas da pergunta (poderá ter de ajustar os nomes das variáveis!). |
| Ficheiro de exemplo | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
Calcular a diferença entre duas datas
| Objetivo | Calcular a diferença entre duas datas |
| Tipo | Relevância / Tipo de pergunta Equação / Validação |
| Exemplo | Pergunta um (data/hora, código: DOB): Qual é a sua data de nascimento? Pergunta dois (data/hora, código: datetoday): Qual é a data de hoje? Pergunta três (texto informativo): Tem XXXX dias de idade. A fazer: calcular e apresentar o número de dias entre a data indicada na pergunta 1 e a da pergunta 2. |
| Expressão | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| Descrição | strtotime calcula o número de segundos entre 1 de janeiro de 1970 e a data indicada. A expressão acima calcula o número de segundos entre as duas datas indicadas. O termo "/60/60/24" limita-se a converter o número de segundos em número de dias. Em vez de pedir a "datetoday", também pode utilizar strtotime('now') ou simplesmente time(), que devolve diretamente o número de segundos desde janeiro de 1970 até agora (ou seja, o momento em que o inquérito foi respondido). Assim, pode calcular rapidamente a idade de uma pessoa em anos com a equação {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} Em qualquer um destes casos, é essencial que a data seja introduzida num formato correto, caso contrário a função strtotime() não funcionará corretamente. |
| Passos | Crie duas perguntas de data (para a data de nascimento e para a data de hoje) e uma pergunta de texto informativo. No texto da pergunta de texto informativo insira: "Em {datetoday} tinha {(strtotime(today)-strtotime(dob))/60/60/24} dias de idade." Tenha em atenção: a função strtotime funciona com MUITOS, mas não todos, os formatos de data. Se tiver problemas, defina o formato da data do seu inquérito para mm/dd/aaaa, aaaa-mm-dd ou dd.mm.aaaa" |
| Ficheiro de exemplo | Date_difference.zip |
| |
Utilizar o ExpressionScript em avaliações
Segue-se outro exemplo de como utilizar o ExpressionScript com perguntas do tipo tabela e avaliações:</ br>
Imagine que tem 2 perguntas em tabela e pretende guardar na base de dados os resultados do cálculo. É simples: terá de criar e testar as suas tabelas e submeter uma resposta de teste para ver se funciona e se obtém os resultados na página de conclusão.
Detalhes de implementação:
- adicione uma pergunta do tipo equação
- adicione a seguinte linha, partindo do princípio de que Q1 é o código da sua pergunta em tabela e Q2 é o da segunda:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
Tenha em atenção que SQ001 é o código predefinido de qualquer pergunta secundária. Se alterar o código da pergunta secundária, ajuste a equação acima em conformidade.
Utilizar em_validation_q numa tabela
Pode utilizar a validação da equação da pergunta para controlar uma tabela com qualquer condição.
Detalhes de implementação:
- para a primeira tabela: tabela de escolha única
- O código da pergunta é ARRAY
- Os códigos das perguntas secundárias são SQ01,SQ02,SQ03 e SQ04
- atualize a validação da equação da pergunta e introduza
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- para a segunda tabela: tabela de texto
- O código da pergunta é ARRAYTEXT
- Os códigos das perguntas secundárias no eixo Y são SY01,SY02,SY03 e SY04
- Atualize a validação da equação da pergunta e introduza
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








