ExpressionScript - Apresentação
From LimeSurvey Manual
Introdução
O LimeSurvey usa o Script de expressão, que permite ao LimeSurvey oferecer suporte a ramificações, avaliações, validações e personalizações mais complexas. Ele substitui a forma como o LimeSurvey gerencia substituições, Condições e avaliações no back-end. Também acelera consideravelmente o processamento, pois elimina a maioria das leituras no banco de dados em tempo de execução. O Script de expressão foi desenvolvido pelo Dr. Thomas White (TMSWhite).
Definições principais
- Expressão: qualquer conteúdo entre chaves:
- Desde que não haja espaço em branco imediatamente após a chave de abertura ou antes da chave de fechamento.
- O conteúdo da expressão é avaliado pelo EM, portanto pode conter fórmulas matemáticas, funções e processamento complexo de textos e datas.
- Personalização (tailoring): às vezes chamada de "piping". É o processo de modificar um texto de forma condicional:
- Você tem acesso a todos os 'campos de substituição', aos dados do participante e aos dados de resposta.
- Você também tem acesso mais fácil às perguntas, às respostas e às suas propriedades.
- Equação de relevância: um novo atributo de pergunta que controla a visibilidade da pergunta:
- Se houver uma equação de relevância, a pergunta só será exibida se a relevância for avaliada como verdadeira.
- Internamente, todos os comandos array_filter e array_filter_exclude se tornam relevância no nível da pergunta secundária.
- SGQA (como as variáveis eram nomeadas no passado):
- Significa Survey-Group-Question-Answer (inquérito-grupo-pergunta-resposta)
- Os nomes de variáveis SGQA são parecidos com 123X5X382X971 e podem ter sufixos de perguntas secundárias.
- Esses nomes de variáveis são específicos dos códigos S/Q/G/A do banco de dados subjacente, por isso muitas vezes precisam ser alterados
- Tipo de pergunta Fórmula: um novo tipo de pergunta que salva cálculos ou relatórios no banco de dados:
- É como uma pergunta Boilerplate, mas seu conteúdo é salvo no banco de dados mesmo que você defina "Sempre ocultar esta questão".
- Código da pergunta: este é o nome de variável preferido para o EM:
- Pode ser um nome descritivo que indique a finalidade da pergunta, facilitando a leitura de lógicas complexas.
- Códigos de pergunta válidos NÃO devem começar com um número; portanto, ao usar o código da pergunta para numerar suas perguntas, use simplesmente "q1", "q1a" ou "g1q2".
- Este é o nome que a variável recebe se você exportar os dados para o SPSS ou o R. Portanto, se você faz análises estatísticas, precisa criar apenas códigos de pergunta únicos.
Preciso usar o Script de expressão?
A resposta curta é "não". No entanto, isso depende muito da complexidade do inquérito que você deseja criar.
Por exemplo, o editor de condições cobre algumas expressões básicas que podem ser aplicadas às perguntas do seu inquérito. No entanto, o editor de condições é limitado. É por isso que o Script de expressão é usado: ele amplia o leque de possibilidades de personalização.
Posso combinar Condições e Equações de relevância?
Sim. Você pode usar o editor de condições em algumas perguntas e Equações de relevância em outras.
Você não pode ter condições e expressões configuradas na mesma pergunta! Depois que uma condição é configurada, ela substitui qualquer expressão escrita no campo da equação de relevância. Além disso, o campo Equação de relevância não pode mais ser editado manualmente.
Ainda assim, há uma maneira de usar expressões e condições na mesma pergunta. Como mencionado acima, uma condição substitui o campo da equação de relevância. Depois de configurá-la, verifique qual é a equação recém-criada e copie-a para um editor de texto. Exclua a condição recém-criada do editor de condições e, em seguida, edite a pergunta adicionando as expressões baseadas na condição, copiadas do arquivo do seu editor de texto, junto com as demais expressões que deseja usar.
Como devo escolher entre Condições e Relevância?
Veja a seguir uma lista dos prós e contras de cada estilo:
| Estilo | Prós | Contras |
|---|---|---|
| Condições | 1. Boa interface gráfica (GUI) para criar condições simples. 2. GUI bem documentada e bem compreendida pela equipe de suporte |
1. Suporta apenas comparações simples e não lida bem com condições "E" e "OU". 2. Condições em cascata funcionam de forma irregular 3. Lento - uso intensivo do banco de dados - pode deixar inquéritos longos mais lentos. 4. Alguns problemas relatados ao recarregar condições. 5. A GUI não escala bem quando há dezenas, centenas ou milhares de perguntas. 6. Pode ser lento converter inquéritos em papel, pois é necessário usar nomes SGQA. 7. Muitas vezes é necessário um programador para codificar a lógica personalizada exigida por ramificações complexas. |
| Relevância | 1. Suporta lógica muito complexa, incluindo mais de 80 funções e operadores matemáticos/de texto. 2. Suporte perfeito para lógica em cascata. 3. Rápido - sem chamadas extras ao banco de dados, suportando inquéritos com mais de 1000 perguntas. 4. Sem problemas ao recarregar a lógica, pois não requer códigos SGQA. 5. O realce de sintaxe escala para inquéritos com mais de 1000 perguntas. 6. Fácil e rápido de usar para grupos que desejam informatizar inquéritos existentes em papel. 7. Suporta facilmente entrevistas semiestruturadas e inquéritos epidemiológicos sem a necessidade de um programador. |
1. Sem GUI para condições simples - usa o realce de sintaxe no lugar. |
- Recomendamos que você use o que melhor atender às suas necessidades.
- Para uma explicação mais detalhada dos recursos do EM, clique na seguinte hiperligação.
Primeiros passos
A melhor forma de começar a usar o EM é:
- Instalar a versão estável mais recente em https://www.limesurvey.org/en/download.
- Importar e explorar alguns inquéritos de exemplo.
- Explorar os casos de uso e tutoriais e os exemplos passo a passo.
- Explorar a documentação do EM (esta página)
- Testes unitários de expressões isoladas (avançado)
- mostra exemplos de uso de todas as funções e operadores do EM, e os resultados em PHP e JavaScript;
- observe que há poucas funções que geram resultados diferentes nas versões PHP e JavaScript, portanto esta página permite que você planeje a lógica do EM de acordo.
- Testes unitários de expressões isoladas (avançado)
Terminologia
Estas palavras são comumente usadas para descrever os recursos do EM:
- Ramificação baseada em relevância - se uma pergunta é relevante, ela é feita; caso contrário, não (por exemplo, torná-la invisível e marcá-la como NULL no banco de dados). Você encontra os campos de relevância no painel do editor de perguntas, bem como no painel do editor de grupos de questões. Este último é usado para aplicar um conjunto de condições a um grupo inteiro sem precisar copiar a mesma condição para cada pergunta, e/ou combinar lógica condicional no nível do grupo e da pergunta.
- Personalização - Depois de saber quais perguntas devem ser feitas, a personalização (às vezes chamada de piping) especifica como a pergunta deve ser feita. Isso permite oferecer suporte não só à substituição simples (como {TOKEN:FIRSTNAME}), mas também à conjugação de verbos e à flexão de substantivos com base no gênero ou no número dos seus sujeitos. Também permite alterar a mensagem exibida ao respondente do inquérito com base em ele ter respondido (ou em como respondeu) a outras perguntas.
- Fórmulas - O EM adiciona um novo tipo de pergunta chamado Fórmula, que armazena o resultado de uma expressão. Os resultados das fórmulas são calculados e gravados no banco de dados, mesmo que você os oculte na página. Assim, são usados para cálculos de pontuação ocultos, navegação baseada em equações complexas, avaliações e relatórios que serão gerados e armazenados no banco de dados.
Relevância e relevância em cascata
Todo tipo de pergunta agora tem uma opção de relevância que controla se a pergunta é exibida ou não. O EM processa cada equação de relevância na ordem em que aparecem no inquérito. Se a expressão for verdadeira (ou estiver ausente, para dar suporte a inquéritos legados), a pergunta será exibida. Se não for relevante, a pergunta será ocultada e o valor será definido como NULL no banco de dados. Se não houver perguntas relevantes em um grupo, o grupo inteiro será ignorado.
Além disso, se qualquer uma das variáveis de uma expressão for irrelevante, a expressão sempre será avaliada como falsa. Isso habilita a relevância em cascata, para que você não precise escrever equações de relevância muito longas para cada pergunta.
Digamos que você tenha cinco perguntas Q1-Q5 e queira mostrar a Q2 somente se a Q1 foi respondida, a Q3 somente se a Q2 foi respondida, e assim por diante. As equações de relevância poderiam ser:
| Código da pergunta | Relevância | Pergunta |
|---|---|---|
| Q1 | 1 | Qual é o seu nome? |
| Q2 | Q1 | {Q1}, quantos anos você tem? |
| Q3 | Q2 | Então, você tem {Q2} anos. Você é casado(a)? |
| Q4 | Q3 == "Y" | {Q1}, há quanto tempo você é casado(a)? |
| Q5 | Q4 | Quantos filhos você tem, {Q1}? |
Relevância no nível do grupo
O ExpressionScript também suporta relevância no nível do grupo. Isso facilita a implementação de repetições. Digamos que você queira coletar informações de até 10 entidades (como produtos ou pessoas de um domicílio), em que primeiro você determina quantas entidades precisam de perguntas de acompanhamento (por exemplo, perguntando quantas pessoas moram no domicílio ou pedindo que as pessoas marquem de quais produtos gostam em uma longa lista). Depois de saber quantas entidades precisam de acompanhamento, você pode usar relevância no nível do grupo como {count >= 1}, {count >=2}, ... {count >= 10} para cada um dos 10 grupos de perguntas de acompanhamento. Dentro de cada grupo, você pode ter lógica condicional no nível da pergunta (por exemplo, perguntas de acompanhamento específicas por gênero ou idade para cada pessoa). As equações de relevância no nível da pergunta e do grupo são combinadas com E (AND) para determinar o que deve ser exibido.
Para conferir um exemplo assim, importe o seguinte inquérito: exemplo de inquérito de censo.
Na captura de tela abaixo, pode-se observar que o grupo Person 1 é exibido (ou relevante) se o respondente morar com pelo menos outro coabitante:

