x

Capítulos principais

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Guia de início rápido - LimeSurvey 3.0+
  3. Instalação - LimeSurvey CE
  4. Como criar um bom inquérito (guia)
  5. Iniciando
  6. Administrando o LimeSurvey
  7. Questionários - introdução
  8. Configurações do questionário
  9. Menu da pesquisa
  10. Estrutura da pesquisa
  11. Perguntas - introdução
  12. Grupos de perguntas - introdução
  13. Questionários - gerenciamento
  14. Opções da barra de ferramentas do questionário
  15. Questionário multilíngue
  16. ExpressionScript Engine - Guia de início rápido
  17. Recursos avançados e não categorizados
  18. FAQ geral
  19. Solução de problemas
  20. Soluções alternativas
  21. Licença
  22. Registro de mudanças da versão
  23. Plugins
 Actions

ExpressionScript - Apresentação

From LimeSurvey Manual

Esta página pode ter sido traduzida automaticamente e conter erros. Ver o original em inglês · Melhorar esta tradução
This page is a translated version of the page ExpressionScript - Presentation and the translation is 100% complete.


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

  1. 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.
  2. 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.
  3. 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.
  4. 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
  5. 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".
  6. 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.


Nota:
  • 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.

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:

  1. Exibir condicionalmente mensagens personalizadas aos respondentes com base em respostas anteriores;
  2. 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;
  3. Conjugar verbos e flexionar substantivos em perguntas, respostas e relatórios;
  4. 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
Para manter a consistência entre JavaScript e PHP, o operador de adição (+) soma se ambos os operandos forem numéricos, mas concatena se ambas as partes forem strings não numéricas. No entanto, recomendamos usar a função "join()" para concatenação, pois isso deixa sua intenção mais clara. Também evita resultados inesperados caso você esperasse strings, mas recebesse números (ou vice-versa).

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...


  Atenção : A atribuição é feita apenas em PHP. Isso significa que o valor não é atualizado na mesma página, mas somente quando o usuário passa para a página seguinte. Portanto, preste atenção quando o operador de atribuição for usado na mesma página com outras expressões.



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.


Observe que o XSS está ativado por padrão em qualquer instalação do LimeSurvey.


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 &amp;
  • < por &lt;
  • > por &gt;

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
  1. suffix é qualquer um dos sufixos normais de qcode (por exemplo, NAOK, value, shown)
  1. 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".

Você não deve usar essas variáveis se
  • 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)
Clique aqui se desejar saber mais sobre as funções planejadas (ou em avaliação).

<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:

  1. q1 não é adicionada à cláusula LEManyNA()
  2. 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.


Por dicas de ferramenta, referimo-nos à mensagem de popup exibida quando você passa o mouse sobre determinadas funções e variáveis.


Leitura adicional

Inquéritos de exemplo do ExpressionScript

Casos de uso e tutoriais

Exemplos passo a passo

Referência para desenvolvedores

Roteiro, status e lista de tarefas