Exempel på ExpressionScript
From LimeSurvey Manual
Struktur
Den första delen av artikeln beskriver vad uttryck kan användas till och var du hittar eller lägger till ett uttryck. Den andra delen innehåller exempel på hur du använder uttryck.
Kategorier av uttryck
LimeSurvey använder uttryck för följande ändamål:
Relevans
Syfte: Dölja frågegrupper/frågor
Relevans styr om en frågegrupp eller fråga visas eller döljs. Om uttryckets resultat är "sant" (dvs. 1) visas elementet. I annat fall (om uttryckets resultat är "falskt", dvs. 0) döljs elementet.
Validering
Syfte: Validera inmatning/åtgärder för frågor/delfrågor/svar
Validering styr om respondentens inmatning i en fråga eller åtgärd är giltig eller inte. Om uttryckets resultat är "sant" (dvs. 1) tillämpas klassen "good" på elementet och valideringsmeddelandet. Om uttryckets resultat i stället är "falskt" (dvs. 0) tillämpas klassen "error" på elementet och valideringsmeddelandet. Du kan definiera en stil för dessa klasser i template.css.
Textutdata
Syften: (Göra något och) skriva ut text
Ett uttryck kan användas för att skriva ut text. Du kan till exempel testa eller beräkna något och ange utdata beroende på resultatet av testet eller beräkningen. Det kan också användas för att infoga frågetext, svar, frågetyper med mera från en fråga som kommer före uttrycket. Textutdata kan användas överallt där text visas och kan returnera alla slags resultat.
| Användningsfall | Beskrivning |
|---|---|
| Mikroanpassning | Anpassa en text, t.ex. skriv "Herr" eller "Fru" beroende på en könsfråga som ställts tidigare |
| Beräkning | Beräkna ett värde och skriv ut det, t.ex. "Din familjs inkomst är xxx" |
| Referens | Infoga en text från ett element, t.ex. "Du heter xxx. Hur gammal är du?" |
Lagring av svar
Syften: (Göra något,) (skriva ut text) och lagra något i databasen
Frågetypen Ekvation kan användas för att lagra något i databasen. Du kan göra något med ett uttryck, visa ekvationsfrågan (som liknar textvisning) och lagra uttryckets resultat i databasen. Svaret lagras i svarstabellen. Resultatet kan sedan användas i statistikfunktionen eller importeras i något av de format som LimeSurveys exportfunktion erbjuder.
Exempel på uttryck
Infoga ett svar från en föregående fråga
Använda en dold ekvationsfråga för att fylla i ett svar automatiskt
Problem: Anta att du har två frågor, Q1 och Q2. Q1 frågar respondenterna om deras ålder. Q2 delar in respondenterna i tre grupper: ålder under 20 år, ålder 20 och ålder över 20. Q2 ska alltså använda värdena "1", "2" och "3", som motsvarar villkoren ovan. Vi får dessutom inte glömma att göra Q2 osynlig (frågan visas inte i enkäten, men värdena sparas via "bakgrundsprocessen" i svarstabellen).
Så här fyller du i databasen med frågetypen Ekvation:
- Skapa först en fråga med koden Q1 som en numerisk inmatningsfråga.
- Skapa sedan en ny fråga med koden Q2 som en ekvationsfråga.
- I fliken "Visningsinställningar" för Q2:
- ställ in fältet "Dölj alltid denna fråga" på "På"
- skriv in uttrycket i fältet "Ekvation":
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Skapa en sammanfattningssida med platshållare
Den här handledningen visar hur du kan skapa en översikt i slutet av enkäten som listar alla frågor och svar med hjälp av platshållare i ExpressionScript. Den visar också hur du begränsar en sådan översikt till enbart besvarade frågor.
Vårt exempel kan laddas ned här: Exempelenkät för platshållare.
Frågetyper som används här:
1. Envalsfrågor / enskilda text-/numeriska frågor
- Lista (rullgardinslista)
- Lista (radio) [L]
- Ja/Nej [Y]
- Lång fritext [T]
- Kort fritext [S]
- Numerisk inmatning [N]
- Ekvation [*]
2. Frågor med delfrågor
- Flera korta textsvar [Q]
- Flervalsfråga [M]
- Samling [F]
- Samling (ja/nej/osäker) [C]
- Samling (10-punktsval) [B]
3. Frågor med 2 skalor
- Samling med dubbla skalor [1]
4. Frågor med X- och Y-skalor
- Samling (tal/siffor) [:]
5. Mallfrågor
- Textvisning [X]
I det här enkla exemplet blir vår översikt en enkel lista med:
- Frågetext: Användarens svar
Envalsfrågor / enskilda text-/numeriska frågor
För alla dessa frågetyper lagrar LimeSurvey ett enda svar:
- Lista (rullgardinslista)
- Lista (radio)
- Lista med kommentarer
- 5-punktsval
- Ja/Nej
- Kort fritext
- Lång fritext
- Mycket lång fritext
- Numerisk inmatning
- Ekvation
- Datum
- Kön
Om frågekoden för frågan är q1 kan vi hänvisa till frågetexten och svaret med:
- {q1.question}: {q1.shown}
Exempel:
- Hur gammal är du?: 25
Om du vill kontrollera om frågan har besvarats kan du lägga en IF-sats runt utdata:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
Detta "översätts" till: OM frågan med koden q1 inte är tom, skriv ut "- " OCH frågetexten OCH ": " OCH svarstexten (funktionen join() slår ihop element till en ny sträng); ANNARS: skriv ut ingenting ("" betyder tom sträng).
Frågor med delfrågor
För alla dessa frågetyper använder LimeSurvey delfrågor:
- Flera korta textsvar
- Flervalsfråga
- Flervalsfråga med kommentarer
- Samling
- Samling (5-punktsval)
- Samling (10-punktsval)
- Samling (ja/nej/osäker)
- Samling (öka, samma, minska)
- Samling efter kolumn
Om frågekoden för frågan är q2 och delfrågorna är numrerade SQ001, SQ002 (automatisk numrering som görs av LimeSurvey) kan vi hänvisa till frågetexten och svaret med:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
För flervalsfrågor är det lämpligt att inte visa texten för den markerade delfrågan utan i stället visa ett Y för varje valt alternativ:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Observera att det för närvarande inte går att skriva ut frågetexten för frågor med delfrågor, se den här funktionsförfrågan.
Exempel 1 (förutsatt att frågetypen är flervalsfråga)
- Känner du till dessa bilmärken?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Om du bara vill visa markerade alternativ kan du lägga en IF-sats runt utdata och kontrollera kryssrutans värde:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Använd funktionen listifop om du vill visa en lista över enbart de valda alternativen, t.ex.: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
Där that.q2 expanderas till alla delfrågor i q2. Se self, this och that för mer information.
Exempel 2 (förutsatt att frågetypen är Samling (10-punktsval))
- Betygsätt kvaliteten på bilmärkena nedan på en skala från 1=mycket dålig till 10=mycket bra?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Om du bara vill visa betygsatta alternativ kan du lägga en IF-sats runt utdata och kontrollera om den aktuella delfrågan har besvarats genom att använda:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Använd funktionen listifop om du till exempel bara vill visa en lista över de valda alternativen som är större än åtta, t.ex.: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
Fråga med två skalor
Anta att följande koder används:
- Frågekod: q4
- Delfrågekoder: SQ001, SQ002, ...
- Svarskoder skala 1: A1, A2, ...
- Svarskoder skala 2: B1, B2, ...
Exempel på hur man refererar till svaret på den tredje delfrågan och den andra skalan: q4_SQ003_1 - fråga 4, delfråga 3, andra skalan.
Låt oss visa resultaten för båda skalorna och de två första delfrågorna:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
För att visa delfrågetexten måste du lägga till skal-ID:t i platshållaren (även om texterna är desamma för båda skalorna). Så i stället för {q4_SQ001.question} måste vi använda {q4_SQ001_0.question} eller {q4_SQ001_1.question}.
Om du vill exportera/visa resultaten för enbart delfrågor med minst ett svar, använd denna syntax för varje delfråga:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
Fråga med X- och Y-skalor
Detta gäller alla matrisfrågor som tillåter ett svar för varje cell (inte bara för varje rad, som visades tidigare):
- Samling (text)
- Samling (tal/siffor)
Koder som antas användas:
- Frågekod: q5
- Delfrågekoder: SQ001, SQ002, ...
- Svarskoder: A1, A2, ...
För att hänvisa till resultatet för en viss delfråga från en viss kolumn använder du Frågekod . '_' . Delfrågekod . '_' . Svarskod. Exempel för att hänvisa till svaret på den tredje delfrågan och den andra kolumnen: q5_SQ003_A2.
Vi skriver ut resultaten för kolumn 1–3 för de två första delfrågorna:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
Eftersom varje cell (kombinationen av X-axel och Y-axel) motsvarar ett svarsalternativ för dessa frågetyper måste en kontroll av befintliga data göras för varje cell. Exempel:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
Dölj fråga om svaret på föregående fråga är tomt
| Syfte | Dölj fråga om svaret på föregående fråga är tomt |
| Typ | Frågans relevans |
| Exempel | Fråga ett: frågekod "name", frågetext "Vad heter du?" Fråga två: frågetext "{name}, hur gammal är du?" Att göra: Dölj fråga två om textfältet i fråga ett är tomt |
| Uttryck | !is_empty(name) |
| Beskrivning | is_empty() avgör om en variabel anses vara tom. "!" negerar resultatet. Om variabeln alltså inte är tom blir uttrycket sant och frågan visas |
| Steg | Skapa/redigera fråga två Skriv in "!is_empty(name)" i "Relevansekvation" |
| Exempelfil | Hide_question_if_empty_question_group.zip |
![]()
| |
Dölj frågegrupp om svaret på föregående fråga är Ja eller Nej
| Syfte | Dölj frågegrupp om svaret på föregående fråga är Ja eller Nej |
| Typ | Frågegruppens relevans |
| Exempel | Sida ett, frågegrupp ett, fråga ett: frågekod "PET", frågetext "Har du ett husdjur?" -Ja -Nej Sida två, frågegrupp två: Titel "Om ditt/dina husdjur" Att göra: Visa/dölj frågegrupp två beroende på om svaret på fråga ett är Ja/Nej |
| Uttryck | PET == "Y" |
| Beskrivning | PET är frågekoden för den fråga vars svar du vill kontrollera. Om du inte använder något suffix använder EM "Qcode.code". Du jämför alltså svarskoden från frågan PET med värdet "Y". Om deltagaren svarar "Ja" blir uttrycket sant och frågegruppen "Om ditt/dina husdjur" visas. |
| Steg | Skapa/redigera frågegrupp två Skriv in "PET == "Y"" i "Relevansekvation" |
| Exempelfil | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Visa värdet i ett fält i en fråga med flera svarsfält
| Syfte | Visa värdet i ett fält i en fråga med flera svarsfält |
| Typ | Referens |
| Exempel | Fråga ett: frågekod "AskChildAge", frågetext "Hur gamla är dina barn?". Delfrågekoder -Child1 -Child2 -Child3 - ChildXXX Fråga två: frågekod "ReportChildAge", frågetext "Om ditt första barn: - CHILD1 är AGE1." |
| Uttryck | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| Beskrivning | Du vill använda värdet från en delfråga i en följande fråga. Du kommer åt delfrågans värde med ett uttryck av den här typen: FrågekodFråga_FrågekodDelfråga.value |
| Steg | Skapa/redigera den andra frågan Skriv in den här texten i beskrivningen: "Om ditt första barn: - {AskChildAge_Child1.question} är {AskChildAge_Child1.value}." |
| Exempelfil | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
Validera antalet markerade rutor per rad för en fråga av typen "Samling (tal/siffor) med kryssrutor"
| Syfte | Validera antalet markerade rutor per rad |
| Typ | Validering |
| Exempel | Fråga av typen "Samling (tal/siffor)" (Layout med kryssrutor) |
| Uttryck | sum(...) |
| Beskrivning | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) avgör om högst X kryssrutor på rad A är markerade. Om du vill kontrollera alla tre raderna (A, B, C) kan du koppla ihop uttrycket med "&&": (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| Steg | Skapa/redigera en fråga av typen "Samling (tal/siffor)" (Layout med kryssrutor). Skriv in uttrycket ovan i "Valideringsuttryck för frågan" i de avancerade frågeinställningarna (du kan behöva anpassa variabelnamnen!). |
| Exempelfil | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
Beräkna skillnaden mellan två datum
| Syfte | Beräkna skillnaden mellan två datum |
| Typ | Relevans / Frågetypen ekvation / Validering |
| Exempel | Fråga ett (datum/tid, kod: DOB): Vilket är ditt födelsedatum? Fråga två (datum/tid, kod: datetoday): Vilket datum är det i dag? Fråga tre (textvisning): Du är XXXX dagar gammal. Att göra: Beräkna och visa antalet dagar mellan datumet i fråga 1 och datumet i fråga 2. |
| Uttryck | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| Beskrivning | strtotime beräknar antalet sekunder mellan den 1 januari 1970 och det angivna datumet. Uttrycket ovan beräknar antalet sekunder mellan de två angivna datumen. Termen "/60/60/24" räknar bara om antalet sekunder till antal dagar. I stället för att fråga efter "datetoday" kan du också använda strtotime('now') eller helt enkelt time(), som direkt returnerar antalet sekunder från januari 1970 till nu (dvs. tidpunkten då enkäten besvarades). På så sätt kan du snabbt räkna ut en persons ålder i år med ekvationen {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} I samtliga fall är det avgörande att datumet anges i ett korrekt format, annars fungerar inte funktionen strtotime() som den ska. |
| Steg | Skapa två datumfrågor (för födelsedatum och dagens datum) och en textvisningsfråga. Skriv in följande i frågetexten för textvisningsfrågan: "Den {datetoday} var du {(strtotime(today)-strtotime(dob))/60/60/24} dagar gammal." Observera: Funktionen strtotime fungerar med MÅNGA men inte alla datumformat. Om du stöter på problem ställer du in enkätens datumformat på mm/dd/åååå eller åååå-mm-dd eller dd.mm.åååå" |
| Exempelfil | Date_difference.zip |
| |
Använda ExpressionScript för bedömningar
Här följer ytterligare ett exempel på hur du använder ExpressionScript med frågor av typen samling och bedömningar:</ br>
Anta att du har två samlingsfrågor och vill spara resultaten av beräkningen i databasen. Det är faktiskt enkelt: du behöver skapa och testa dina samlingar och skicka in ett testsvar för att se om det fungerar och ger dig resultaten på sidan för slutförd enkät.
Implementeringsdetaljer:
- lägg till en fråga av typen ekvation
- lägg till följande rad, under antagande att Q1 är frågekoden för din första samlingsfråga och Q2 den andra:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
Observera att SQ001 är standardkoden för alla delfrågor. Om du ändrar delfrågekoden måste du anpassa ekvationen ovan i enlighet med detta.
Använda em_validation_q i en samling
Du kan använda valideringsuttrycket för frågan för att kontrollera en samling med valfritt villkor.
Implementeringsdetaljer:
- för den första samlingen: samling med enval
- Frågekoden är ARRAY
- Delfrågekoderna är SQ01,SQ02,SQ03 och SQ04
- uppdatera valideringsuttrycket för hela frågan och skriv in
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- för den andra samlingen: samling med text
- Frågekoden är ARRAYTEXT
- Delfrågekoderna på Y-axeln är SY01,SY02,SY03 och SY04
- Uppdatera valideringsuttrycket för hela frågan och skriv in
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








