ExpressionScript-motorn – Snabbstartsguide
From LimeSurvey Manual
Snabbstartsguide
I LimeSurvey kan du anpassa dina enkäter ytterligare med hjälp av ExpressionScript (förkortat: ES). Observera: "ExpressionScript hette Expression Manager (EM) i tidigare versioner. Om du ser Expression Manager någonstans är det bara det gamla namnet på ES."
ES kan användas för att ange följande:
- Navigering/Förgrening - gör att en respondents svar kan ändra i vilken ordning frågorna visas;
- Anpassning/Piping - hjälper dig att formulera frågan (till exempel genom att hänvisa till tidigare svar eller böja meningar utifrån dina deltagares ålder eller kön) eller hur du skapar anpassade rapporter (som utvärderingspoäng eller skräddarsydda råd);
- Validering - säkerställer att svar uppfyller vissa kriterier, som lägsta och högsta värden eller ett visst inmatningsmönster.
ES ger ett intuitivt sätt att ange logiken för var och en av dessa funktioner. Nästan allt som du kan skriva som en vanlig matematisk ekvation är ett giltigt uttryck.
ES ger för närvarande tillgång till 70 funktioner och kan enkelt utökas för att stödja fler. Det gör det också möjligt att komma åt dina variabler med hjälp av läsbara variabelnamn (i stället för SGQA-namn).
De kommande avsnitten visar de viktigaste platserna där ES används.
Vissa enkäter använder "Goto-logik", där du till exempel omdirigeras till Fråga5 om du svarar med alternativ C på Fråga1. Det här tillvägagångssättet är mycket begränsat eftersom det är svårt att validera. Dessutom går det lätt sönder när du behöver ordna om frågor. ES använder däremot booleska relevansekvationer för att ange alla villkor under vilka en fråga kan vara giltig. Om frågan är relevant visas den, annars är den inte tillämplig och värdet "NULL" lagras i databasen.
För att bättre förstå relevansbegreppet tittar vi på följande enkät, som beräknar kroppsmasseindex (BMI) för enkätens respondenter. Om du vill ladda ner den klickar du på följande länk: Exempelenkät för kroppsmasseindex.
Relevansekvationen visas nedan i kolumnen Relevans efter variabelnamnet. Relevansvärdena för weight, weight_units, height och height_units är alla 1 (standardvärde), vilket betyder att dessa frågor alltid visas. Relevansen för BMI är dock {!is_empty(height) and !is_empty(weight)}, vilket innebär att BMI bara beräknas om deltagaren anger ett värde för både längd och vikt (så att risken för division med noll undviks). Frågan "Report" visas dessutom bara om respondenten besvarar alla fyra huvudfrågor (height, heightunits, weight, weightunits).

Relevans visas och kan redigeras när:
- du vill visa/redigera relevans på frågenivå
- du vill visa/redigera relevans på gruppnivå
Visa/redigera relevans på frågenivå
Den här ekvationen beräknar kroppsmasseindex (BMI). Frågan ställs bara om personen anger sin längd och vikt.

Det här är redigeringsskärmen för frågan "BMI".

Observera att du inte använder måsvingar när du anger en relevansekvation.
Visa/redigera relevans på gruppnivå
Låt oss nu titta på ett annat exempel – en enkel folkräkningsenkät. Om du vill ladda ner den klickar du på följande länk: Exempelenkät för folkräkning.
Den första sidan frågar hur många personer som bor med dig och lagrar svaret i variabeln "cohabs". Den här sidan visas bara om du har fler än en sambo/inneboende (den visas för den andra personen som bor med dig). Dessutom visas p2name, p2age och p2sum bara om frågan före var och en av dem har ett svar.

Gruppen har alltså också relevanskriterier på frågenivå, så att vissa frågor bara visas om du har besvarat vissa frågor före dem (t.ex. visas p2age om p2name har besvarats). ES kombinerar relevansen på grupp- och frågenivå åt dig. Frågor i en grupp ställs bara om gruppen som helhet är relevant. Därefter ställs bara den delmängd av frågorna i gruppen som är relevanta.
Här är skärmbilden för redigering av relevansen på gruppnivå för Cohabitant 2:

