ExpressionScript prøveundersøgelser
From LimeSurvey Manual
Introduktion
Den bedste måde at lære at bruge ExpressionScript på er at lege med arbejdseksempler og tilpasse dem til dine behov.
Nedenfor kan du finde et sæt stikprøveundersøgelser for at demonstrere (og teste), hvordan EM kan bruges til at forbedre din undersøgelse. Disse undersøgelser kan findes i distributionens /docs/demosurveys mappe.
Relevans, skræddersyning og ligninger
Oversigt
Følgende eksempel beregner BMI (Body Mass Index) for hver respondent. Se nedenfor de funktioner, der er demonstreret i dette eksempel.
EM-funktioner demonstreret
- Relevans - understøttelse af kraftfuld betinget logik;
- Piping / Tailoring - giver mulighed for at pipe eller skræddersy svar og spørgsmåls-metadata;
- Dynamic Tailoring - bemærk, at rapporter ændres på siden, efterhånden som du besvarer spørgsmål.
- Micro-Tailoring - betinget tilpasning i sætninger og rapporter ved hjælp af if()-sætninger
- Ligninger - en ny spørgsmålstype, der lader dig foretage beregninger og gemme resultaterne i databasen, selvom beregningen er skjult
- Betinget validering - validering kriterier, såsom den mindst tilladte værdi, kan være betingede - f.eks. baseret på ligninger.
Skærmbilleder
Dette eksempel beregner Body Mass Index, en beregning af din vægt og højde for at afgøre, om du er undervægtig, normalvægtig, overvægtig eller fed. Bemærk, at du i første omgang kun ser de fire obligatoriske spørgsmål:

Når du har indtastet dine oplysninger (og du kan vælge, om du vil bruge metriske eller ikke-metriske enheder), ser du en skræddersyet rapport, der opsummerer, hvad du har indtastet, og fortæller dig din vægtstatus:

Her er et andet eksempel, hvor der bruges ikke-metriske enheder til at vise, hvordan resultatet ændrer sig dynamisk:

Der er skjulte Spørgsmål af ligningstype på det interne niveau, der konverterer dataene til metriske (hvis nødvendigt), og gemmer den metriske højde, vægt, BMI og vægtstatus i databasen uden brug af tilpasset JavaScript .
Du kan se i det næste sæt eksempler, hvordan du kan bruge matematiske og andre funktioner i skræddersyede rapporter. Sådan ser siden ud, før du indtaster nogen data. Der er betinget logik til at vise tomme celler, hvis ingen (eller ikke-numeriske) data er indtastet, i stedet for at vise "NaN" eller "Del med nul".

Efterhånden som tallene indtastes, ændres rapporten på siden for at vise den beregning, der udføres, og dens resultat.

Der er mange andre eksempler i denne stikprøveundersøgelse. For eksempel viser nedenstående skærmbillede en af de snesevis af måder, hvorpå du kan udfylde siden Dynamisk relevans. Som hjælpeteksten bemærker, prøv forskellige aldre og især ulogiske kombinationer af svar for at se de underholdende beskeder, der genereres nederst. Bemærk også, at hvis du siger, at du har mere end ét barn, vil beskeden sige "Jeg håber, du nyder at lege med dine X børn", i stedet for at sige "Jeg håber, du nyder at lege med dit barn". Dette viser, hvordan du nemt kan mikroskræddersy sætninger, så de matcher køn og/eller antallet af dine emner. Du kan endda nemt bøje verber og afvise navneord baseret på køn og tal.

Download
For at få adgang til undersøgelseseksemplet skal du klikke på følgende link: LS3_em_tailoring.zip.
Eksempel på folketælling
Oversigt
Dette er et folketællingseksempel, der spørger, hvor mange mennesker der er i din husstand.
Det demonstrerer, hvordan relevans på gruppeniveau kan gøre det lettere at implementere en "loop" af spørgsmål. Efter at have oprettet gruppen til person 1, eksporterede jeg gruppen. Da jeg brugte qcode-variablenavne som p1_name i stedet for SGQA-koden, kunne jeg bruge en teksteditor til hurtigt at redigere og genimportere gruppen flere gange (f.eks. tog det omkring 10 sekunder at redigere og genimportere hver gentagende gruppe, hvilket sikrede at alle variabler havde unikke variabelnavne, og at logikken på gruppeniveau var korrekt).
Du kan også funktionen kopiér spørgsmål, men den vil ikke være så hurtig som indstillingen foreslået ovenfor.
Dette viser også, hvordan du kan forhindre, at meddelelsen Færdig vises, indtil undersøgelsen virkelig er afsluttet (f.eks. når alle nødvendige grupper er gennemført).
EM-funktioner demonstreret
- Relevans på gruppeniveau - Følgegrupperne (Person 1-5) vises kun for op til det angivne antal samlevende;
- Skræddersy - Den endelige rapport opsummerer de demografiske data for hver samlever;
- Progressiv spørgsmålsvisning - Uanset om det er i gruppe- eller alt-i-én-tilstand, vises efterfølgende spørgsmål kun, så snart de foregående er besvaret.
Skærmbilleder
Undersøgelsen genererer en skræddersyet rapport, der viser demografien for det angivne antal samlevende:

