ExpressionScript - Presentasjon
From LimeSurvey Manual
Introduksjon
LimeSurvey bruker Uttrykkskript (Expression Script), som gjør at LimeSurvey kan støtte mer komplekse forgreninger, vurderinger, validering og tilpasning. Det erstatter måten LimeSurvey håndterer erstatninger, betingelser og vurderinger på i bakgrunnen. Det gir også betydelig raskere behandling, siden de fleste databaseavlesninger under kjøring elimineres. Expression Script ble utviklet av Dr. Thomas White (TMSWhite).
Viktige definisjoner
- Uttrykk: Alt som er omgitt av krøllparenteser:
- Så lenge det ikke er mellomrom rett etter startparentesen eller før sluttparentesen.
- Innholdet i uttrykket evalueres av EM, så det kan inneholde matematiske formler, funksjoner og avansert behandling av tekst og datoer.
- Tilpasning (tailoring): Kalles noen ganger «piping». Det er prosessen med å endre tekst betinget:
- Du har tilgang til alle «erstatningsfelt», deltakerdata og besvarelsesdata.
- Du får også enklere tilgang til spørsmål, svar og egenskapene deres.
- Relevanseligning: Et nytt spørsmålsattributt som styrer synligheten til spørsmålet:
- Hvis det finnes en relevanseligning, vises spørsmålet bare hvis relevansen evalueres til sann.
- Internt blir alle array_filter- og array_filter_exclude-kommandoer til relevans på underspørsmålsnivå.
- SGQA (slik variabler ble navngitt tidligere):
- Står for Survey-Group-Question-Answer (undersøkelse-gruppe-spørsmål-svar)
- SGQA-variabelnavn ser slik ut: 123X5X382X971, og kan ha suffikser for underspørsmål.
- Disse variabelnavnene er knyttet til de underliggende S/Q/G/A-databasekodene, så de må ofte endres
- Ligning-spørsmålstype: En ny spørsmålstype som lagrer beregninger eller rapporter i databasen:
- Den er som et boilerplate-spørsmål, men innholdet lagres i databasen selv om du har valgt «Skjul alltid dette spørsmålet».
- Spørsmålskode: Dette er det foretrukne variabelnavnet for EM:
- Det kan være et beskrivende navn som angir formålet med spørsmålet, noe som gjør kompleks logikk lettere å lese.
- Gyldige spørsmålskoder skal IKKE starte med et tall, så når du bruker spørsmålskoden til å nummerere spørsmålene, bruk for eksempel «q1», «q1a» eller «g1q2».
- Dette blir variabelnavnet hvis du eksporterer data til SPSS eller R. Hvis du gjør statistiske analyser, må du derfor bare opprette unike spørsmålskoder.
Må jeg bruke Uttrykkskript?
Det korte svaret er «nei». Det avhenger imidlertid i stor grad av hvor kompleks undersøkelsen du vil opprette, er.
For eksempel dekker betingelseseditoren noen enkle uttrykk som kan brukes på spørsmålene i undersøkelsen din. Betingelseseditoren er imidlertid begrenset. Derfor brukes Uttrykkskript – det utvider mulighetene for tilpasning.
Kan jeg blande betingelser og relevanseligninger?
Ja. Du kan bruke betingelseseditoren for noen spørsmål og relevanseligninger for andre.
Du kan ikke ha både betingelser og uttrykk satt opp i samme spørsmål! Når en betingelse er satt opp, erstatter den det som står i relevanseligningsfeltet. Dessuten kan feltet for relevanseligning ikke lenger redigeres manuelt.
Likevel finnes det en måte å bruke både uttrykk og betingelser i ett spørsmål. Som nevnt ovenfor erstatter en betingelse relevanseligningsfeltet. Når det er gjort, sjekk hvilken ligning som er opprettet, og kopier den til et tekstredigeringsprogram. Slett den nylig opprettede betingelsen fra betingelseseditoren, og rediger deretter spørsmålet ved å legge til de betingelsesbaserte uttrykkene fra tekstfilen sammen med resten av uttrykkene du vil bruke.
Hvordan bør jeg velge mellom betingelser og relevans?
Her er en liste over fordeler og ulemper ved hver av tilnærmingene:
| Tilnærming | Fordeler | Ulemper |
|---|---|---|
| Betingelser | 1. Praktisk grafisk grensesnitt for å opprette enkle betingelser. 2. Grensesnittet er godt dokumentert og godt kjent for supportteamet |
1. Støtter bare enkle sammenligninger og håndterer ikke «OG»- og «ELLER»-betingelser godt. 2. Kaskaderende betingelser fungerer uberegnelig 3. Tregt – databasekrevende – kan gjøre lange undersøkelser trege. 4. Noen rapporterte problemer med å laste inn betingelser på nytt. 5. Grensesnittet skalerer dårlig når det er dusinvis, hundrevis eller tusenvis av spørsmål. 6. Det kan gå tregt å konvertere papirbaserte undersøkelser siden man må bruke SGQA-navn. 7. Man trenger ofte en programmerer til å kode logikken som kreves for komplekse forgreninger. |
| Relevanse | 1. Støtter svært kompleks logikk, inkludert over 80 funksjoner og matematiske operatorer og tekstoperatorer. 2. Perfekt støtte for kaskaderende logikk. 3. Raskt – ingen ekstra databasekall, støtter undersøkelser med over 1000 spørsmål. 4. Ingen problemer med å laste inn logikk på nytt siden den ikke krever SGQA-koder. 5. Syntaksutheving skalerer til undersøkelser med over 1000 spørsmål. 6. Enkelt og raskt å bruke for grupper som vil digitalisere eksisterende papirbaserte undersøkelser. 7. Støtter enkelt semistrukturerte intervjuer og epidemiologiske undersøkelser uten behov for programmerer. |
1. Ikke noe grafisk grensesnitt for enkle betingelser – det bruker syntaksutheving i stedet. |
- Vi anbefaler at du bruker det som passer best for dine behov.
- For en mer detaljert forklaring av EM-funksjonene, klikk på følgende lenke.
Komme i gang
Den beste måten å komme i gang med EM på er å:
- Installere den nyeste stabile versjonen fra https://www.limesurvey.org/en/download.
- Importere og utforske noen eksempelundersøkelser.
- Utforske brukstilfeller og veiledninger, og trinn-for-trinn-eksemplene.
- Utforske EM-dokumentasjonen (denne siden)
- Enhetstester av isolerte uttrykk (avansert)
- viser eksempler på bruk av alle EM-funksjoner og -operatorer, samt resultatene i PHP og JavaScript;
- merk at noen få funksjoner gir ulike resultater i PHP- og JavaScript-versjonene, så denne siden lar deg planlegge EM-logikken deretter.
- Enhetstester av isolerte uttrykk (avansert)
Terminologi
Disse ordene brukes ofte for å beskrive mulighetene til EM:
- Relevansbasert forgrening – hvis et spørsmål er relevant, stilles det, ellers ikke (f.eks. gjøres det usynlig og markeres som NULL i databasen). Du finner relevansfeltene i spørsmålsredigeringspanelet samt i redigeringspanelet for spørsmålsgrupper. Sistnevnte brukes til å bruke et sett med betingelser på en hel gruppe uten å måtte kopiere den samme betingelsen til hvert spørsmål, og/eller kombinere betinget logikk på gruppe- og spørsmålsnivå.
- Tilpasning – Når du vet hvilke spørsmål som skal stilles, angir tilpasning (noen ganger kalt piping) hvordan spørsmålet skal stilles. Dette lar deg ikke bare støtte enkel erstatning (som {TOKEN:FIRSTNAME}), men også bøying av verb og substantiv basert på kjønn eller antall for emnene dine. Det lar deg også endre meldingen du gir til en respondent basert på om de har besvart (eller hvordan de har besvart) andre spørsmål.
- Ligninger – EM legger til en ny spørsmålstype kalt Ligning som lagrer resultatet av et uttrykk. Ligningsresultatene beregnes og skrives til databasen, selv om du skjuler dem på siden. De brukes derfor til skjulte poengberegninger, navigering basert på komplekse ligninger, vurderinger og rapporter som genereres og lagres i databasen.
Relevans og kaskaderende relevans
Alle spørsmålstyper har nå et relevansalternativ som styrer om spørsmålet vises eller ikke. EM behandler hver relevanseligning i den rekkefølgen de forekommer i undersøkelsen. Hvis uttrykket er sant (eller mangler – for å støtte eldre undersøkelser), vises spørsmålet. Hvis det ikke er relevant, skjules spørsmålet, og verdien settes til NULL i databasen. Hvis det ikke finnes noen relevante spørsmål i en gruppe, hoppes hele gruppen over.
Dessuten, hvis en av variablene i et uttrykk er irrelevant, evalueres uttrykket alltid til usant. Dette muliggjør kaskaderende relevans, slik at du slipper å skrive svært lange relevanseligninger for hvert spørsmål.
Si at du har fem spørsmål Q1–Q5, og du bare vil vise Q2 hvis Q1 ble besvart, og Q3 hvis Q2 ble besvart osv. Relevanseligningene kan da være:
| Spørsmålskode | Relevanse | Spørsmål |
|---|---|---|
| Q1 | 1 | Hva heter du? |
| Q2 | Q1 | {Q1}, hvor gammel er du? |
| Q3 | Q2 | Du er altså {Q2} år gammel. Er du gift? |
| Q4 | Q3 == "Y" | {Q1}, hvor lenge har du vært gift? |
| Q5 | Q4 | Hvor mange barn har du, {Q1}? |
Relevans på gruppenivå
ExpressionScript støtter også relevans på gruppenivå. Dette gjør det enklere å implementere looping. Si at du vil samle inn informasjon om opptil 10 enheter (for eksempel produkter eller personer i en husholdning), der du først avgjør hvor mange enheter som trenger oppfølging (for eksempel ved å spørre hvor mange personer som bor i husholdningen, eller la folk krysse av for hvilke produkter de liker fra en lang liste). Når du vet hvor mange enheter som trenger oppfølging, kan du bruke relevans på gruppenivå som {count >= 1}, {count >=2}, ... {count >= 10} for hver av de 10 gruppene med oppfølgingsspørsmål. Innenfor hver gruppe kan du ha betinget logikk på spørsmålsnivå (f.eks. kjønns- eller aldersspesifikke oppfølgingsspørsmål for hvert emne). Relevanseligningene på spørsmåls- og gruppenivå kombineres med OG for å avgjøre hva som skal vises.
For å se et slikt eksempel, importer følgende undersøkelse: Eksempel på folketellingsundersøkelse.
Skjermbildet nedenfor viser at gruppen Person 1 vises (eller er relevant) hvis respondenten bor sammen med minst én annen person:

Tilpasning/piping
Alt innenfor krøllparenteser behandles nå som et uttrykk (med ett unntak beskrevet nedenfor). Uttrykk har tilgang til alle LimeReplacementFields og variabler (via flere aliaser), alle vanlige ligningsoperatorer (matematiske, logiske og sammenligninger) og til dusinvis av funksjoner (som til og med fungerer dynamisk på klientsiden).
Ved å bruke disse ligningene kan du for eksempel:
- Vise tilpassede meldinger til respondentene på betingelser basert på tidligere besvarelser;
- Opprette vurderinger og vise vurderingsresultater (eller forgrene på betingelser eller vise meldinger) basert på disse resultatene, uten å bruke selve vurderingsmodulen;
- Bøye verb og substantiv i spørsmål, svar og rapporter;
- Vise sammendrag av besvarelser før siden «Vis svarene dine» på slutten av undersøkelsen.
Ligninger
Det finnes en ny spørsmålstype kalt Ligning. Tenk på den som en spørsmålstype Tekstvisning, bortsett fra at den lagrer verdien av det som vises i databasen. Hvis spørsmålsteksten i et Ligning-spørsmål inneholder en vurderingsberegning, lagres denne verdien i databasen i en variabel som kan vises i offentlig eller privat statistikk.
Syntaks
Alt som står innenfor krøllparenteser regnes nå som et uttrykk (med ett unntak: det må ikke være mellomrom først eller sist – dette er nødvendig for at ExpressionScript ikke skal prøve å behandle innebygd JavaScript).
Merk at uttrykk gjerne kan gå over flere linjer, så lenge det ikke er mellomrom etter den åpnende krøllparentesen eller før den avsluttende krøllparentesen. Dette er spesielt nyttig for nestede «if()»-setninger som denne:
{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',
''
)
)
)
)
)
)
)
)}
ExpressionScript støtter følgende syntaks:
- Alle standard matematiske operatorer (f.eks. +,-,*,/,!);
- Alle standard sammenligningsoperatorer (f.eks. <,<=,==,!=,>,>=, pluss deres ekvivalenter: lt, le, eq, ne, gt, ge);
- Parenteser (slik at du kan gruppere deluttrykk);
- Betingede operatorer (f.eks. &&,| | og deres ekvivalenter: and, or);
- Tekststrenger i enkle og doble anførselstegn (som hver kan inneholde strenger med den andre typen anførselstegn);
- Kommaoperator (slik at du kan ha en liste med uttrykk og bare returnere det siste resultatet);
- Tilordningsoperator (=);
- Forhåndsdefinerte variabler (for å referere til spørsmål, spørsmålsattributter og besvarelser) – f.eks. SGQA-kodene;
- Forhåndsdefinerte funksjoner (det finnes allerede over 80, og det er enkelt å legge til flere).
Operatorer
EM-syntaksen følger vanlig operatorrekkefølge:
| Nivå | Operator(er) | Beskrivelse |
|---|---|---|
| 1 | () | parenteser for gruppering eller kall av funksjoner |
| 2 | ! - + | unære operatorer: ikke, negasjon, unært pluss |
| 3 | * / | gange, dele |
| 4 | + - | pluss, minus |
| 5 | < <= > >= lt le gt ge | relative sammenligninger |
| 6 | == != eq ne | likhetssammenligninger |
| 7 | and | logisk OG |
| 8 | or | logisk ELLER |
| 9 | = | tilordningsoperator |
| 10 | , | kommaoperator |
Advarsel om avvik mellom tall og tekst og alfabetisk/numerisk sammenligning
Når du vil sammenligne verdier med relative sammenligninger eller likhetssammenligninger, må du være oppmerksom på avvik. En verdi oppgitt av brukeren (eller gitt via en svarkode) kan brukes som tall hvis den tydelig er et tall.
Hvis du setter en av verdiene i ", utføres en tekst-/strengsammenligning. Hvis du vil sammenligne som tall, må du aldri sette et tall i ".
For eksempel er Q0.NAOK > "50" sant hvis Q0.NAOK er et numerisk spørsmål med verdien 9. Dette er fordi operatoren > antar at det er en alfabetisk sammenligning og ikke en numerisk.
For å sikre at du sammenligner heltallsverdier kan du bruke intval(Q0.NAOK) > 50. Husk at hvis Q0.NAOK ikke er et tall (tom eller en streng), er intval(Q0.NAOK) === 0. For å sammenligne strengverdier ("A" < "B") bruker du strcmp direkte: strcmp(Q0.NAOK,"B") eller strcmp(Q0.NAOK,"A5").
Advarsel om bruk av tilordningsoperatoren (=)
Du bør unngå tilordningsoperatorer med mindre det er helt nødvendig, siden de kan gi uventede bivirkninger. Hvis du for eksempel endrer verdien av en tidligere besvarelse, beregnes ikke den kaskaderende relevans- og valideringslogikken mellom dette spørsmålet og det nåværende spørsmålet på nytt, slik at du kan ende opp med internt inkonsistente data (f.eks. spørsmål som forblir besvart, men burde vært satt til NULL, eller spørsmål som hoppes over, men burde vært besvart). Hvis du vil tilordne en verdi til en variabel, bør du generelt opprette en spørsmålstype Ligning og bruke et uttrykk til å sette verdien. Likevel er det noen sjeldne tilfeller der man virkelig trenger denne operatoren, så vi har gjort den tilgjengelig.
For å advare deg om denne operatoren vises den i rød skrift i syntaksligningene (slik at du ikke forveksler den med «==»).
Bruk av tilordningsoperatoren
De viktigste grunnene til at du kan ønske å bruke tilordningsoperatoren er:
- Du må angi standardverdien via en ligning for et spørsmål som ikke godtar standardverdier (som listespørsmål med radioknapper, der brukergrensesnittet lar deg velge ett av svaralternativene, men ikke lar deg skrive inn en ligning). Vær imidlertid forsiktig, siden LimeSurvey ikke kan validere at ligningen din gir ett av de tillatte svarene for dette spørsmålet;
- Du må tvinge frem en endring av besvarelsen på et tidligere spørsmål basert på en senere besvarelse;
- osv ...
Du kan bruke hele uttrykksbehandlingssystemet til dette formålet. Det er best å bruke en Ligning til dette.
Noen eksempler:
- Sett svaret på et spørsmål med kort tekst til små bokstaver :
{QCODE=strtolower(QCODE.NAOK)}; - Sett et forhåndsvalg for en matrisespørsmålstype ved starten av en undersøkelse :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Sett et forhåndsvalg for en matrisespørsmålstype med tekst ved starten av en undersøkelse :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Sett et svar med betingelse :
{QCODE=if(YesNo="Y","A1","")}.
XSS-sikkerhet
Når XSS er aktivert, kan enkelte deler av uttrykksbehandlingssystemet ikke brukes:
- starte en HTML-tag i ett uttrykk, men avslutte den i et annet uttrykk;
- bruke et komplekst uttrykk i en URL.
Eksempler og løsninger:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}fungerer ikke med XSS-sikkerhet. Her kan du bruke{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>. Her kan du bruke et ligningsspørsmål, fordi det er tillatt å bruke en hel spørsmålskode:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Tilgang til variabler
ExpressionScript gir skrivebeskyttet tilgang til alle variablene du kan trenge. For bakoverkompatibilitet gir det tilgang til følgende:
- TOKEN:xxx - verdien av en TOKEN (f.eks. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (gjelder kun for undersøkelser som ikke er anonyme).
- Alle {XXX}-verdier som brukes av maler.
- I spørsmålstekst kan du bruke {QID}, som erstattes av spørsmåls-ID, og {SGQ}, som erstattes av SGQA-en til spørsmålet.
- {SAVEDID} for gjeldende svar-ID
I tillegg lar ExpressionScript deg referere til variabler med spørsmålskoden (kolonnen 'title' i spørsmålstabellen i databasen). Dette er også variabeletiketten som brukes når du eksporterer data til SPSS, R eller SAS. Hvis du for eksempel har spørsmål om navn, alder og kjønn, kan du kalle variablene name, age og gender i stedet for 12345X13X22, 12345X13X23 og 12345X13X24. Dette gjør ligninger enklere for alle å lese og validere logikken i, og det blir mulig å flytte rundt på spørsmål uten å holde styr på gruppe- eller spørsmålsnumre.
Viktig: Det er tryggere å referere til variabler som forekommer på foregående sider eller i foregående spørsmål.
Videre lar ExpressionScript deg få tilgang til mange egenskaper ved spørsmålet:
| Syntaks | Betydning | Eksempel | Eksempelresultat |
|---|---|---|---|
| Qcode | et alias for Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | den valgte svarkoden for spørsmålet hvis det er relevant (ellers tomt), eller tekstverdien hvis det ikke er et kodet spørsmål | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | samme som Qcode - se omtalen av NAOK | {gender.NAOK} | 'M' |
| Qcode.value | vurderingsverdien for spørsmålet hvis det er relevant (ellers tomt), eller tekstverdien hvis det ikke er et kodet spørsmål | {gender.value} | '1' |
| Qcode.valueNAOK | samme som Qcode.value - se omtalen av NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | visningsverdien for spørsmålet | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | teksten i spørsmålet | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | om spørsmålet er obligatorisk (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | det interne spørsmålsnummeret (ikke det sekvensielle nummeret) | {gender.qid} | 337 |
| Qcode.type | spørsmålstypen | {gender.type} | 'G' |
| Qcode.jsName | det korrekte JavaScript-navnet for spørsmålet, uavhengig av om det er deklarert på denne siden eller ikke | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | det interne gruppenummeret (ikke det sekvensielle nummeret) | {gender.gid} | 3 |
| Qcode.qseq | det sekvensielle nummeret til spørsmålet, med start fra 0 | {gender.qseq} | 5 |
| Qcode.gseq | det sekvensielle nummeret til gruppen, med start fra 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | om spørsmålet for øyeblikket er relevant (0 eller 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | relevansligningen på spørsmålsnivå | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | relevansligningen på gruppenivå | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | SGQA-verdien for dette spørsmålet | {gender.sgqa} | '1827X3X337' |
Problem med HTML-skriveprogrammet
Hvis du bruker HTML-skriveprogrammet, erstattes noen tegn med HTML-entiteter.
- & med &
- < med <
- > med >
Hvis du bruker HTML-skriveprogrammet, må du bruke:
- and for &
- lt for <
- le for <=
- gt for >
- ge for >=
Det anbefales å fjerne HTML som vises i uttrykket ditt. Hvis du bruker LimeSurveys HTML-skriveprogram, klikker du på «Source»-knappen (øverst til venstre i skriveprogrammet) og sletter alle tegn som ikke er knyttet til uttrykket ditt (f.eks.
,
og så videre).
Her er detaljer om hvordan du bygger en Qcode (og får tilgang til noen egenskaper) for hver spørsmålstype. Generelt bygges Qcodes slik:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
For comment og other er de tilsvarende spørsmålskodene henholdsvis QuestionCode_comment og QuestionCode_other.
| Type | Beskrivelse | Kode | Underspørsmål | Svaralternativer | Skalaer | Svarkode | Vist svar | Relevans |
|---|---|---|---|---|---|---|---|---|
| 5 | 5-punkts valg, radioknapper | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Matrise (10 poengsvalg), radioknapper | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Matrise (5-poengsvalg), radioknapper | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Matrise (fleksible etiketter), dobbel skala | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Matrise (fleksibel) - kolonneformat | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Matrise (fleksibel) - radformat | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Matrise (øk/uendret/reduser), radioknapper | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Matrise (multifleksibel) 1 til 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Matrise (multifleksibel) tekst | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Matrise (ja/usikker/nei), radioknapper | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Tekstvisningsspørsmål | Q11 | {Q11.shown} | |||||
| D | Dato | Q12 | {Q12} | {Q12.shown} | ||||
| * | Ligning | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Filopplasting (registrerer antall opplastede filer) | Q14 | {Q14} | {Q14>0} | ||||
| G | Kjønn, rullegardinliste | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Ekstra lang fritekst | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Språkspørsmål | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Liste - nedtrekksmeny | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Liste, rullegardinliste/radioknapper | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Liste med kommentar, rullegardinliste/radioknapper + tekstområde | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Lang fritekst | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Flervalg, avkryssingsboks | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Flervalg med kommentarer, avkryssingsboks + tekst | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Flere numeriske spørsmål | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Flere korte tekstfelt | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Numerisk spørsmålstype | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Rangeringsstil | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Kort fritekst | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Ja/nei, radioknapper | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Bruk av NAOK
NAOK --> «Not Applicable» (NA) er greit (OK)
Bruk av NAOK betyr at alle eller noen av variablene er irrelevante (dvs. «Not Applicable» (NA) er greit (OK)).
For eksempel: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) gir alltid en tom streng hvis ett underspørsmål i Q1 er filtrert bort. For å telle antall avkryssede underspørsmål i et slikt spørsmål kan du bruke count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Hvis underspørsmålet er skjult, returnerer EM en tom streng.
Uten NAOK returnerer EM alltid en tom streng (det samme som å returnere false) hvis ett spørsmål eller ett underspørsmål er skjult.
.shown bruker alltid NAOK-systemet (tom streng hvis skjult), men hvis du trenger svarkoden, er det alltid en god idé å legge til .NAOK etter spørsmålskoden (med mindre du trenger noe annet og vet hva du gjør).
Mer informasjon finner du i underkapittelet Overstyring av kaskaderende betingelser.
De reserverte variablene «this», «self» og «that»
Ofte vil du evaluere alle deler av et spørsmål, for eksempel telle hvor mange underspørsmål som er besvart eller summere poengsummer. Andre ganger vil du bare behandle bestemte rader eller kolonner i et spørsmål (for eksempel hente rad- eller kolonnesummer og lagre dem i databasen). Disse reserverte variablene gjør dette forholdsvis enkelt.
Variabelen «this»
Variabelen «this» brukes utelukkende i alternativene «Valideringsligning for hele spørsmålet» og «Valideringsligning for underspørsmål» (sistnevnte er ikke mulig fra det grafiske brukergrensesnittet). Den utvides til variabelnavnene til hver av cellene i disse spørsmålene. Hvis du for eksempel vil sikre at hver verdi er større enn tre, setter du «Valideringsligning for underspørsmål» til (this > 3).
Variabelen «self»
Variablene «self» og «that» er kraftigere og fungerer som makroer som utvides før ligninger behandles. Syntaksalternativene for variabelen «self» er:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffiks er et av de vanlige Qcode-suffiksene (f.eks. NAOK, value, shown)
- sub-selector kan være ett av følgende:
- comments - kun underspørsmål som er kommentarer (f.eks. flervalg med kommentarer og liste med kommentar);
- nocomments - kun underspørsmål som ikke er kommentarer;
- sq_X - der X er en rad- eller kolonneidentifikator. Kun underspørsmål som samsvarer med mønsteret X blir valgt. Merk at søket gjøres på den fullstendige kodeidentifikatoren, og at sq_X samsvarer med og inkluderer underspørsmålene nX, X og Xn (f.eks. hvis du bruker sq_1, blir underspørsmålene a1, 1a, 1, 11 eller 001 inkludert). Vær oppmerksom på spørsmålstypen med to skalaer, der underspørsmålskodene er QCODE_SQCODE_1 og QCODE_SQCODE_1, og på rangeringsspørsmål, der underspørsmålskodene er QCODE_1, QCODE_2 ....
Eksempler:
- Er noen del av et spørsmål besvart? -> {count(self.NAOK)>0}
- Hva er vurderingspoengsummen for dette spørsmålet? -> {sum(self.value)}
Du kan også bruke disse til å hente rad- og kolonnesummer. Anta at du har en matrise med tall med radene A-E og kolonnene 1-5.
- Hva er totalsummen? -> {sum(self.NAOK)}
- Hva er summen for rad B? -> {sum(self.sq_B.NAOK)}
- Hva er summen for kolonne 3? -> {sum(self.sq_3.NAOK)}
Variabelen «that»
Variabelen "that" er lik variabelen "self", men lar deg referere til andre spørsmål. Syntaksen er:
- that.qname
- that.qname.suffiks
- that.qname.sub-selector
- that.qname.sub-selector.suffiks
qname er spørsmålsnavnet uten noen underspørsmålsutvidelser. La oss si at vi oppretter et spørsmål «q1», der «q1» også er dets qname.
Eksempler:
- Er noen del av spørsmål q1 besvart? -> {count(that.q1.NAOK)>0}
- Hva er vurderingspoengsummen for q2? -> {sum(that.q2.NAOK)}
- Hva er totalsummen for q3? -> {sum(that.q3.NAOK)}
- Hva er summen for rad C i q4? -> {sum(that.q4.sq_C.NAOK)}
- Hva er summen for kolonne 2 i q4? -> {sum(that.q4.sq_2.NAOK)}
Variablene «self» og «that» kan brukes i all relevans, validering og tilpasning.
Én ting å være oppmerksom på er at når du bruker funksjonen Vis logikkfil, vises den utvidede verdien av «self» og «that». Dette lar deg se den faktiske ligningen som genereres, slik at du (og EM) kan validere om variablene finnes. Dette kan virke forvirrende, siden ligningene kan bli ganske lange. Hvis du redigerer spørsmålet, vil du imidlertid se den opprinnelige ligningen med «self» og/eller «that».
- vil navngi hver variabel som brukes i en ligning eksplisitt, eller
- bruker variabler som ikke har underspørsmål (f.eks. spørsmål med ett svar). I slike tilfeller er det overkill å sette «that» foran en variabel, og du risikerer uventede resultater.
Tilgang til funksjoner
ExpressionScript gir tilgang til matematiske funksjoner, tekstfunksjoner og brukerdefinerte funksjoner, som vist nedenfor. Det finnes PHP- og JavaScript-ekvivalenter for disse funksjonene, slik at de fungerer likt på serversiden (PHP) og klientsiden (JavaScript). Det er enkelt å legge til nye funksjoner.
Implementerte funksjoner
Følgende funksjoner er tilgjengelige for øyeblikket:
| Funksjon | Betydning | Syntaks |
|---|---|---|
| abs | Absolutt verdi | number abs(number) |
| acos | Arc cosinus | number acos(number) |
| addslashes | Setter inn omvendt skråstrek foran spesialtegn i en tekststreng | string addslashes(string) |
| asin | Arc sinus | number asin(number) |
| atan | Arc tangens | number atan(number) |
| atan2 | Arc tangent av to variabler | number atan2(number, number) |
| ceil | Avrund brøker opp | number ceil(number) |
| checkdate | Returnerer "sann" (1) hvis datoen er gyldig i den gregorianske kalenderen | bool checkdate(month,day,year) |
| convert_value | Konverterer en numerisk verdi ved hjelp av en inndatatabell og en utdatatabell med numeriske verdier | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Cosinus | number cos(number) |
| count | Teller antall besvarte (ikke-tomme) spørsmål i listen | number count(arg1, arg12, ..., argN) |
| countif | Teller antall besvarte spørsmål i listen som er lik det første argumentet | number countif(matches, arg1, arg2, ... argN) |
| countifop | Teller antall besvarte spørsmål i listen som oppfyller kriteriet (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formatere lokaldato/-tid | string date(format [, timestamp=time()]) |
| exp | Regner ut eksponenten til e | number exp(number) |
| fixnum | Viser tall med komma som desimaltegn, om nødvendig | string fixnum(number) |
| floor | Avrund brøker ned | number floor(number) |
| gmdate | Formatere GMT-dato/-tid | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Konverterer alle HTML-entiteter til de tilsvarende tegnene (bruker alltid ENT_QUOTES og UTF-8) | string html_entity_decode(string) |
| htmlentities | Konverterer alle aktuelle tegn til HTML-entiteter (bruker alltid ENT_QUOTES og UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Konverterer spesialtegn til HTML-entiteter (bruker alltid ENT_QUOTES og UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Konverterer spesielle HTML-entiteter tilbake til tegn (bruker alltid ENT_QUOTES og UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formater lokal tid/dato som heltall (integer) | string idate(string [, timestamp=time()]) |
| if | Excel-lignende if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Sett sammen matriseelementer med en tekststreng | string implode(glue,arg1,arg2,...,argN) |
| intval | Få heltall-verdien av et variabel | int intval(number [, base=10]) |
| is_empty | Avgjør om en variabel anses som tom | bool is_empty(var) |
| is_float | Finner ut om typen til en variabel er flyttall | bool is_float(var) |
| is_int | Finner ut om typen til en variabel er heltall | bool is_int(var) |
| is_nan | Finner ut om verdien er ikke et nummer | bool is_nan(var) |
| is_null | Finner ut om en variabel er NULL | bool is_null(var) |
| is_numeric | Finner ut om en variabel er et tall eller en numerisk tekststreng | bool is_numeric(var) |
| is_string | Finner ut om typen til en variabel er tekststreng | bool is_string(var) |
| join (New in 2.0 build 130129) | Slå sammen elementer til en ny tekststreng | join(arg1, arg2, ... argN) |
| list | Returnerer en kommadelt liste med ikke-tomme verdier | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Returnerer en liste, adskilt av «glue», med den angitte egenskapen (retProp) fra spørsmål i listen som oppfyller kriteriet (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Fjerner mellomrom (eller andre tegn) fra begynnelsen av en tekststreng | string ltrim(string [, charlist]) |
| max | Finn den høyeste verdi | number max(arg1, arg2, ... argN) |
| min | Finn den laveste verdi | number min(arg1, arg2, ... argN) |
| mktime | Henter UNIX timestamp for en dato (alle seks argumentene er valgfrie) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Modulo-funksjonen støttes ikke ennå. Du kan bruke funksjonen floor() i stedet | floor(x/y)==(x/y) |
| nl2br | Setter inn HTML-linjeskift foran alle linjeskift i en tekststreng | string nl2br(string) |
| number_format | Formater et nummer med grupperte tusener | string number_format(number) |
| pi | Få verdien av pi | number pi() |
| pow | Eksponentiell uttrykk | number pow(base, exp) |
| quoted_printable_decode | Konverterer en quoted-printable-tekststreng til en 8-bits tekststreng | string quoted_printable_decode(string) |
| quoted_printable_encode | Konverterer en 8-bits tekststreng til en quoted-printable-tekststreng | string quoted_printable_encode(string) |
| quotemeta | Sett metategn i anførselstegn | string quotemeta(string) |
| rand | Generer tilfeldig heltall, se dette eksempelet | int rand() OR int rand(min, max) |
| regexMatch | sammenligner en tekststreng med et regulært uttrykk | bool regexMatch(pattern,input) |
| round | Avrunder tall til valgfri presisjon | number round(val [, precision]) |
| rtrim | Fjerner mellomrom (eller andre tegn) fra slutten av en tekststreng | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Returnerer en formatert tekststreng | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Kvadratrot | number sqrt(arg) |
| stddev | Regner ut utvalgets standardavvik for listen med tall | number stddev(arg1, arg2, ... argN) |
| str_pad | Fyller en tekststreng til en bestemt lengde med en annen tekststreng | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Repeter en streng | string str_repeat(input, multiplier) |
| str_replace | Erstatter alle forekomster av søketeksten med erstatningsteksten | string str_replace(search, replace, subject) |
| strcasecmp | Sikker binærsammenligning av tekststrenger som ikke tar hensyn til små eller store bokstaver | int strcasecmp(str1, str2) |
| strcmp | Binærsikker sammenligning av tekststrenger | int strcmp(str1, str2) |
| strip_tags | Fjerne HTML og PHP tags fra en strenge | string strip_tags(str, allowable_tags) |
| stripos | Finner posisjonen til første forekomst av en unicode-tekststreng uten hensyn til store og små bokstaver (starter på 0, returnerer «false» hvis ikke funnet) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Tar bort anførselstegn fra en tekststreng | string stripslashes(string) |
| stristr | strstr uten hensyn til store og små bokstaver | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Få lengde på strenge | int strlen(string) |
| strpos | Finner posisjonen til første forekomst av en unicode-tekststreng (starter på 0, returnerer «false» hvis ikke funnet) | int strpos(haystack, needle [ offset=0]) |
| strrev | Reverser en tekststreng | string strrev(string) |
| strstr | Første forekomsten av en tekststreng | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Gjør en tekststreng om til små bokstaver | string strtolower(string) |
| strtotime | Tolker omtrent enhver engelsk tekstlig beskrivelse av dato og tid og gjør den om til et Unix timestamp | int strtotime(string) |
| strtoupper | Gjør en tekststreng om til store bokstaver | string strtoupper(string) |
| substr | Returnerer en del av en unicode-tekststreng | string substr(string, start [, length]) |
| sum | Regne ut summen av alle verdier i en matrise | number sum(arg1, arg2, ... argN) |
| sumifop | Summerer verdiene av besvarte spørsmål i listen som oppfyller kriteriet (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangens | number tan(arg) |
| time | Returner gjeldende UNIX timestamp | number time() |
| trim | Fjerner mellomrom (eller andre tegn) fra begynnelsen og slutten av en tekststreng | string trim(string [, charlist]) |
| ucwords | Gjør første tegn i hvert ord i en tekststreng til stor bokstav | string ucwords(string) |
| unique | Returnerer "sann" hvis alle ikke-tomme besvarelser er unike | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Opprett nye uttrykksfunksjoner med et tillegg (New in 4.0.0 )
Hvis du trenger en ny funksjon som ikke finnes i kjernen, kan du opprette en med et tillegg. En slik ny funksjon opprettes ved hjelp av hendelsen expressionManagerStart.
ExpressionScript vet hvilke variabler som er lokale
For å kunne bygge JavaScript for en side riktig må EM vite hvilke variabler som er satt på siden, og hva JavaScript-ID-en deres er (f.eks. for document.getElementById(x)). EM må også vite hvilke variabler som er satt på andre sider (slik at det sikres at de nødvendige <input type='hidden' value='x'>-feltene finnes og er fylt ut).
Kaskaderende betingelser
Hvis én av variablene er irrelevant, blir hele ligningen irrelevant (false). I tabellen nedenfor betyr N/A at en av variablene ikke var relevant:
| Operator | Eksempel | a | b | Resultat |
|---|---|---|---|---|
| + (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 |
Overstyring av kaskaderende betingelser
Si at du vil vise en løpende sum av alle relevante svar. Du kan da prøve å bruke ligningen {sum(q1,q2,q3,...,qN)}. Denne oversettes imidlertid internt til LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Hvis én av verdiene q1-qN er irrelevant, vil ligningen derfor alltid returnere false. I dette tilfellet vil sum() vise «0» helt til alle spørsmål er besvart.
For å komme rundt dette kan hver variabel få suffikset «.NAOK» (som betyr at Not Applicable er OK). Da skjer følgende. Si at du har en variabel q1.NAOK:
- q1 legges ikke til i LEManyNA()-leddet
- LEMval('q1') vil fortsatt sjekke om besvarelsen er relevant, og vil returnere "" hvis den ikke er det (slik at enkeltstående irrelevante besvarelser ignoreres, men ikke gjør hele uttrykket ugyldig).
Løsningen på problemet med løpende sum er altså å bruke ligningen sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Bruken av suffikset .NAOK gjør det også mulig for forfattere å lage undersøkelser med flere mulige veier som senere møtes igjen i felles veier. Si for eksempel at deltakere besvarer en undersøkelse på en måte som ligger utenfor det normale svarområdet. Forfatteren kan da gjøre deltakerne oppmerksomme på at de kanskje ikke får gyldige resultater, og spørre om de virkelig vil fortsette med undersøkelsen. Hvis de svarer «Ja», vises resten av spørsmålene. Betingelsen for «resten av spørsmålene» vil sjekke om de første besvarelsene lå innenfor det normale området ELLER om deltakeren svarte «Ja» på spørsmålet som bare er relevant hvis vedkommende svarte utenfor det normale området.
Hvordan støtter ExpressionScript betinget mikrotilpasning?
Her er et eksempel på mikrotilpasning (der Spørsmålstype=='expr' betyr en ligning):
| Spørsmålskode | Relevans | Spørsmålstype | Spørsmål |
|---|---|---|---|
| name | 1 | text | Hva heter du? |
| age | 1 | text | Hvor gammel er du? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Beklager, {name}, du er for {if( (age<16),'ung',if( (age>80),'gammel','middelaldrende') ) } for denne testen. |
| kids | !badage | yesno | Har du barn? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Hvor mange barn har du? |
| kid1 | parents && numKids >= 1 | text | Hvor gammelt er ditt første barn? |
| kid2 | parents && numKids >= 2 | text | Hvor gammelt er ditt andre barn? |
| kid3 | parents && numKids >= 3 | text | Hvor gammelt er ditt tredje barn? |
| kid4 | parents && numKids >= 4 | text | Hvor gammelt er ditt fjerde barn? |
| kid5 | parents && numKids >= 5 | text | Hvor gammelt er ditt femte barn? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, du oppga at du er {age} og at du har {numKids}. Summen av alderen til de første {min(numKids,5)} barna dine er {sumage} |
For å laste ned eksempelundersøkelsen ovenfor, klikk på følgende lenke: Eksempelundersøkelse med antall barn.
Alle disse spørsmålene kan ligge på én enkelt side (f.eks. i samme gruppe), og bare de relevante spørsmålene vises. Når du oppgir barnas alder, oppdateres dessuten sum()-uttrykket i det siste spørsmålet dynamisk.
ExpressionScript gir denne funksjonaliteten ved å omgi hvert uttrykk med et navngitt <span>-element. Hver gang en verdi endres, beregnes uttrykket som skal vises i dette <span>-elementet på nytt, og visningen genereres på nytt. Du kan ha titalls eller til og med hundrevis av slike tilpassede uttrykk på samme side.
Syntaksutheving
For å hjelpe deg med å skrive og validere uttrykk tilbyr EM syntaksutheving med følgende egenskaper:
Typer og betydninger av syntaksutheving
| Farge | Eksempel | Betydning | Verktøytips | Kommentarer |
|---|---|---|---|---|
| beige bakgrunn | Eksempel | hele ligningen | ingen | Alt innenfor krøllparenteser som gjenkjennes som en ligning (f.eks. uten innledende eller avsluttende mellomrom) får beige bakgrunnsfarge for å skille det fra teksten rundt |
| fet rød tekst | Eksempel | En feil | En forklaring på feilen | Kan være en ukjent variabel eller en feil i en funksjon. Undersøkelsen er ødelagt, og spørsmål som er avhengige av det aktuelle uttrykket vil ikke vises for respondentene. |
| blå tekst | Eksempel | funksjonsnavn | betydning og tillatt syntaks | Gjelder funksjonsnavn eller ting som bør være funksjoner siden de etterfølges av en åpen parentes. De vises med fet blå tekst. Verktøytips viser betydningen og tillatt syntaks for funksjonen. |
| grå tekst | Eksempel | streng | ingen | Strenger med enkle og doble anførselstegn vises med grå tekst. |
| cyan tekst | Eksempel | variabel satt på samme side | [navn]: spørsmål; verdi; svarliste som viser koder for hver verdi | Alle variabler som er satt på samme side som spørsmålet du redigerer, vises med cyan tekst (de kan oppdateres i JavaScript). Verktøytipset viser navnet, selve spørsmålet og gjeldende verdi (eller tomt hvis den ikke er satt). Hvis spørsmålstypen forventer besvarelser fra et oppsett av oppregnede verdier, vises tilordningen av kodene til visningsverdiene. |
| grønn tekst | Eksempel | variabel satt på en tidligere side | [navn]: spørsmål; verdi; svarliste som viser koder for hver verdi | Alle variabler som er satt på en tidligere side, vises med fet grønn tekst. Verktøytipset viser navnet, selve spørsmålet og gjeldende verdi (eller tomt hvis den ikke er satt). Hvis spørsmålstypen forventer besvarelser fra et oppsett av oppregnede verdier, vises tilordningen av kodene til visningsverdiene. |
| fet rosa tekst | Eksempel | variabel satt på en senere side vanligvis tom ved start av undersøkelsen, men kan fylles ut via indeks eller ved å gå tilbake | [navn eller SGQA-kode]: spørsmål; verdi; svarliste som viser koder for hver verdi | Alle variabler som er satt på en senere side, vises med fet rosa tekst. Verktøytipset viser navnet, selve spørsmålet og gjeldende verdi (eller tomt hvis den ikke er satt). Hvis spørsmålstypen forventer besvarelser fra et oppsett av oppregnede verdier, vises tilordningen av kodene til visningsverdiene. |
| fet beige-brun tekst | Eksempel | en Lime-erstatningsverdi | verdien | Lime-erstatningsstrenger (som {TOKEN:xxx}, {PRIVACY_MESSAGE}) vises med fet beige-brun tekst. |
| rød tekst | Eksempel | tilordningsoperator (=) | advarsel | Hvis du bruker tilordningsoperatoren (=), vises den med rød tekst. Dette skal hjelpe deg å unngå utilsiktet omtilordning av verdier når du egentlig ville sjekke om a == b i stedet for å sette verdien a = b. |
| vanlig svart tekst | Eksempel | skilletegn | ingen | Alle andre skilletegn i uttrykket vises med vanlig svart tekst. |
| tekst i rød boks | en fet rød linje omgir feilen | syntaksfeil | beskrivelse av feilen | Alle oppdagede syntaksfeil vises i røde bokser. Verktøytipset viser feilen. Eksempler er parenteser som ikke har et par, bruk av udefinerte funksjoner, feil antall argumenter til funksjoner, dårlig strukturerte uttrykk (f.eks. manglende operatorer mellom variabler), forsøk på å tilordne en ny verdi til en skrivebeskyttet variabel, forsøk på å tilordne verdier til noe som ikke er variabler, eller bruk av syntaks som ikke støttes. Merk at systemet for oppdagelse av syntaksfeil kanskje bare rapporterer én feil i et uttrykk selv om det er flere; hvis det oppdages feil, vises likevel minst én feil. |
Videre lesning
Eksempelundersøkelser for ExpressionScript
Bruksområder og veiledninger
Trinnvise eksempler
Referanse for utviklere