Observera att du inte använder klammerparenteser när du anger en relevansekvation.
Anpassning/Piping
Med ES kan du enkelt göra både enkel och avancerad villkorsstyrd anpassning. Ibland behöver du bara en enkel ersättning, till exempel: "Du sa att du köpte [Produkt]. Vad gillade du bäst med den?". Ibland behöver du villkorsstyrd ersättning, som "[Herr/Fru] [Efternamn], skulle du vilja besvara vår enkät?". I det här fallet vill du använda "Herr eller Fru" utifrån personens kön. Andra gånger behöver du ännu mer avancerad ersättning (till exempel baserad på en matematisk beräkning). ES stöder alla dessa typer av anpassning/piping.
Villkorsstyrda ekvationer
Exemplet med kroppsmassaindex visar hur man kan beräkna en persons BMI, även när personen får ange längd och vikt i två olika enheter (cm eller tum och kg eller lbs):

I det här fallet är weightkg {if(weightunits == "kg", weight, weight * 0.453592)}. Funktionen "if()" innebär att om deltagaren anger vikten i kilogram används det värdet, annars multipliceras det angivna värdet (alternativet är pund) med 0.453592 för att omvandla det till kilogram. Variabeln heightm använder ett liknande tillvägagångssätt för att beräkna personens längd i meter (längd i cm/100), även om längden har angetts i tum (1 meter = 3.28084 tum).
BMI beräknas som: {weightkg / (heightm * heightm)}.
Slutligen anpassar rapporten meddelandet villkorsstyrt för deltagaren och visar vad personen har angett. (t.ex. "Du sa att du är 2 meter lång och väger 70 kg.")
I bilden nedan använder weightstatus nästlade "if()"-satser för att kategorisera personen från undervikt till svår fetma. Du kan se dess ekvation genom att kontrollera dess logik:

I redigeringsfönstret för den här frågan kan du se två saker:
- Vid anpassning måste uttryck omges av klammerparenteser
- Uttryck kan sträcka sig över flera rader om du, som i det här fallet, vill göra den nästlade villkorslogiken lättare att läsa.

Anpassade frågor, svar och rapporter
BMI-rapporten ser ut så här:

Här är redigeringsfönstret för samma fråga.

Allt inom klammerparenteser behandlas som ett uttryck och syntaxmarkeras (färgkodas) i föregående bild. Om du har stavfel (till exempel felstavade eller odefinierade variabelnamn eller funktioner) visar ES ett fel. I vårt exempel nedan:
- heightunit.shown är ett odefinierat variabelnamn (det ska egentligen vara heightunits.shown) och
- "rnd()" är en odefinierad funktion (rätt funktionsnamn är "round()").
I båda fallen markeras felen med en röd ruta så att de är lättare att upptäcka och åtgärda.

Du kan också se att du snabbt kan skapa avancerade rapporter, till exempel en tabell med angivna värden eller anpassade råd.
Kom ihåg att all anpassning måste omge uttryck med klammerparenteser, så att LimeSurvey vet vilka delar av frågan som är fritext och vilka som ska tolkas av ExpressionScript-motorn.
Validering
ES styr hur de flesta av de avancerade frågealternativen fungerar. Dessa styr aspekter som min/max antal svar, min/max enskilda värden, min/max summavärden samt kontroll av att angivna värden matchar angivna teckenmönster. Alla värden i något av dessa fält betraktas som ett uttryck, så du kan ha min/max-kriterier med avancerade villkorliga samband till andra frågor.
I alla dessa fall använder du inte klammerparenteser när du anger det, eftersom det avancerade frågeattributet alltid betraktas som ett uttryck.
Sidan med exempelenkäter visar många fungerande exempel med en mängd olika valideringsuttryck.
ExpressionScript - presentation
Om du vill veta mer om ExpressionScript och hur du kan använda olika uttryck för att förbättra din enkät, klicka på följande länk.