Eksempler på ExpressionScript
From LimeSurvey Manual
Oppbygning
Den første delen av artikkelen beskriver hva uttrykk kan brukes til, og hvor du finner/legger til et uttrykk. Den andre delen gir eksempler på hvordan du bruker uttrykk.
Kategorier av uttrykk
LimeSurvey bruker uttrykk til følgende formål:
Relevanse
Formål: Skjule spørsmålsgrupper/spørsmål
Relevans styrer om en spørsmålsgruppe eller et spørsmål vises eller skjules. Hvis resultatet av uttrykket er «sant» (dvs. 1), vises elementet. Ellers (hvis resultatet av uttrykket er «usant», dvs. 0) skjules elementet.
Validering
Formål: Validere inndata/handlinger i spørsmål/underspørsmål/svar
Validering styrer om respondentens inndata i et spørsmål eller en handling er gyldig. Hvis resultatet av uttrykket er «sant» (dvs. 1), brukes klassen «good» på elementet og valideringsmeldingen. Hvis resultatet av uttrykket derimot er «usant» (dvs. 0), brukes klassen «error» på elementet og valideringsmeldingen. Du kan definere en stil for disse klassene i template.css.
Tekstutdata
Formål: (Gjøre noe og) skrive ut tekst
Et uttrykk kan brukes til å skrive ut tekst. Du kan for eksempel teste eller beregne noe og bestemme utdataene ut fra resultatet av testen eller beregningen. Det kan også brukes til å sette inn spørsmålsteksten, svar, spørsmålstyper osv. fra et spørsmål som er brukt før uttrykket. Tekstutdata kan brukes overalt der tekst vises, og kan returnere alle typer resultater.
| Bruksområde | Beskrivelse |
|---|---|
| Mikrotilpasning | Tilpasse en tekst, f.eks. skrive «herr» eller «fru» avhengig av et kjønnsspørsmål som er stilt tidligere |
| Beregning | Beregne en verdi og skrive den ut, f.eks. «Familieinntekten din er xxx» |
| Referanse | Sette inn en tekst fra et element, f.eks. «Du heter xxx. Hvor gammel er du?» |
Lagring av svar
Formål: (Gjøre noe,) (skrive ut tekst) og lagre noe i databasen
Spørsmålstypen Ligning kan brukes til å lagre noe i databasen. Du kan gjøre noe med et uttrykk, vise ligningsspørsmålet (som ligner på tekstvisning) og lagre resultatet av uttrykket i databasen. Svaret lagres i svartabellen. Resultatet kan deretter brukes i statistikkfunksjonen, eller det kan eksporteres til et av formatene som eksportfunksjonen i LimeSurvey tilbyr.
Eksempler på uttrykk
Sette inn et svar fra et tidligere spørsmål
Bruke et skjult ligningsspørsmål til å fylle ut et svar automatisk
Problem: Anta at du har to spørsmål, Q1 og Q2. Q1 spør respondentene om alderen deres. Q2 deler respondentene inn i tre grupper: alder under 20 år, alder lik 20 og alder over 20. Q2 skal derfor bruke verdiene «1», «2» og «3», som tilsvarer betingelsene ovenfor. Vi må også huske å gjøre Q2 usynlig (spørsmålet vises ikke i undersøkelsen, men verdiene lagres via «bakgrunnsprosessen» i svartabellen).
Slik fyller du ut databasen med spørsmålstypen Ligning:
- Opprett først et spørsmål med kode Q1 som et numerisk spørsmål.
- Opprett deretter et nytt spørsmål med kode Q2 som et ligningsspørsmål.
- Under fanen «Visningsinnstillinger» for Q2:
- sett feltet "Skjul alltid dette spørsmålet" til "På"
- skriv inn uttrykket i feltet "Ligning":
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Opprette en sammendragsside med plassholdere
Denne veiledningen viser hvordan du kan lage en oversikt på slutten av undersøkelsen som viser alle spørsmål og svar via ExpressionScript-plassholdere. Den viser også hvordan du begrenser en slik oversikt til kun besvarte spørsmål.
Eksempelet vårt kan lastes ned her: Eksempelundersøkelse med plassholdere.
Spørsmålstyper som brukes her:
1. Enkeltvalgsspørsmål / enkle tekst-/numeriske spørsmål
- Liste (rullegardinliste)
- Liste (radioknapper) [L]
- Ja/Nei [Y]
- Lang fritekst [T]
- Kort fritekst [S]
- Numerisk [N]
- Ligning [*]
2. Spørsmål med underspørsmål
- Flere korte tekstfelt [Q]
- Flervalg [M]
- Matrise [F]
- Matrise (ja/nei/usikker) [C]
- Matrise (10 poengsvalg) [B]
3. Spørsmål med 2 skalaer
- Matrise dobbel skala [1]
4. Spørsmål med X- og Y-skalaer
- Matrise (tall) [:]
5. Lukkede spørsmål
- Tekstvisning [X]
I dette enkle eksempelet blir oversikten vår en enkel liste med:
- Spørsmålstekst: Brukerens svar
Enkeltvalgsspørsmål / enkle tekst-/numeriske spørsmål
For alle disse spørsmålstypene lagrer LimeSurvey ett enkelt svar:
- Liste (rullegardinliste)
- Liste (radioknapper)
- Liste med kommentar
- 5-punkts valg
- Ja/Nei
- Kort fritekst
- Lang fritekst
- Ekstra lang fritekst
- Numerisk
- Ligning
- Dato
- Kjønn
Hvis spørsmålskoden til spørsmålet er q1, kan vi referere til spørsmålsteksten og svaret med:
- {q1.question}: {q1.shown}
Eksempel:
- Hvor gammel er du?: 25
Hvis du vil sjekke om spørsmålet er besvart, kan du sette en IF-setning rundt utdataene:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
Dette «oversettes» til: HVIS spørsmålet med spørsmålskode q1 ikke er tomt, skriv ut «- » OG spørsmålsteksten OG «: » OG svarteksten (funksjonen join() slår sammen elementer til en ny streng); ELLERS: skriv ut ingenting ("" betyr tom streng).
Spørsmål med underspørsmål
For alle disse spørsmålstypene bruker LimeSurvey underspørsmål:
- Flere korte tekstfelt
- Flervalg
- Flervalg med kommentarer
- Matrise
- Matrise (5-poengsvalg)
- Matrise (10 poengsvalg)
- Matrise (ja/nei/usikker)
- Matrise (øk/uendret/reduser)
- Matrise etter kolonne
Hvis spørsmålskoden til spørsmålet er q2 og underspørsmålene er nummerert SQ001, SQ002 (automatisk nummerering utført av LimeSurvey), kan vi referere til spørsmålsteksten og svaret med:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
For flervalgsspørsmål er det fornuftig å ikke vise teksten til det avmerkede underspørsmålet, men å vise en Y for hvert valgt alternativ:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Merk at det foreløpig ikke er mulig å skrive ut spørsmålsteksten til spørsmål med underspørsmål, se denne funksjonsforespørselen.
Eksempel 1 (forutsatt at spørsmålstypen er flervalg)
- Kjenner du disse bilmerkene?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Hvis du bare vil vise avkryssede elementer, kan du legge en IF-setning rundt utdataene og sjekke verdien til avkryssingsboksen:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Bruk funksjonen listifop hvis du vil vise en liste over kun de valgte elementene, f.eks.: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
Her utvides that.q2 til alle underspørsmålene i q2. Se self, this og that for mer informasjon.
Eksempel 2 (forutsatt at spørsmålstypen er Matrise (10 poengsvalg))
- Vurder kvaliteten på bilmerkene nedenfor på en skala fra 1=svært dårlig til 10=svært bra?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Hvis du bare vil vise vurderte elementer, kan du legge en IF-setning rundt utdataene og sjekke om det aktuelle underspørsmålet er besvart ved å bruke:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Bruk funksjonen listifop hvis du for eksempel bare vil vise en liste over valgte elementer med verdi større enn åtte, f.eks.: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
Spørsmål med to skalaer
La oss anta at følgende koder brukes:
- Spørsmålskode: q4
- Underspørsmålskoder: SQ001, SQ002, ...
- Svarkoder skala 1: A1, A2, ...
- Svarkoder skala 2: B1, B2, ...
Eksempel på henvisning til svaret på det tredje underspørsmålet og den andre skalaen: q4_SQ003_1 - spørsmål 4, underspørsmål 3, andre skala.
La oss vise resultatene for begge skalaene og de to første underspørsmålene:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
For å vise teksten til underspørsmålet må du legge til skala-ID-en i plassholderen (selv om tekstene er like for begge skalaene). Så i stedet for {q4_SQ001.question} må vi bruke {q4_SQ001_0.question} eller {q4_SQ001_1.question}.
Hvis du bare vil eksportere/vise resultatene for underspørsmål med minst ett svar, bruker du denne syntaksen for hvert underspørsmål:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
Spørsmål med X- og Y-skalaer
Dette gjelder alle matrisespørsmål som tillater et svar for hver celle (ikke bare for hver rad, slik som vist tidligere):
- Matrise (tekst)
- Matrise (tall)
Forutsatte koder:
- Spørsmålskode: q5
- Underspørsmålskoder: SQ001, SQ002, ...
- Svarkoder: A1, A2, ...
For å referere til resultatet av et bestemt underspørsmål fra en bestemt kolonne må du bruke Spørsmålskode . '_' . Underspørsmålskode . '_' . Svarkode. Eksempel for å referere til svaret på det tredje underspørsmålet og den andre kolonnen: q5_SQ003_A2.
La oss skrive ut resultatene for kolonne 1–3 for de to første underspørsmålene:
- {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}
Siden hver celle (kombinasjonen av X-akse og Y-akse) tilsvarer ett svaralternativ for disse spørsmålstypene, må det gjøres en test for eksisterende data for hver enkelt celle. Eksempel:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
Skjul spørsmål hvis svaret fra forrige spørsmål er tomt
| Formål | Skjul spørsmål hvis svaret fra forrige spørsmål er tomt |
| Type | Spørsmålsrelevanse |
| Eksempel | Spørsmål én: spørsmålskode "name", spørsmålstekst "Hva heter du?" Spørsmål to: spørsmålstekst "{name}, hvor gammel er du?" Oppgave: Skjul spørsmål to hvis tekstfeltet i spørsmål én er tomt |
| Uttrykk | !is_empty(name) |
| Beskrivelse | is_empty() avgjør om en variabel regnes som tom. «!» negerer resultatet. Hvis variabelen ikke er tom, blir uttrykket sant, og spørsmålet vises |
| Trinn | Opprett/rediger spørsmål to Skriv inn "!is_empty(name)" i "Relevanseligning" |
| Eksempelfil | Hide_question_if_empty_question_group.zip |
![]()
| |
Skjul spørsmålsgruppe hvis svaret fra forrige spørsmål er Ja eller Nei
| Formål | Skjul spørsmålsgruppe hvis svaret fra forrige spørsmål er Ja eller Nei |
| Type | Relevanse for spørsmålsgruppe |
| Eksempel | Side én, spørsmålsgruppe én, spørsmål én: spørsmålskode "PET", spørsmålstekst "Har du et kjæledyr?" -Ja -Nei Side to, spørsmålsgruppe to: Tittel "Om kjæledyret/kjæledyrene dine" Oppgave: Vis/skjul spørsmålsgruppe to avhengig av om svaret på spørsmål én er Ja/Nei |
| Uttrykk | PET == "Y" |
| Beskrivelse | PET er spørsmålskoden til spørsmålet du vil sjekke svaret på. Hvis du ikke bruker et suffiks, bruker EM «Qcode.code». Du sammenligner altså svarkoden fra PET-spørsmålet med verdien «Y». Hvis deltakeren svarer «Ja», blir uttrykket sant, og spørsmålsgruppen «Om kjæledyret/kjæledyrene dine» vises. |
| Trinn | Opprett/rediger spørsmålsgruppe to Skriv inn "PET == "Y"" i "Relevanseligning" |
| Eksempelfil | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Vis verdien i et felt i et spørsmål med flere svarfelt
| Formål | Vis verdien i et felt i et spørsmål med flere svarfelt |
| Type | Referanse |
| Eksempel | Spørsmål én: spørsmålskode "AskChildAge", spørsmålstekst "Hvor gamle er barna dine?". Underspørsmålskoder -Child1 -Child2 -Child3 - ChildXXX Spørsmål to: spørsmålskode "ReportChildAge", spørsmålstekst "Om det første barnet ditt: - CHILD1 er AGE1." |
| Uttrykk | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| Beskrivelse | Du vil bruke verdien til et underspørsmål i et påfølgende spørsmål. Du får tilgang til underspørsmålets verdi med et uttrykk av denne typen: QcodeQuestion_QcodeSubquestion.value |
| Trinn | Opprett/rediger det andre spørsmålet Skriv inn denne teksten i beskrivelsen: "Om det første barnet ditt: - {AskChildAge_Child1.question} er {AskChildAge_Child1.value}." |
| Eksempelfil | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
Valider antall avkryssede bokser per rad for et «Matrise (tall)»-spørsmål med avkryssingsbokser
| Formål | Valider antall avkryssede bokser per rad |
| Type | Validering |
| Eksempel | Spørsmål av typen "Matrise (tall)" med "Visning av avkryssingsboks" |
| Uttrykk | sum(...) |
| Beskrivelse | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) avgjør om høyst X avkryssingsbokser i rad A er avkrysset. Hvis du vil sjekke alle tre radene (A, B, C), kan du koble sammen uttrykkene 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) |
| Trinn | Opprett/rediger spørsmål av typen "Matrise (tall)" med "Visning av avkryssingsboks". Skriv inn uttrykket ovenfor i "Spørsmålets valideringsligning" under de avanserte spørsmålsinnstillingene (du må kanskje justere variabelnavnene!). |
| Eksempelfil | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
Beregn differansen mellom to datoer
| Formål | Beregn differansen mellom to datoer |
| Type | Relevanse / spørsmålstypen Ligning / Validering |
| Eksempel | Spørsmål én (dato/tid, kode: DOB): Hva er fødselsdatoen din? Spørsmål to (dato/tid, kode: datetoday): Hvilken dato er det i dag? Spørsmål tre (tekstvisning): Du er XXXX dager gammel. Oppgave: Beregn og vis antall dager mellom datoen oppgitt i spørsmål 1 og spørsmål 2. |
| Uttrykk | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| Beskrivelse | strtotime beregner antall sekunder mellom 1. januar 1970 og den oppgitte datoen. Uttrykket ovenfor beregner antall sekunder mellom de to oppgitte datoene. Leddet «/60/60/24» regner bare om antall sekunder til antall dager. I stedet for å spørre etter «datetoday» kan du også bruke strtotime('now') eller ganske enkelt time(), som direkte returnerer antall sekunder fra januar 1970 til nå (altså tidspunktet undersøkelsen ble besvart). På den måten kan du raskt finne alderen til en person i år med ligningen {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} I alle disse tilfellene er det avgjørende at datoen er skrevet inn i et riktig format, ellers vil ikke funksjonen strtotime() fungere som den skal. |
| Trinn | Opprett to datospørsmål (for fødselsdato og for dagens dato) og et tekstvisningsspørsmål. Skriv inn i spørsmålsteksten til tekstvisningsspørsmålet: "Den {datetoday} var du {(strtotime(today)-strtotime(dob))/60/60/24} dager gammel." Merk: Funksjonen strtotime fungerer med MANGE, men ikke alle datoformater. Hvis du får problemer, kan du sette undersøkelsens datoformat til mm/dd/åååå, åååå-mm-dd eller dd.mm.åååå" |
| Eksempelfil | Date_difference.zip |
| |
Bruke ExpressionScript for vurderinger
Her er et eksempel til på hvordan du bruker ExpressionScript med matrisespørsmål og vurderinger:</ br>
La oss si at du har to matrisespørsmål og vil lagre resultatet av beregningen i databasen din. Det er egentlig enkelt: Du må opprette og teste matrisene dine og sende inn en prøvebesvarelse for å se om det fungerer og gir deg resultatene på siden for fullført undersøkelse.
Gjennomføring:
- legg til et spørsmål av typen ligning
- legg til følgende linje, forutsatt at Q1 er spørsmålskoden til matrisespørsmålet ditt og Q2 er det andre:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
Merk at SQ001 er standardkoden for alle underspørsmål. Hvis du endrer underspørsmålskoden, må du justere ligningen ovenfor tilsvarende.
Bruke em_validation_q i en matrise
Du kan bruke spørsmålets valideringsligning til å kontrollere en matrise med en hvilken som helst betingelse.
Gjennomføring:
- for den første matrisen: matrise med enkeltvalg
- Spørsmålskoden er ARRAY
- Underspørsmålskodene er SQ01, SQ02, SQ03 og SQ04
- oppdater valideringsligningen for hele spørsmålet og skriv inn
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- for den andre matrisen: matrise med tekst
- Spørsmålskoden er ARRAYTEXT
- Underspørsmålskodene på Y-aksen er SY01, SY02, SY03 og SY04
- Oppdater valideringsligningen for hele spørsmålet og skriv inn
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








