Exemplos de ExpressionScript
From LimeSurvey Manual
Estrutura
A primeira parte do artigo descreve para que as expressões podem ser usadas e onde encontrar/adicionar uma expressão. A segunda parte apresenta exemplos de como usar expressões.
Categorias de expressões
O LimeSurvey usa expressões para as seguintes finalidades:
Relevância
Finalidade: ocultar grupos de perguntas/perguntas
A relevância controla se um grupo de perguntas ou uma pergunta é exibido ou ocultado. Se o resultado da expressão for "verdadeiro" (ou seja, 1), o elemento será exibido. 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 ou ação do participante em uma pergunta é 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. Você pode declarar um estilo para essas classes no arquivo template.css.
Saída de texto
Finalidades: (fazer algo e) escrever algum texto
Uma expressão pode ser usada para escrever algum texto. Por exemplo, você pode testar ou calcular algo e definir a saída de acordo com o resultado do teste ou do cálculo. Ela também pode ser usada para inserir o texto da pergunta, as respostas, os tipos de pergunta etc. de uma pergunta usada antes da expressão. A saída de texto pode ser usada em qualquer lugar em que um texto seja exibido e pode retornar qualquer tipo de resultado.
| Caso de uso | Descrição |
|---|---|
| Micropersonalização | Ajustar um texto, por exemplo, escrever "Sr." ou "Sra." dependendo de uma pergunta sobre gênero feita anteriormente |
| Cálculo | Calcular um valor e escrevê-lo, por exemplo, "A renda da sua família é xxx" |
| Referência | Inserir um texto de um elemento, por exemplo, "Seu nome é xxx. Qual é a sua idade?" |
Armazenamento de respostas
Finalidades: (fazer algo,) (escrever algum texto) e armazenar algo no banco de dados
O tipo de pergunta Fórmula pode ser usado para armazenar algo no banco de dados. Você pode fazer algo com uma expressão, exibir a pergunta de fórmula (que é semelhante a uma exposição do texto) e armazenar o resultado da expressão no banco de dados. A resposta é armazenada na tabela de respostas. Depois, o resultado pode ser usado no recurso de estatísticas ou ser importado em um dos formatos fornecidos pela funcionalidade de exportação do LimeSurvey.
Exemplos de expressões
Inserir uma resposta de uma pergunta anterior
Usar uma pergunta de fórmula oculta para preencher uma resposta automaticamente
Problema: Imagine que você tenha duas perguntas, Q1 e Q2. A Q1 pergunta a idade dos participantes. A Q2 divide os participantes em três grupos: idade abaixo de 20 anos, idade igual a 20 e idade acima de 20. Assim, a Q2 deve usar os valores "1", "2", "3", que correspondem às condições acima. Além disso, não podemos esquecer de tornar a Q2 invisível (a pergunta não será exibida no inquérito, mas os valores serão gravados, via "processo em segundo plano", na tabela de respostas).
Para preencher o banco de dados usando o tipo de pergunta Fórmula:
- Primeiro, crie uma pergunta com o código Q1 como pergunta de entrada numérica.
- Em seguida, crie outra pergunta com o código Q2 como pergunta de fórmula.
- Na aba "Configurações de exibição" da Q2:
- defina o campo "Sempre ocultar esta questão" como "Ligado"
- digite no campo "Fórmula" a expressão:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Criar uma página de resumo usando marcadores
Este tutorial demonstra como criar uma visão geral no final do inquérito, listando todas as perguntas e respostas por meio de marcadores do ExpressionScript. Ele também mostra como limitar essa visão geral apenas às perguntas respondidas.
Nosso exemplo pode ser baixado aqui: Exemplo de inquérito com campos de substituição.
Tipos de pergunta utilizados aqui:
1. Questões de resposta única / perguntas de texto único/numéricas
- Lista (Dropdown)
- Lista (Rádio) [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
- Texto curto múltiplo [Q]
- Múltipla escolha [M]
- Matriz [F]
- Matriz (Sim/Não/Não sei) [C]
- Matriz (escolha de 10 pontos) [B]
3. Perguntas com 2 escalas
- Matriz de dois níveis [1]
4. Perguntas com escalas X e Y
- Matriz (Números) [:]
5. Máscara da pergunta
- Exposição do texto [X]
Neste exemplo simples, nossa visão geral será uma lista simples com:
- Texto da pergunta: Resposta do usuário
Questões de resposta única / perguntas de texto único/numéricas
Para todos estes tipos de pergunta, o LimeSurvey armazenará uma única resposta:
- Lista (Dropdown)
- Lista (Rádio)
- Lista com comentários
- Escolha de 5 pontos
- Sim/Não
- Texto livre curto
- Texto livre longo
- Texto livre extenso
- Entrada numérica
- Equação
- Data
- Gênero
Supondo que o código da pergunta seja q1, podemos referenciar o texto da pergunta e a resposta usando:
- {q1.question}: {q1.shown}
Exemplo:
- Quantos anos você tem?: 25
Se você quiser verificar se a pergunta foi respondida, pode colocar uma instrução IF em torno da saída:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
Isto "se traduz" em: SE a pergunta com o código q1 não estiver vazia, exibir "- " E o texto da pergunta E ": " E o texto da resposta (a função join() une os elementos em uma nova string); SENÃO: não exibir nada ("" significa string vazia).
Pergunta com perguntas secundárias
Para todos estes tipos de pergunta, o LimeSurvey utiliza perguntas secundárias:
- Texto curto múltiplo
- Múltipla escolha
- Múltipla escolha com comentário
- Matriz
- Matriz (escolha de 5 pontos)
- Matriz (escolha de 10 pontos)
- Matriz (Sim/Não/Não sei)
- Matriz (Aumentar, Manter, Reduzir)
- Matriz por coluna
Supondo que o código da pergunta seja q2 e que as perguntas secundárias estejam numeradas como SQ001, SQ002 (numeração automática feita pelo LimeSurvey), podemos referenciar o texto da pergunta e a resposta usando:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
Para perguntas de múltipla escolha, faz sentido não mostrar o texto da pergunta secundária marcada, mas sim exibir um Y para cada opção selecionada:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Observe que, atualmente, não é possível exibir o texto de perguntas que possuem perguntas secundárias; consulte esta solicitação de recurso.
Exemplo 1 (supondo que o tipo de pergunta seja Múltipla escolha)
- Você conhece estas marcas de carro?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Se quiser exibir apenas os itens marcados, você pode colocar uma instrução IF em torno da saída e verificar o valor da caixa de seleção:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Use a função listifop se quiser exibir uma lista somente 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 (supondo que o tipo de pergunta seja Matriz (escolha de 10 pontos))
- Avalie a qualidade das marcas de carro abaixo em uma escala de 1=muito ruim a 10=muito bom?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Se quiser exibir apenas os itens avaliados, você pode colocar uma instrução IF em torno da saída e verificar se a pergunta secundária atual foi respondida usando:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Use a função listifop se, por exemplo, quiser exibir apenas uma lista dos itens selecionados com valor maior que oito, por exemplo: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
Pergunta com duas escalas
Vamos supor que os seguintes códigos estejam sendo usados:
- Código da pergunta: q4
- Códigos das perguntas secundárias: SQ001, SQ002, ...
- Códigos de resposta da escala 1: A1, A2, ...
- Códigos de resposta da escala 2: B1, B2, ...
Exemplo para se referir à resposta da terceira pergunta secundária na segunda escala: q4_SQ003_1 - Pergunta 4, pergunta secundária 3, segunda escala.
Vamos exibir os resultados das duas 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 exibir o texto da pergunta secundária, você precisa adicionar o ID da escala ao campo de substituição (embora os textos sejam os mesmos para ambas as escalas). Portanto, em vez de {q4_SQ001.question}, temos que usar {q4_SQ001_0.question} ou {q4_SQ001_1.question}.
Se quiser exportar/exibir apenas os resultados das perguntas secundárias com pelo menos uma resposta, use 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 se aplica a todas as perguntas de matriz que permitem uma resposta para cada célula (não apenas para cada linha, como mostrado anteriormente):
- Matriz (Textos)
- Matriz (Números)
Códigos utilizados como exemplo:
- Código da pergunta: q5
- Códigos das perguntas secundárias: SQ001, SQ002, ...
- Códigos de resposta: A1, A2, ...
Para se referir ao resultado de uma determinada pergunta secundária em uma determinada coluna, você precisa usar CódigoDaPergunta . '_' . CódigoDaPerguntaSecundária . '_' . CódigoDeResposta. Exemplo para se referir à resposta da terceira pergunta secundária e da segunda coluna: q5_SQ003_A2.
Vamos exibir 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, nesses tipos de pergunta, cada célula (combinação dos eixos X e Y) equivale a uma opção de resposta, é preciso testar 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
| Finalidade | 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}, quantos anos você 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 será exibida |
| Passos | Crie/edite a pergunta dois Insira "!is_empty(name)" em "Equação de relevância:" |
| Arquivo de exemplo | Hide_question_if_empty_question_group.zip |
![]()
| |
Ocultar grupo de questões se a resposta da pergunta anterior for Sim ou Não
| Finalidade | Ocultar grupo de questões se a resposta da pergunta anterior for Sim ou Não |
| Tipo | Relevância do grupo de questões |
| Exemplo | Página um, Grupo de questões um, Pergunta um: código da pergunta "PET", texto da pergunta "Você tem um animal de estimação?" -Sim -Não Página dois, Grupo de questões dois: Título "Sobre o(s) seu(s) animal(is) de estimação" A fazer: mostrar/ocultar o grupo de questões dois se a resposta da pergunta um for Sim/Não |
| Expressão | PET == "Y" |
| Descrição | PET é o código da pergunta cuja resposta você deseja verificar. Se você não usar um sufixo, o EM usará "Qcode.code". Assim, você compara o código de resposta da pergunta PET com o valor "Y". Se o participante responder "Sim", a expressão será verdadeira e o grupo de questões "Sobre o(s) seu(s) animal(is) de estimação" será exibido. |
| Passos | Crie/edite o grupo de questões dois Insira "PET == "Y"" em "Equação de relevância:" |
| Arquivo de exemplo | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Exibir o valor de um campo de pergunta de entrada de várias respostas
| Finalidade | Exibir o valor de um campo de pergunta de entrada de várias respostas |
| Tipo | Referência |
| Exemplo | Pergunta um: código da pergunta "AskChildAge", texto da pergunta "Quantos anos 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 | Você deseja usar o valor de uma pergunta secundária em uma pergunta seguinte. Você pode acessar o 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}." |
| Arquivo de exemplo | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
Validar o número de caixas marcadas por linha em uma pergunta "Matriz (Números) Checkbox"
| Finalidade | Validar o número de caixas marcadas por linha |
| Tipo | Validação |
| Exemplo | Pergunta do tipo "Matriz (Números) (Layout checkbox)" |
| Expressão | sum(...) |
| Descrição | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) determina se, no máximo, X caixas de seleção da linha A estão marcadas. Se você quiser verificar as três linhas (A, B, C), pode conectar a expressão usando "&&": (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) (Layout checkbox)". Insira a expressão acima em "Fórmula de validação da pergunta" nas configurações avançadas da pergunta (talvez seja necessário ajustar os nomes das variáveis!). |
| Arquivo de exemplo | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
Calcular a diferença entre duas datas
| Finalidade | Calcular a diferença entre duas datas |
| Tipo | Relevância / Pergunta do tipo 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 padrão): Você tem XXXX dias de vida. A fazer: calcular e exibir o número de dias entre a data informada 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 informada. A expressão acima calcula o número de segundos entre as duas datas informadas. O termo "/60/60/24" apenas converte o número de segundos em número de dias. Em vez de perguntar a "datetoday", você também pode usar strtotime('now') ou simplesmente time(), que retorna diretamente o número de segundos de janeiro de 1970 até agora (ou seja, o momento em que o inquérito foi respondido). Assim, você poderia descobrir rapidamente a idade de uma pessoa em anos com a equação {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25}. Em qualquer um desses casos, é essencial que a data seja informada em um formato adequado; 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 padrão. No texto da pergunta de texto padrão, insira: "Em {datetoday} você tinha {(strtotime(today)-strtotime(dob))/60/60/24} dias de vida." Observe: a função strtotime funciona com MUITOS formatos de data, mas não com todos. Se tiver problemas, defina o Formato da data do seu inquérito como mm/dd/aaaa, aaaa-mm-dd ou dd.mm.aaaa" |
| Arquivo de exemplo | Date_difference.zip |
| |
Usar o ExpressionScript em avaliações
Aqui está outro exemplo de como usar o ExpressionScript com perguntas do tipo matriz e avaliações:</ br>
Digamos que você tenha 2 perguntas de matriz e queira salvar no banco de dados os resultados do cálculo. Na verdade, é simples: você precisará criar e testar suas matrizes e enviar uma resposta de teste para ver se funciona e se mostra os resultados na página de conclusão.
Detalhes da implementação:
- adicione uma pergunta do tipo equação
- adicione a linha a seguir, supondo que Q1 seja o código da sua pergunta de matriz e Q2 seja o da segunda:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
Observe que SQ001 é o código padrão de qualquer pergunta secundária. Se você alterar o código da pergunta secundária, ajuste a equação acima de acordo.
Usar em_validation_q em uma matriz
Você pode usar a fórmula de validação da pergunta para controlar uma matriz com qualquer condição.
Detalhes da implementação:
- para a primeira matriz: matriz 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 Fórmula de validação da pergunta inteira e insira
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- para a segunda matriz: matriz 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 Fórmula de validação da pergunta inteira e insira
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