Hvis du skifter til spørgsmål-ad-gangen-tilstand, ser du, at indekset skræddersy spørgsmålene. Da brugeren sagde, at personen er en kvinde, spørger den "Hvad er hendes navn". Og da vi svarede "Mary", siger det næste spørgsmål "Hvor gammel er Mary"?

Download
For at downloade undersøgelseseksemplet, klik her: LS3_group_relevance.zip.
Cascading Array Filters
Oversigt
Denne undersøgelse er baseret på designet af en undersøgelse fra Joy Lane Research, LLC.
Skærmbilleder
Bemærk i det følgende, at:
- Q02 kun viser det sæt af produkter, der er tjekket i Q01 (ved at bruge array_filter)
- Q02 viser også "Et andet produkt", teksten indtastet i feltet "Andet elektronisk" i Q01
- Q04 viser kun produkter fra Q02, der blev kontrolleret (så array-filteret falder sammen)
- Q05 viser kun produkter fra Q02, der ikke blev tjekket i Q02 (ved hjælp af et cascaded array_filter_exclude)


Download
Klik på følgende link for at downloade ovenstående eksempel: LS2_cascading_array_filter undersøgelseseksempel.
Rørføring/skræddersying ved hjælp af alle spørgsmålstyper og attributter
Oversigt
Hvis du er forvirret over, hvordan du navngiver dine variabler (SGQA vs Qcodes), er du ikke alene. Selvom hoveddokumentationen beskriver hvordan man komponerer Qcode-variablenavne, er der intet, der slår at se det i en fungerende demo. Denne undersøgelse viser, hvordan du kan få adgang til spørgsmålsattributter og svar ved hjælp af ExpressionScript.

Indhold
- Eksempler på hver spørgsmålstype
- Alle spørgsmålstyper, der kan bruge "andet", er inkluderet, så du kan se, hvordan det påvirker variabelnavngivning
- Standardværdier for alle spørgsmålstyper, der accepterer standardindstillinger
- Skræddersyet - On- og off-side rapporter, der viser alle 16 tilgængelige EM-punktnotationssuffikser.
- Disse rapporter viser alle de aktuelt indtastede data (så viser dig, hvordan du kan generere dine egne printbare rapporter til brugere i stedet for print- svarskærm)
- Korrekt Qcode og SGQA-navngivning af alle variabler
Skærmbilleder
Dette er en kæmpe undersøgelse, så vi valgte ikke at inkludere skærmbilleder. I stedet skal du downloade og lege med den.
Download
Klik på følgende link for at downloade undersøgelsen: LS3_EM_question_attributes.lss
Traditionel validering, re-envisioned
Oversigt
Dette viser alle de valideringstyper, der gør brug af udtryk, og hvordan de påvirker hver af de spørgsmålstyper, der understøtter validering. I mange tilfælde starter valideringstipsene skjult og vises kun, hvis et spørgsmål ikke opfylder valideringskriterierne (og forsvinder dermed også, når spørgsmålet består valideringskriterierne).
Demonstrerede valideringstyper
- min_num_value_n - minimumsværdi for et svar
- max_num_value_n - max værdi for et svar
- min_svar - minimum antal svar påkrævet
- max_answers maksimum antal tilladte svar
- multiflexible_min - minimumsværdi tilladt for et svar (for multiflexi-tal spørgsmålstype)! N!#multiflexible_max - maksimal værdi tilladt for et svar (for multiflexi-tal spørgsmålstype)
- min_num_value - minimum tilladt sum på tværs af alle svar for spørgsmålet
- max_num_value - maksimal tilladt sum på tværs af alle svar på spørgsmålet
- equals_num_value - summen på tværs af alle svar på spørgsmålet skal være lig med denne værdi
- validation - dette er valideringen af det regulære udtryk for spørgsmålet - det kan gælde for individuelle celler
Skærmbilleder
Ved at bruge nye CSS-stile viser hver valideringstype et separat tip. Hvis de vises, kan de skjules via hide_tip muligheden. Standardindstillingen er at vise dem med rød skrift, hvis spørgsmålet ikke opfylder valideringskriterierne, og grønt, hvis det består dem:

En bruger kan ikke indsende en side med valideringsfejl. Han vil straks blive advaret, hvis han indtastede forkerte oplysninger:

Validering kan anvendes på individuelle celler i en matrix, som i dette eksempel, hvor regulære udtryksvalideringer sikrer, at hver post er et korrekt formateret amerikansk telefonnummer inklusive områdenummer.

Download
For at downloade ovenstående eksempel skal du klikke på følgende link: LS3_Validation_tests.zip.
Valideringsligninger
Oversigt
Nogle gange har du brug for tilpasset validering, som ikke kan opnås ved hjælp af de traditionelle min/max-kriterier. Til dette skal du bruge mulighederne em_validation_q og em_validation_sq, som lader dig konstruere komplekse valideringsligninger på henholdsvis spørgsmåls- og underspørgsmålsniveau.
EM-funktioner demonstreret
- em_validation_q - dette er en ligning, der bestemmer, om hele spørgsmålet er gyldigt
- em_validation_q_tip - dette er meddelelsen, der skal vise, hvis spørgsmålet ikke opfylder em_validation_q-kriterierne
- em_validation_sq - dette er ligningen, der bestemmer, om hvert underspørgsmål (arraycelle) er gyldigt
- em_validation_sq_tip - dette er meddelelsen, der skal vises, hvis der er nogen af underspørgsmålene er ugyldige.
Generelt, når em_validation_sq bruges, hvis en celle er ugyldig, bliver baggrundsfarven for den pågældende celle rød for at angive, at der er en fejl.
Skærmbilleder

Dette spørgsmål sikrer, at du indtaster dine børns alder i faldende rækkefølge ved at anvende denne valideringsligning:
q1_sq1 >= q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4

I eksemplet nedenfor sikrer valideringen, at der ikke besvares mere end 3 spørgsmål på en given række ved at anvende denne valideringsligning:
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= 3) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= 3) && (sum(Test_C_1, Test_C_4, Test_C_4, Test_C_4, Test_C_4) = 3)
Du kan også skrive dette som følger, LimeSurvey konverterer det automatisk ved kørsel til det ovenfor anførte udtryk.
(sum(self.sq_A) <= 3) && (sum(self.sq_B) <= 3) && (sum(self.sq_C) <= 3)

Download
For at downloade undersøgelseseksemplet brugt i ovenstående eksempler skal du klikke på følgende link: ls2_test_em_sq_validation.lss.
Relevans for underspørgsmål
Oversigt
Dette viser, hvordan array_filter og valideringskriterier kan interagere. For valideringer, der gælder for summer, tages der kun hensyn til relevante (synlige) værdier.
EM-funktioner demonstreret
Den viser også dynamisk rapportering af antallet af besvarede spørgsmål i kernespørgsmålene.
Screenshots
Changing the number of visible rows dynamically changes the sum. Marking a subquestion as being irrelevant doesn't clear its value. Rather, if it is irrelevant, its values don't contribute to any equation.


Note what happens when we check the "Fifth subquestion" for the first question "Which rows should appear below". Note that the sum for the second "Enter some numbers" question is now 5. Even though subquestion 5 for that question still has the value 14 (e.g., if you un-check the fifth subquestion, you will see the value of 14 again), that value does not contribute to the sum since it is currently irrelevant. All irrelevant data is cleared (NULLed in the database) on submit, but it stays available on the page in case users want or need to change their minds about answers.

Download
To download our example, click here: ls2_subquestion_relevance.lss.
Using Comma as Radix Separator (Decimal Point)
Overview
The ExpressionScript ensures that only valid numbers can be entered into numeric fields. If you enter an invalid number, you will be warned that something is wrong (e.g., in the case of the fruity theme, the whole question is "red-ed").
Note that the numeric values are always converted to using a period as the radix separator within the database. In this way, the statistical analyses will work appropriately.
To change the radix separator, access the Text elements options located under the Settings tab, and look for the decimal mark functionality.