Personalização/Piping
Tudo o que estiver entre chaves agora é tratado como uma expressão (com uma exceção descrita abaixo). As expressões têm acesso a todos os LimeReplacementFields e variáveis (por meio de vários aliases), a todos os operadores de equação típicos (matemáticos, lógicos e de comparação) e a dezenas de funções (que funcionam dinamicamente até mesmo no lado do cliente).
Ao usar essas equações, você pode fazer coisas como:
- Exibir condicionalmente mensagens personalizadas aos respondentes com base em respostas anteriores;
- Criar avaliações e exibir os resultados da avaliação (ou ramificar condicionalmente ou exibir mensagens) com base nesses resultados, tudo isso sem usar o próprio módulo de avaliações;
- Conjugar verbos e flexionar substantivos em perguntas, respostas e relatórios;
- Exibir resumos das respostas antes da página "Mostrar suas respostas" no final do inquérito.
Fórmulas
Existe um novo tipo de pergunta chamado Fórmula. Pense nele como um tipo de pergunta Exposição do texto, com a diferença de que ele armazena no banco de dados o valor do que é exibido. Assim, se o texto da pergunta Fórmula contiver um cálculo de avaliação, esse valor será armazenado no banco de dados em uma variável que poderá ser exibida em estatísticas públicas ou privadas.
Sintaxe
Tudo o que estiver contido entre chaves agora é considerado uma expressão (com uma exceção: não pode haver espaço em branco no início nem no fim - isso é necessário para garantir que o ExpressionScript não tente processar JavaScript incorporado).
Observe que não há problema em as expressões ocuparem várias linhas, desde que não haja espaço em branco após a chave de abertura nem antes da chave de fechamento. Isso é especialmente útil para instruções "if()" aninhadas como esta:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Very Soft',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Somewhat Soft',
if(PFTotals == 0,
'Moderate',
if(PFTotals == 1,
'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Very Hard',
''
)
)
)
)
)
)
)
)}
O ExpressionScript suporta a seguinte sintaxe:
- Todos os operadores matemáticos padrão (por exemplo, +,-,*,/,!);
- Todos os operadores de comparação padrão (por exemplo, <,<=,==,!=,>,>=, além de seus equivalentes: lt, le, eq, ne, gt, ge);
- Parênteses (para que você possa agrupar subexpressões);
- Operadores condicionais (por exemplo, &&,| | e seus equivalentes: and, or);
- Strings entre aspas simples e duplas (que podem incorporar strings com o outro tipo de aspas);
- Operador vírgula (permite ter uma lista de expressões e retornar apenas o resultado final);
- Operador de atribuição (=);
- Variáveis predefinidas (para se referir a perguntas, atributos de perguntas e respostas) - por exemplo, os códigos SGQA;
- Funções predefinidas (já existem mais de 80, e é fácil adicionar outras).
Operadores
A sintaxe do EM segue a precedência normal dos operadores:
| Nível | Operador(es) | Descrição |
|---|---|---|
| 1 | () | parênteses para agrupamento ou chamada de funções |
| 2 | ! - + | operadores unários: não, negação, mais unário |
| 3 | * / | multiplicação, divisão |
| 4 | + - | adição, subtração |
| 5 | < <= > >= lt le gt ge | comparações relativas |
| 6 | == != eq ne | comparações de igualdade |
| 7 | and | AND lógico |
| 8 | or | OR lógico |
| 9 | = | operador de atribuição |
| 10 | , | operador vírgula |
Aviso sobre incompatibilidade entre número e string e comparação alfabética/numérica
Ao comparar valores com comparações relativas ou de igualdade, preste atenção a incompatibilidades. Um valor digitado pelo usuário (ou fornecido por meio de um código de resposta) pode ser usado como número se for claramente um número.
Se você colocar um dos valores entre ", será feita uma comparação de texto/string. Se quiser comparar como número, nunca coloque um número entre ".
Por exemplo, Q0.NAOK > "50" é verdadeiro se Q0.NAOK for uma pergunta numérica com valor 9. Isso ocorre porque o operador > assume que se trata de uma comparação alfabética e não numérica.
Para garantir que você compare valores inteiros, você pode usar intval(Q0.NAOK) > 50. Lembre-se apenas de que, se Q0.NAOK não for um número (vazio ou uma string), então intval(Q0.NAOK) === 0. Para comparar valores de string ("A" < "B"), use strcmp diretamente: strcmp(Q0.NAOK,"B") ou strcmp(Q0.NAOK,"A5").
Cuidado ao usar o operador de atribuição (=)
Você deve evitar o uso de operadores de atribuição, a menos que seja absolutamente necessário, pois eles podem causar efeitos colaterais inesperados. Por exemplo, se você alterar o valor de uma resposta anterior, a relevância em cascata e a lógica de validação entre essa pergunta e a pergunta atual não são recalculadas, e você pode acabar com dados internamente inconsistentes (por exemplo, perguntas que permanecem respondidas, mas deveriam ter sido anuladas (NULL), ou perguntas que são ignoradas, mas deveriam ter sido respondidas). Em geral, se você quiser atribuir um valor a uma variável, deve criar uma pergunta do tipo Fórmula e usar uma expressão para definir seu valor. No entanto, há raras ocasiões em que as pessoas realmente precisam desse operador, por isso o disponibilizamos.
Para alertar você sobre esse operador, ele é exibido em vermelho nas equações de sintaxe (para que você não o confunda com "==").
Usando o operador de atribuição
Os principais motivos pelos quais você pode querer usar o operador de atribuição são:
- Você precisa definir o valor padrão por meio de uma fórmula para uma pergunta que não aceita valores padrão (como lista de botões de opção, em que a interface permite escolher uma das opções de resposta, mas não permite inserir uma equação). No entanto, tenha cuidado, pois o LimeSurvey não poderá validar se sua equação gera uma das respostas permitidas para essa pergunta;
- Você precisa alterar à força a resposta a uma pergunta anterior com base em uma resposta posterior;
- etc...
Você pode usar todo o sistema do gerenciador de expressões para essa finalidade. É melhor usar uma Fórmula para isso.
Alguns exemplos:
- Definir a resposta de uma pergunta de texto curto em minúsculas :
{QCODE=strtolower(QCODE.NAOK)}; - Definir uma resposta padrão para um tipo de pergunta de matriz no início de um inquérito :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Definir uma resposta padrão para um tipo de pergunta de matriz de textos no início de um inquérito :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Definir uma resposta com condição :
{QCODE=if(YesNo="Y","A1","")}.
Segurança XSS
Com o XSS ativado, algumas partes do sistema do gerenciador de expressões não podem ser usadas:
- iniciar uma tag HTML em uma expressão e terminá-la em outra expressão;
- usar uma expressão complexa dentro de uma URL.
Exemplos e soluções alternativas:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}não funciona com a segurança XSS; nesse caso, você pode usar{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, nesse caso você pode usar uma pergunta do tipo equação, pois usar um código de pergunta completo é permitido:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Acesso às variáveis
O ExpressionScript fornece acesso somente leitura a todas as variáveis de que você possa precisar. Para manter a compatibilidade com versões anteriores, ele oferece acesso ao seguinte:
- TOKEN:xxx - o valor de um código (token) (por exemplo, TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (somente para inquéritos que não sejam anônimos).
- Todos os valores {XXX} usados pelos temas.
- No texto da pergunta, você pode usar {QID}, substituído pelo ID da pergunta, e {SGQ}, substituído pelo SGQA da pergunta.
- {SAVEDID} para o ID da resposta atual
Além disso, o ExpressionScript permite que você se refira às variáveis pelo código da pergunta (a coluna 'title' da tabela de perguntas no banco de dados). Esse também é o rótulo da variável usado ao exportar seus dados para SPSS, R ou SAS. Por exemplo, se você tiver perguntas sobre nome, idade e sexo, poderá chamar essas variáveis de name, age e gender em vez de 12345X13X22, 12345X13X23 e 12345X13X24. Isso facilita a leitura das equações e a validação da lógica por todos, além de permitir reorganizar as perguntas sem precisar acompanhar os números dos grupos ou das perguntas.
Importante: É mais seguro se referir a variáveis que aparecem nas páginas ou perguntas anteriores.
Além disso, o ExpressionScript permite acessar várias propriedades da pergunta:
| Sintaxe | Significado | Exemplo | Resultado do exemplo |
|---|---|---|---|
| Qcode | um alias para Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | o código de resposta selecionado para a pergunta, se ela for relevante (caso contrário, em branco), ou o valor de texto, se não for uma pergunta codificada | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | igual a Qcode - veja a discussão sobre NAOK | {gender.NAOK} | 'M' |
| Qcode.value | o valor de avaliação da pergunta, se ela for relevante (caso contrário, em branco), ou o valor de texto, se não for uma pergunta codificada | {gender.value} | '1' |
| Qcode.valueNAOK | igual a Qcode.value - veja a discussão sobre NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | o valor exibido da pergunta | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | o texto da pergunta | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | indica se a pergunta é obrigatória (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | o número interno da pergunta (não o número sequencial) | {gender.qid} | 337 |
| Qcode.type | o tipo da pergunta | {gender.type} | 'G' |
| Qcode.jsName | o nome JavaScript correto da pergunta, independentemente de ter sido declarada nesta página ou não | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | o número interno do grupo (não o número sequencial) | {gender.gid} | 3 |
| Qcode.qseq | o número sequencial da pergunta, começando em 0 | {gender.qseq} | 5 |
| Qcode.gseq | o número sequencial do grupo, começando em 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | indica se a pergunta é relevante no momento (0 ou 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | a equação de relevância no nível da pergunta | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | a equação de relevância no nível do grupo | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | o valor SGQA desta pergunta | {gender.sgqa} | '1827X3X337' |
Problema com o editor HTML
Se você usar o editor HTML, alguns caracteres são substituídos por entidades HTML.
- & por &
- < por <
- > por >
Se você usar o editor HTML, precisará usar:
- and para &
- lt para <
- le para <=
- gt para >
- ge para >=
Recomenda-se limpar o HTML que aparece dentro da sua expressão. Se você usar o editor HTML do LimeSurvey, clique no botão "Source" (localizado na parte superior esquerda do editor) e exclua todos os caracteres que não estejam relacionados à sua expressão (por exemplo,
,
e assim por diante).
Nomenclatura das variáveis Qcode
Aqui estão os detalhes de como construir um Qcode (e acessar algumas propriedades) por tipo de pergunta. Em geral, os Qcodes são construídos assim:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Para comment (comentário) e other (outros), os códigos de pergunta correspondentes são QuestionCode_comment e QuestionCode_other, respectivamente.
| Tipo | Descrição | Código | Perguntas secundárias | Opções de resposta | Escalas | Código da resposta | Resposta exibida | Relevância |
|---|---|---|---|---|---|---|---|---|
| 5 | Escolha de 5 pontos (botões de opção) | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Matriz (escolha de 10 pontos) (botões de opção) | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Matriz (escolha de 5 pontos) (botões de opção) | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Matriz (rótulos flexíveis) escala dupla | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Matriz (flexível) - formato em coluna | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Matriz (flexível) - formato em linha | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Matriz (Aumentar, Manter, Reduzir) (botões de opção) | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Matriz (multiflexível) de 1 a 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Matriz (multiflexível) texto | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Matriz (Sim/Incerto/Não) (botões de opção) | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Pergunta de texto padrão (boilerplate) | Q11 | {Q11.shown} | |||||
| D | Data | Q12 | {Q12} | {Q12.shown} | ||||
| * | Equação | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Envio de arquivo (registra o número de arquivos enviados) | Q14 | {Q14} | {Q14>0} | ||||
| G | Lista suspensa de sexo | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Texto livre extenso | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Pergunta de idioma | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Lista - suspensa | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Lista suspensa/lista de botões de opção | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Lista com comentários suspensa/lista de botões de opção + área de texto | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Texto livre longo | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Múltipla escolha (caixa de seleção) | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Múltipla escolha com comentário (caixa de seleção + texto) | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Pergunta numérica múltipla | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Texto curto múltiplo | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Tipo de pergunta numérica | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Estilo de classificação (ranking) | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Texto livre curto | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Sim/Não (botões de opção) | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Uso do NAOK
NAOK --> "Not Applicable" (NA, não aplicável) is alright (OK, tudo bem)
Usar NAOK significa que todas ou algumas das variáveis são irrelevantes (ou seja, "Not Applicable" (NA, não aplicável) is alright (OK, tudo bem)).
Por exemplo: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) sempre retorna uma string vazia se uma das perguntas secundárias de Q1 estiver filtrada. Para contar o número de perguntas secundárias marcadas nessa pergunta, pode-se usar count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Se a pergunta secundária estiver oculta, o EM retorna uma string vazia.
Sem o NAOK, se uma pergunta ou uma pergunta secundária estiver oculta, o EM sempre retorna uma string vazia (o mesmo que retornar falso).
O .shown sempre usa o sistema NAOK (string vazia se estiver oculto), mas se você precisar do código da resposta, é sempre uma boa ideia adicionar .NAOK após o código da pergunta (exceto se você precisar do comportamento padrão e souber o que está fazendo).
Mais informações são fornecidas na subseção Substituição de condições em cascata.
As variáveis reservadas "this", "self" e "that"
Com frequência, você deseja avaliar todas as partes de uma pergunta, como contar quantas perguntas secundárias foram respondidas ou somar as pontuações. Outras vezes, você deseja processar apenas determinadas linhas ou colunas de uma pergunta (por exemplo, obter as somas de linhas ou colunas e armazená-las no banco de dados). Essas variáveis reservadas tornam esse processo relativamente simples.
Variável "this"
A variável "this" é usada exclusivamente nas opções "Fórmula de validação da pergunta" e "Equação de validação da subpergunta" (esta última não é possível pela interface gráfica). Ela se expande para os nomes de variáveis de cada uma das células dessas perguntas. Assim, se você quiser garantir que cada entrada seja maior do que três, defina a "Equação de validação da subpergunta" como (this > 3).
Variável "self"
As variáveis "self" e "that" são mais poderosas e funcionam como macros que são expandidas antes do processamento das equações. As opções de sintaxe da variável "self" são:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix é qualquer um dos sufixos normais de qcode (por exemplo, NAOK, value, shown)
- sub-selector pode ser um dos seguintes:
- comments - apenas perguntas secundárias que são comentários (por exemplo, Múltipla escolha com comentário e Lista com comentários);
- nocomments - apenas perguntas secundárias que não são comentários;
- sq_X - onde X é um identificador de linha ou coluna. Somente as perguntas secundárias que correspondem ao padrão X são selecionadas. Observe que a busca é feita no identificador de código completo, e então sq_X corresponde e inclui as perguntas secundárias nX, X, Xn (por exemplo, se você usar sq_1, as perguntas secundárias a1, 1a, 1, 11 ou 001 serão incluídas). Preste atenção ao tipo de pergunta de escala dupla, em que os códigos das perguntas secundárias são QCODE_SQCODE_1 e QCODE_SQCODE_1, e ao tipo de pergunta de classificação, em que os códigos das perguntas secundárias são QCODE_1, QCODE_2 ....
Exemplos:
- Alguma parte de uma pergunta foi respondida? -> {count(self.NAOK)>0}
- Qual é a pontuação de avaliação para esta pergunta? -> {sum(self.value)}
Você também pode usá-las para obter totais de linhas e colunas. Digamos que você tenha uma matriz de números com as linhas A-E e as colunas 1-5.
- Qual é o total geral? -> {sum(self.NAOK)}
- Qual é o total da linha B? -> {sum(self.sq_B.NAOK)}
- Qual é o total da coluna 3? -> {sum(self.sq_3.NAOK)}
Variável "that"
A variável "that" é como a variável "self", mas permite que você se refira a outras perguntas. Sua sintaxe é:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname é o nome da pergunta sem quaisquer extensões de pergunta secundária. Então, vamos criar uma pergunta 'q1', sendo 'q' também o seu qname.
Exemplos:
- Alguma parte da pergunta q1 foi respondida? -> {count(that.q1.NAOK)>0}
- Qual é a pontuação de avaliação de q2? -> {sum(that.q2.NAOK)}
- Qual é o total geral de q3? -> {sum(that.q3.NAOK)}
- Qual é o total da linha C em q4? -> {sum(that.q4.sq_C.NAOK)}
- Qual é o total da coluna 2 em q4? -> {sum(that.q4.sq_2.NAOK)}
As variáveis "self" e "that" podem ser usadas em qualquer relevância, validação ou personalização.
Há uma ressalva: ao usar o recurso Mostrar arquivo de lógica, ele exibirá o valor expandido de "self" e "that". Isso permite ver a equação real que será gerada, para que você (e o EM) possa validar se as variáveis existem ou não. Isso pode parecer confuso, pois você poderá ver equações bastante longas. No entanto, ao editar a pergunta, você verá a equação original usando "self" e/ou "that".
- quiser nomear explicitamente cada variável usada em uma equação, ou
- usar variáveis que não têm perguntas secundárias (por exemplo, perguntas de resposta única). Nesses casos, prefixar uma variável com "that" é exagero, e você corre o risco de obter resultados inesperados.
Acesso a funções
O ExpressionScript fornece acesso a funções matemáticas, de texto e definidas pelo usuário, conforme mostrado abaixo. Ele possui equivalentes em PHP e JavaScript para essas funções, de modo que funcionem de forma idêntica no lado do servidor (PHP) e no lado do cliente (JavaScript). É fácil adicionar novas funções.
Funções implementadas
As seguintes funções estão atualmente disponíveis:
| Função | Significado | Sintaxe |
|---|---|---|
| abs | Valor Absoluto | number abs(number) |
| acos | Arco cosseno | number acos(number) |
| addslashes | Adiciona barras invertidas antes de caracteres especiais de uma string | string addslashes(string) |
| asin | Arco seno | number asin(number) |
| atan | Arco tangente | number atan(number) |
| atan2 | Arco tangente de duas variáveis | number atan2(number, number) |
| ceil | Arredonda números fracionados para cima | number ceil(number) |
| checkdate | Retorna verdadeiro (1) se for uma data válida no calendário gregoriano | bool checkdate(month,day,year) |
| convert_value | Converte um valor numérico usando uma tabela de entrada e uma tabela de saída de valores numéricos | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Cosseno | number cos(number) |
| count | Conta o número de perguntas respondidas (não vazias) da lista | number count(arg1, arg12, ..., argN) |
| countif | Conta o número de perguntas respondidas da lista iguais ao primeiro argumento | number countif(matches, arg1, arg2, ... argN) |
| countifop | Conta o número de perguntas respondidas da lista que atendem ao critério (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formata a data/hora local | string date(format [, timestamp=time()]) |
| exp | Calcula a potência de e | number exp(number) |
| fixnum | Exibe números com vírgula como separador decimal, se necessário | string fixnum(number) |
| floor | Arrendonda números fracionados para baixo | number floor(number) |
| gmdate | Formata uma data/hora GMT | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Converte todas as entidades HTML nos caracteres correspondentes (sempre usa ENT_QUOTES e UTF-8) | string html_entity_decode(string) |
| htmlentities | Converte todos os caracteres aplicáveis em entidades HTML (sempre usa ENT_QUOTES e UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Converte caracteres especiais em entidades HTML (sempre usa ENT_QUOTES e UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Converte entidades HTML especiais de volta em caracteres (sempre usa ENT_QUOTES e UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formata uma data/hora local como inteiro | string idate(string [, timestamp=time()]) |
| if | if no estilo do Excel: if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Une elementos de um vetor com uma string | string implode(glue,arg1,arg2,...,argN) |
| intval | Retorna o inteiro de uma variável | int intval(number [, base=10]) |
| is_empty | Determina se uma variável é considerada vazia | bool is_empty(var) |
| is_float | Verifica se o tipo de uma variável é float | bool is_float(var) |
| is_int | Verifica se o tipo de uma variável é inteiro | bool is_int(var) |
| is_nan | Verifica se um valor não é um número | bool is_nan(var) |
| is_null | Verifica se uma variável é nula | bool is_null(var) |
| is_numeric | Verifica se uma variável é um número ou uma string numérica | bool is_numeric(var) |
| is_string | Verifica se o tipo de uma variável é string | bool is_string(var) |
| join (New in 2.0 build 130129) | Une elementos em uma nova string | join(arg1, arg2, ... argN) |
| list | Retorna uma lista separada por vírgulas de valores não vazios | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Retorna uma lista separada por 'glue' da propriedade especificada (retProp) das perguntas da lista que atendem ao critério (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Remove espaços em branco (ou outros caracteres) do início de uma string | string ltrim(string [, charlist]) |
| max | Procura o maior valor | number max(arg1, arg2, ... argN) |
| min | Procura o menor valor | number min(arg1, arg2, ... argN) |
| mktime | Retorna o timestamp UNIX de uma data (cada um dos 6 argumentos é opcional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | A função módulo ainda não é suportada. Você pode usar a função floor() como alternativa | floor(x/y)==(x/y) |
| nl2br | Insere quebras de linha HTML antes de todas as novas linhas de uma string | string nl2br(string) |
| number_format | Formata um número com grupo de milhares | string number_format(number) |
| pi | Retorna o valor de pi | number pi() |
| pow | Expressão exponencial | number pow(base, exp) |
| quoted_printable_decode | Converte uma string quoted-printable em uma string de 8 bits | string quoted_printable_decode(string) |
| quoted_printable_encode | Converte uma string de 8 bits em uma string quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Adiciona barra invertida antes de caracteres meta | string quotemeta(string) |
| rand | Gera um número aleatório; veja este exemplo | int rand() OR int rand(min, max) |
| regexMatch | compara uma string com uma expressão regular | bool regexMatch(pattern,input) |
| round | Arredonda um número de acordo com a precisão informada | number round(val [, precision]) |
| rtrim | Remove espaços em branco (ou outros caracteres) do final de uma string | string rtrim(string [, charlist]) |
| sin | Seno | number sin(arg) |
| sprintf | Retorna uma string formatada | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Raiz quadrada | number sqrt(arg) |
| stddev | Calcula o desvio padrão amostral de uma lista de números | number stddev(arg1, arg2, ... argN) |
| str_pad | Preenche uma string até um determinado tamanho com outra string | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Repetir uma string | string str_repeat(input, multiplier) |
| str_replace | Substitui todas as ocorrências da string de busca pela string de substituição | string str_replace(search, replace, subject) |
| strcasecmp | Comparação binária segura insensível a maiúscula/minúscula | int strcasecmp(str1, str2) |
| strcmp | Comparação binária segura | int strcmp(str1, str2) |
| strip_tags | Remove as tags HTML e PHP de uma cadeia de caracteres (string) | string strip_tags(str, allowable_tags) |
| stripos | Encontra a posição da primeira ocorrência de uma string unicode, sem diferenciar maiúsculas de minúsculas (começando em 0, retorna falso se não encontrada) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Tira a citação de um texto entre apóstrofos | string stripslashes(string) |
| stristr | strstr sem diferenciação de minúsculas e maiúsculas | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Retorna o tamanho de uma string | int strlen(string) |
| strpos | Encontra a posição da primeira ocorrência de uma string unicode (começando em 0, retorna falso se não encontrada) | int strpos(haystack, needle [ offset=0]) |
| strrev | Inverte uma palavra | string strrev(string) |
| strstr | Encontra a primeira ocorrência de uma palavra | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Converte uma string para minúsculas | string strtolower(string) |
| strtotime | Converte qualquer descrição textual de data/hora em inglês em um timestamp Unix | int strtotime(string) |
| strtoupper | Converte uma string para maiúsculas | string strtoupper(string) |
| substr | Retorna parte de uma string unicode | string substr(string, start [, length]) |
| sum | Calcula a soma de valores em um vetor | number sum(arg1, arg2, ... argN) |
| sumifop | Soma os valores das perguntas respondidas da lista que atendem ao critério (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangente | number tan(arg) |
| time | Retorna data/hora corrente do UNIX | number time() |
| trim | Remove espaços em branco (ou outros caracteres) do início e do fim de uma string | string trim(string [, charlist]) |
| ucwords | Converte para maiúscula o primeiro caractere de cada palavra de uma string | string ucwords(string) |
| unique | Retorna verdadeiro se todas as respostas preenchidas são únicas | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Criar novas funções de expressão com um Plugin (New in 4.0.0 )
Se você precisar de uma função que não existe no Principal, é possível criá-la com um Plugin. Essa nova função é criada usando o evento expressionManagerStart.
O ExpressionScript sabe quais variáveis são locais
Para criar corretamente o JavaScript de uma página, o EM precisa saber quais variáveis estão definidas na página e qual é o seu ID JavaScript (por exemplo, para document.getElementById(x)). Ele também precisa saber quais variáveis estão definidas em outras páginas (para garantir que os campos <input type='hidden' value='x'> necessários estejam presentes e preenchidos).
Condições em cascata
Se qualquer uma das variáveis for irrelevante, toda a equação será irrelevante (falsa). Por exemplo, na tabela a seguir, N/A significa que uma das variáveis não era relevante:
| Operador | Exemplo | a | b | Resultado |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
Substituição das condições em cascata
Suponha que você queira mostrar um total acumulado de todas as respostas relevantes. Você pode tentar usar a equação {sum(q1,q2,q3,...,qN)}. No entanto, internamente ela é traduzida para LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Assim, se qualquer um dos valores q1-qN for irrelevante, a equação sempre retornará falso. Nesse caso, sum() mostrará "0" até que todas as perguntas sejam respondidas.
Para contornar isso, é possível adicionar a cada variável o sufixo ".NAOK" (que significa que Não Aplicável é OK, do inglês "Not Applicable is OK"). Nesses casos, ocorre o seguinte comportamento. Suponha que você tenha uma variável q1.NAOK:
- q1 não é adicionada à cláusula LEManyNA()
- LEMval('q1') continuará verificando se a resposta é relevante e retornará "" se não for (assim, respostas irrelevantes individuais serão ignoradas, mas não invalidarão toda a expressão).
Portanto, a solução para o problema do total acumulado é usar a equação sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
O uso do sufixo .NAOK também permite que os autores criem inquéritos com vários caminhos possíveis que depois convergem para caminhos comuns. Por exemplo, suponha que os participantes respondam a um inquérito de uma forma que está fora do intervalo normal de respostas. O autor pode alertá-los de que talvez não obtenham resultados válidos e perguntar se realmente desejam continuar com o inquérito. Se responderem "Sim", o restante das perguntas será exibido. A condição para o "restante das perguntas" verificaria se as respostas iniciais foram dadas dentro do intervalo normal OU se o participante respondeu "Sim" à pergunta que só é relevante se ele respondeu fora do intervalo normal.
Como o ExpressionScript oferece suporte à micropersonalização condicional?
Eis um exemplo de micropersonalização (onde Tipo de pergunta=='expr' significa uma Equação):
| Código da pergunta | Relevância | Tipo de pergunta | Pergunta |
|---|---|---|---|
| name | 1 | text | Qual é o seu nome? |
| age | 1 | text | Quantos anos você tem? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Desculpe, {name}, você é {if( (age<16),'jovem',if( (age>80),'idoso','de meia-idade') ) } demais para este teste. |
| kids | !badage | yesno | Você tem filhos? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Quantos filhos você tem? |
| kid1 | parents && numKids >= 1 | text | Quantos anos tem o seu primeiro filho? |
| kid2 | parents && numKids >= 2 | text | Quantos anos tem o seu segundo filho? |
| kid3 | parents && numKids >= 3 | text | Quantos anos tem o seu terceiro filho? |
| kid4 | parents && numKids >= 4 | text | Quantos anos tem o seu quarto filho? |
| kid5 | parents && numKids >= 5 | text | Quantos anos tem o seu quinto filho? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, você disse que tem {age} anos e que tem {numKids} filhos. A soma das idades dos seus primeiros {min(numKids,5)} filhos é {sumage} |
Para baixar o exemplo de inquérito acima, clique na seguinte hiperligação: Exemplo de inquérito sobre o número de filhos.
Todas essas perguntas podem estar em uma única página (por exemplo, no mesmo grupo), e somente as perguntas relevantes serão exibidas. Além disso, à medida que você inserir as idades dos filhos, a expressão sum() na última pergunta será atualizada dinamicamente.
O ExpressionScript oferece essa funcionalidade envolvendo cada expressão em um elemento <span> nomeado. Sempre que um valor muda, ele recalcula a expressão que deve aparecer nesse elemento <span> e gera a exibição novamente. Você pode ter dezenas ou até centenas dessas expressões personalizadas na mesma página.
Realce de sintaxe
Para ajudar na inserção e na validação de expressões, o EM oferece realce de sintaxe com os seguintes recursos:
Tipos e significados do realce de sintaxe
| Cor | Exemplo | Significado | Dica de ferramenta | Comentários |
|---|---|---|---|---|
| fundo bege | Sample | a equação inteira | nenhuma | Qualquer conteúdo entre chaves que seja reconhecido como uma equação (por exemplo, sem espaço em branco no início ou no fim) será destacado com fundo bege para distingui-lo do texto ao redor |
| texto vermelho em negrito | Sample | Um erro | Alguma explicação sobre o erro | Pode ser uma variável desconhecida ou um erro em uma função. O inquérito está com problemas e as perguntas que dependem da respectiva expressão não serão exibidas aos participantes. |
| texto azul | Sample | nome de função | significado e sintaxe permitida | Refere-se a nomes de funções ou a elementos que deveriam ser funções, pois são seguidos de um parêntese de abertura. Eles são exibidos em texto azul em negrito. As dicas de ferramenta mostram o significado e a sintaxe permitida da função. |
| texto cinza | Sample | string | nenhuma | Strings entre aspas simples e duplas são exibidas em texto cinza. |
| texto ciano | Sample | variável definida na mesma página, | [nome]: pergunta; valor; answerList mostrando os códigos de cada valor | Qualquer variável definida na mesma página da pergunta que você está editando é exibida em texto ciano (pode ser atualizada em JavaScript). A dica de ferramenta mostra o nome, a pergunta em si e o valor atual (ou em branco, se não definido). Se o tipo de pergunta espera respostas de um conjunto enumerado de valores, é exibido o mapeamento dos códigos para os valores exibidos. |
| texto verde | Sample | variável definida em uma página anterior | [nome]: pergunta; valor; answerList mostrando os códigos de cada valor | Qualquer variável definida em uma página anterior é exibida em texto verde em negrito. A dica de ferramenta mostra o nome, a pergunta em si e o valor atual (ou em branco, se não definido). Se o tipo de pergunta espera respostas de um conjunto enumerado de valores, é exibido o mapeamento dos códigos para os valores exibidos. |
| texto rosa em negrito | Sample | variável definida em uma página posterior em geral: vazia no início do inquérito, mas pode ser preenchida com o índice ou ao voltar | [nome ou código SGQA]: pergunta; valor; answerList mostrando os códigos de cada valor | Qualquer variável definida em uma página posterior é exibida em texto rosa em negrito. A dica de ferramenta mostra o nome, a pergunta em si e o valor atual (ou em branco, se não definido). Se o tipo de pergunta espera respostas de um conjunto enumerado de valores, é exibido o mapeamento dos códigos para os valores exibidos. |
| texto marrom em negrito | Sample | um valor de substituição do LimeSurvey | o valor | As strings de substituição do LimeSurvey (como {TOKEN:xxx}, {PRIVACY_MESSAGE}) são exibidas em texto marrom em negrito. |
| texto vermelho | Sample | operador de atribuição (=) | mensagem de aviso | Se você usar um dos operadores de atribuição (=), ele será exibido em texto vermelho. Isso serve para evitar a reatribuição acidental de valores quando você, na verdade, queria verificar se a == b em vez de definir o valor de a = b. |
| texto preto normal | Sample | pontuação | nenhuma | Todos os outros sinais de pontuação dentro da expressão são exibidos em texto preto normal. |
| texto com caixa vermelha | uma linha vermelha em negrito envolve o erro | erro de sintaxe | descrição do erro | Quaisquer erros de sintaxe detectados são exibidos dentro de caixas vermelhas. A dica de ferramenta mostra o erro. Os exemplos incluem parênteses sem correspondência, uso de funções não definidas, passagem de um número incorreto de argumentos a funções, expressões mal estruturadas (por exemplo, operadores ausentes entre variáveis), tentativa de atribuir um novo valor a uma variável somente leitura, tentativa de atribuir valores a elementos que não são variáveis ou uso de sintaxe não suportada. Observe que o sistema de detecção de erros de sintaxe pode relatar apenas um erro em uma expressão, mesmo que haja vários; no entanto, se algum erro for detectado, pelo menos um será exibido. |
Leitura adicional
Inquéritos de exemplo do ExpressionScript
Casos de uso e tutoriais
Exemplos passo a passo
Referência para desenvolvedores