Question Types Using Radix Separator
- Numerical input [N]
- Multiple numerical input [K]
- Array (Numbers) [:]
- Array (Texts) [;], when using the numbers_only attribute
- List (radio) [L], when using the other_numbers_only attribute
- Short free text [S], when using the numbers_only attribute
- Multiple short text [Q], when using the numbers_only attribute
- Multiple choice [M], when using the other_numbers_only attribute
- Multiple choice with comments [P], when using the other_numbers_only attribute
Screenshots
You may note in the below screenshots that comma can be used as a radix separator.

Download
To download the above example, click on the following link: ls2_comma_as_radix_separator.lss.
Randomization Groups
Overview
This survey demonstrates how to make use of the random_group attribute.
If this attribute is used, each time you start the survey, the question order is randomized. However, once the survey is started, the randomization order remains fixed, even if you change languages.
Screenshots
Let's check together the below example. The first random question on the page will either be Q1 , Q4, or Q7. The second randomized question on the page will either be Q2, Q5, or Q8.

Here is the randomization generated the first time I tested this survey.

A different randomization was generated the second time I tested the survey.

But, when I switched to French (without re-starting the survey), the randomization order remained intact.

Download
To download the above example, click on the following link: Randomization_Group_Test.lss
Randomly Ask One Question Per Group
Overview
This survey shows how you can configure a survey to randomly display one question per group. In it, there are 5 groups of 6 questions each. At the outset, in Group 0, five hidden Equation questions, called ask1-ask5, are populated. Each one has the value of {floor(rand(1,6.9999))} in the question text field, which means that the variables ask1-ask5 will each have a value between 1 and 6. Then, each question in the group has a relevance equation like "ask1==N" where N is the Nth question in the group (so the third question in group 1 has the relevance equation "ask1==3").
This survey works equally well in survey-at-a-time, group-by-group, and question-by-question modes. Since the randomization is set in the first group, and that group is effectively hidden (since all of the ask1-ask5 questions are hidden), the randomization stays the same for the subject; but each different subject will have a distinct randomization.
Features Demonstrated
- Equation question type
- Randomization functions
- Conditional (if) function
Screenshots
This is Group0, which uses the Equation question type to select random values from 1 to 6 for each group (except the last group, which has only 4 questions). Note that the "if()" function first checks whether ask1 has already been set, and if so, uses that value. If the value hasn't been set, then it uses a random value to set the value of ask1.

This Group shows how the variable (ask4) from Group0 is used to control which question is visible within the fourth group.

Download
To download the above survey example, click here: Random questions within a group survey example.
Randomly Ask A Specific Number Of Questions In A Group (a subset of the questions)

Overview
This survey shows how to ask a random subset of questions in a group. For example, show 5 random questions out of 10 questions located within a group.
The survey has one group containing 10 questions. All questions are assigned the same randomization group name. As a result, they will be displayed in a random order on page load. Each question is given a relevance equation that the sum of the "relevanceStatus" of all other questions in the group is less than the number of questions you want to show. Since relevanceStatus is assigned as questions are rendered, this effectively totals the number of preceding questions.
So, in our 5 out of 10 example, the equation for Q1 would be:
sum(Q2.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
For Q2, it would be:
sum(Q1.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
And so on...
Features Demonstrated
Download
To download the above example, click on the following link: Random 5 out of 10 survey example.
Rating User-Entered List of Products
Overview
The below example shows how you can ask users to list a set of products that interest them, and then have them rate those products.
ES Features Demonstrated
- Tailoring answers - when rating products, the labels come from the comment field of the preceding multiple choice question
- Tailoring scales - many advanced questions options, like scale headings, can also be tailored.
Screenshots
This image shows that since only products 1,3, and 5 were selected, only those 3 are displayed (using the array_filter attribute). Moreover, the row labels in the second question are either the product numbers (if nothing is entered into the comment field) or the contents of the comment fields.

This image shows how the tailored answers are specified:

Here is the Show Logic File for that question, which lets us verify that the conditional logic works as desired (e.g., to see whether there are any syntax errors):

The next image shows a group in which you specify a 5 point rating scale (Options 1-5), the title of the scale, and the products you want to rate. The final question shows that each of the parts of the array question can be tailored:

The next image shows the logic file view of the last question. As you can observe, the subquestions, answers, and scale headers can be tailored.

Download
To download the survey example from above, click on the following link: Rating user-entered list of products survey example.