Gewusst-wie: LUA-Skripte in EFS
LUA-Skripte in EFS Survey-Filtern und dem LUA-Fragetyp bieten Benutzern mit Programmierkenntnissen mehr FlexibilitƤt und Komfort. Der LUA-Fragetyp, der sich in "Erweitert" befindet, bietet eine effiziente Skriptschnittstelle zur Umfrageumgebung, die es Benutzern ermƶglichtĀ Variablen der Umfrage neu zu kodieren, komplexe Berechnungen durchzufĆ¼hren, Benutzereingaben zu Ć¼berprĆ¼fen oder zu verarbeiten und erweiterte Quotenberechnungen durchzufĆ¼hren.Ā Der Fragetyp stellt zwei Codeboxen zur VerfĆ¼gung, die erste wird vor dem Senden der Seite an den Teilnehmer ausgefĆ¼hrt, die zweite Codebox wird ausgefĆ¼hrt, wenn der Benutzer die Seite mit dem LUA-Fragetyp absendet. Sie kƶnnen auch eigene Funktionsbibliotheken aus der Medienbibliothek einbinden (globale oder projektspezifische, Textdateien mit der Erweiterung .txt oder .lua), so dass Sie hƤufig verwendete Funktionen projektĆ¼bergreifend wiederverwenden kƶnnen. Sie kƶnnen die Funktion "Frage ausblenden, wenn ..." verwenden, umĀ nur bei bestimmter Bedingung das Skript auszufĆ¼hren, und Sie kƶnnen festlegen, ob das Skript bei jedem Aufruf der Seite oder nur einmal ausgefĆ¼hrt werden soll (z. B. bei Verwendung eines Page-Triggers oder des ZurĆ¼ck-Buttons).
Viele Filter, die bei der Arbeit mit EFS-Standardfilterdefinitionen oder alternativen Filterbedingungen viel Aufwand erfordern, lassen sich mit den LUA-Filtern leichter realisieren. So steht z. B. eine Funktion zur VerfĆ¼gung, die die Behandlung von System-Missings unter Filterbedingungen vereinfacht. Wirklich komplexe Filterbedingungen kƶnnen leichter abgebildet werden.
Dieses Handbuch stellt Beispiele fĆ¼r hƤufige Szenarien bei der Programmierung mit LUA in EFS vor und soll keine allgemeine EinfĆ¼hrung in LUA sein, fĆ¼r die es mehrere gute Ressourcen gibtĀ [https://www.lua.org/manual/5.1/, https://www.lua.org/pil/contents.html].
EFS Survey verwendet LUA Version 5.1 in seinen LUA-Filtern und LUA-Fragetypen und bietet Zugriff auf fast alle Standard-LUA-Bibliotheken. Aus SicherheitsgrĆ¼nden sind die Funktionen dofile, load, loadfile, print, require, rawequal, rawget und rawest und die os-Bibliothek in der LUA-Umgebung nicht verfĆ¼gbar. Die Funktionen os.date und os.time stehen als date() und time() zur VerfĆ¼gung. Die Funktion mb_strlen ist als string.len verfĆ¼gbar.
Der Zugriff auf die Lrexlib ist mƶglich und ermƶglicht erweiterte Regular Expressions innerhalb der LUA-Umgebung zum Suchen, Validieren oder Extrahieren von Benutzereingaben, rex_pcre.find (v_1, "\\bhate") sucht beispielsweise nach Wƶrtern, die mit "hate" beginnen und gibt false zurĆ¼ck, wenn keine Ćbereinstimmung gefunden wurde. Die vollstƤndige Dokumentation zu rex_pcre finden Sie im Lrexlib Referenzhandbuch.
Survey-Variablen sind innerhalb der LUA-Umgebung Ć¼ber die globale Tabelle _G zugƤnglich. Die meisten Variablen sind daher Ć¼ber diese globale Tabelle zugƤnglich, z. B. _G["v_1"] oder _G["code"]. Umfragevariablen (v_xxx) werden ebenfalls als regulƤre Variablen in die LUA-Sandbox eingespeist, daher _G["v_1"] == v_1.
Im nƤchsten Abschnitt finden Sie eine Liste von EFS-spezifischen LUA-Funktionen, die eine zusƤtzliche Manipulation oder Abfrage von Umfragevariablen ermƶglichen.
LUA Cheat Sheet
Dies ist eine kurze Ćbersicht der Syntax und hƤufig verwendeter Befehle in LUA, die vollstƤndige LUA Dokumentation finden Sie unter https://www.lua.org/manual/5.1/ und https://www.lua.org/pil/contents.html. EFS-spezifische Funktionen finden Sie im nƤchsten Abschnitt.
EFS-spezifische Funktionen in LUA-Filtern und LUA-Fragetyp
Bitte beachten Sie, dass Loop Variablen nicht in der LUA Umgebung unterstĆ¼tzt werden.
setVariableValue(varName, varValue)
Weist den Wert der angegebenen v_, c_ oder p_ Variable zu. Die Variable kann an beliebiger Stelle im Fragebogen ein- oder ausgeblendet sein. Der LUA-Fragetyp selbst stellt Variablen zur VerfĆ¼gung, die zur Speicherung von Informationen verwendet werden kƶnnen.
Datentypen
varName string - Variablenname
varValue string - Wert
setMasterDataValue(varName, varValue)
Diese Funktion wird nur bei Panel- und Stammdatenumfragen ausgefĆ¼hrt. Sie weist den Wert der angegebenen Stammdatenvariablen des aktuellen Teilnehmers zu oder Ć¼berschreibt ihn und speichert die Variable in der Datenbank.
Datentypen
varName string -Ā Variablenname
varValue string -Ā Wert
setQuestionOutput(text)
Setzt die Ausgabe der LUA-Frage. Diese Funktion sollte nur einmal verwendet werden, da nachfolgende Aufrufe frĆ¼here Werte Ć¼berschreiben, auĆerdem erzeugt diese Funktion nur eine Ausgabe wƤhrend der AusfĆ¼hrung des Codes beim Rendern der Frage.
Datentypen
text stringĀ - Text, der in der Lua-Frage ausgegeben werden soll
remove_sys_miss(varValue)Ā
Konvertiert das System-Missing (Code -77) zu 0, um arithmetische Operationen zu erleichtern. Wenn Sie beispielsweise den LUA-Filter "return v_1+v_2+v_3>10" verwenden, werden System-Missings (Code -77) die Berechnungen negativ beeinflussen, daher kann "return remove_sys_miss(v_1)+remove_sys_miss(v_2)+remove_sys_miss(v_3)>10" verwendet werden, um dieses Problem zu vermeiden.
Datentypen
varValue mixed - die Variable, die verarbeitet werden soll, z. B.Ā remove_sys_missing(_G["v_1"])
returnsĀ int
get_range_count(values, min_code, max_code)
Gibt zurĆ¼ck, wie oft die angegebenen Werte in dem von min_code und max_code angegebenen Bereich liegen.Ā So ist beispielsweise der BedingungsrĆ¼ckgabewert get_range_count({v_1,v_2,v_3,v_3,v_4,v_5},1,3)>2 wahr, wenn der Teilnehmer in den ersten drei Kategorien der durch v_1-v_5 dargestellten Matrixfrage mehr als zweimal geantwortet hat.
Datentypen
values arrayĀ - Liste der Variablen, z. B.Ā {v_1, v_2, v_3, v_4, v_5}
min_code mixed
max_code mixed
returns int
getQuotaDebitValue(id)
Gibt den Soll-Wert der Quote zurĆ¼ck.
Datentypen
id intĀ - Quoten-ID
returns int
getQuotaCurrentValue(id)
Gibt den Ist-Wert der Quote zurĆ¼ck, z. B.Ā setVariableValue("v_1", getQuotaCurrentValue(1)).
Datentypen
id intĀ - Quoten-ID
returns int
getQuotaFillingDegree(id)
Gibt den FĆ¼llgrad der Quote zurĆ¼ck, z. B.Ā setVariableValue("v_1",Ā getQuotaFillingDegree(1)*100 .. " %").
Datentypen
id intĀ - Quoten-ID
returnsĀ double
getQuotaIds()
Gibt eine Liste der verfĆ¼gbaren Quoten-IDs zurĆ¼ck.
Datentypen
returns array
count(condition)Ā
Liefert die Anzahl der Teilnehmer, die der angegebenen Bedingung entsprechen, und kann verwendet werden, um den Teilnehmern Statistiken anzuzeigen oder dynamisch in Filtern zu leiten, abhƤngig von den Antworten der anderen Teilnehmer.Ā WARNUNG! Diese Funktion hat Auswirkungen auf die EFS-Performance und sollte nur bei Umfragen mit geringer Beteiligung verwendet werden. FĆ¼r Quotierungen verwenden Sie bitte die in EFS integrierte QuotenfunktionalitƤt, da diese fĆ¼r diese Aufgabe effizienter ist.
Datentypen
conditionĀ stringĀ - bedingter Ausdruck, z. B. (v_1=1 AND v_2=2)
returns int or bool
in_list(list_id)
PrĆ¼ft, ob das aktuelle list_element auch in der angegebenen Liste enthalten ist.
Datentypen
list_id stringĀ - Id of a list, e.g. "l_2"
returns bool
is_repeated_participation()
Diese Funktion prĆ¼ft, ob der Teilnehmer bereits an der Umfrage teilgenommen hat, und ist nur bei Panelbefragungen (PA und MD) anwendbar.
Datentypen
returns int, 0 if false or 1 if true
is_assigned_in_or_below(check_metaname, metanames)
PrĆ¼ft, ob der Teilnehmer Teil der angegebenen Einheiten oder Untereinheiten in der Orgstruktur des ES-Projekts ist. Gilt nur fĆ¼r die Mitarbeiterbefragung.
Datentypen
check_metaname stringĀ - Metaname
metanames arrayĀ - Liste der Metanamen, die dem Teilnehmer zugerwiesen sind
returns bool
is_assigned_in(check_value, codes)
PrĆ¼ft, ob der Metanamencode des Teilnehmers den angegebenen Unit-Metanamen (Array von Codes) zugeordnet ist.Ā Gilt nur fĆ¼r die Mitarbeiterbefragung.
Datentypen
check_valueĀ stringĀ - Metaname
codesĀ arrayĀ - Code-Liste
returns bool
is_assigned_in_branch(check_metaname, metanames)
PrĆ¼ft, ob der Teilnehmer in einem Teil des angegebenen Einheitenzweiges zugeordnet ist.Ā Gilt nur fĆ¼r die Mitarbeiterbefragung.
Datentypen
check_metaname stringĀ - Metaname
metanames arrayĀ - Liste der Metanamen, die dem Teilnehmer zugewiesen sind
returns bool
check_character_filter_any(needle, haystack)
ĆberprĆ¼ft, ob sich die Needle-Zeichenkette in der Haystack-Liste von Zeichenketten befindet. Zeichenketten in Haystack kƶnnen folgendermaĆen voneinander getrennt werden: |, ",", ; oder -.
Datentypen
needleĀ string
haystackĀ string
returns bool
date([format [, time]])
Ersetzt os.date() und gibt eine Zeichenkette oder eine Tabelle zurĆ¼ck, die das Datum und die Uhrzeit enthƤlt (formatiert in Ćbereinstimmung mit dem vorhandenen Zeichenkettenformat). Weitere Informationen finden Sie unter os.date documentation.
time([table])
Ersetzt os.time() und gibt beim Aufruf ohne Argumente die aktuelle Zeit zurĆ¼ck. Alternativ werden Datum und Uhrzeit zurĆ¼ckgegeben, die in der vorhandenen Tabelle angegeben sind. Weitere Informationen finden Sie unter os.time documentation.
Beispiele fĆ¼r LUA in EFS
Sperren von bestimmten IPs vom Zugriff auf eine Umfrage
Wenn Sie eine Ć¼berschaubare Liste von IPs haben, die Sie fĆ¼r den Zugriff auf Ihre Umfrage ausschlieĆen mƶchten, kƶnnen Sie einen LUA-Filter verwenden, um diese Teilnehmer auszusortieren. Dieser Beispielcode blockiert die IPs 78.34.112.1, 78.34.112.2 und 78.34.112.3 und die Liste kann durch zusƤtzliche kommagetrennte IPs erweitert werden. Das letzte Element sollte kein Komma hinter sich haben.
Beispielstruktur
Quelltext
Ein zufƤllig ausgewƤhltes Element des Tages allen Teilnehmern zeigen
Selektiert einmal tƤglich, stunden- oder minutenweise ein zufƤlliges Element aus einer Liste und speichert es in der Variable v_1 fĆ¼r jeden Teilnehmer in der definierten Zeit. Die Funktion math.randomseed setzt die Zufallszahl fĆ¼r die random-Funktion, wird immer die gleiche Zahl verwendet, so wird auch immer der gleiche Zufallswert zurĆ¼ckgegeben. Um die GrƶĆe eines Arrays zu erhalten, setzen Sie # vor den Namen des Arrays, z.B. #randomRestaurants.
Quelltext
Ermitteln von Vorname, Nachname und Firmenname aus einer E-Mail-Adresse.
Dieses Beispiel nimmt die in v_1 gespeicherte E-Mail-Adresse und weist den Variablen v_10, v_11 und v_12 den Firmen-, Vor- und Nachnamen zu. Dies funktioniert bei E-Mail-Aliasen mit firstname.lastname@company.tld oder firstname_lastname@company.tld als Format. Wenn der Vor- oder Nachname nicht erkannt wird, wird der jeweiligen Variable kein Wert zugewiesen.Ā Ā
Quelltext
Auflƶsen des participant_country Codes
Wenn Sie in den Projekteigenschaften der Umfrage die Einstellung "Standort der Teilnehmer anhand der IP-Adresse ermitteln" aktiviert haben, speichert EFS den Code des Landes der Teilnehmer in der Variable participant_country. Derzeit gibt es keine Mƶglichkeit, diese Variable in eine andere Variable mit dem Label des Landes zu rekodieren. Mit dem Beispielcode wird der Code in einem Array nachgeschlagen und die Bezeichnung des Landes in v_1 gespeichert. Dies kann verwendet werden, um ein Textfeld vorab auszufĆ¼llen, wenn Sie nach dem Standort eines Benutzers fragen, der Beispielcode kann angepasst werden, um participant_country Codes mit Codes eines Auswahlfeldes fĆ¼r die Vorselektion abzugleichen.
Quelltext (aufklappen)
Aktuelle GMT-Zeit abrufen
Dieser Code gibt die serverseitige Zeit in GMT zurĆ¼ck und kann fĆ¼r datumsbezogene Berechnungen verwendet werden.
Beispielcode
Vergleich der HƤufigkeit der abgeschlossenen Teilnahmen
Die folgende alternative Filterbedingung prĆ¼ft, welche von mehreren Mƶglichkeiten die Teilnehmer bisher bevorzugt haben:
(count['v_1 = 1'] > count['v_2 = 1'] ) AND (count['v_1 = 1'] > count['v_3 = 1'] ) ORĀ (count['v_2 = 1'] > count['v_1 = 1'] ) AND (count['v_2 = 1'] > count['v_3 = 1'] )
Wenn zum Zeitpunkt, an dem ein Teilnehmer den Filter passiert, v_1 oder v_2 hƤufiger ausgewƤhlt wurden, ist die Filterbedingung erfĆ¼llt.
Wenn v_3 hƤufiger ausgewƤhlt wurde, gilt die Bedingung nicht fĆ¼r den aktuellen Teilnehmer.Ā
Die Verwendung von LUA anstelle der alternativen Filterfunktion hat mehrere Vorteile:
Geschwindigkeit: Jedes count belastet den Server. In der obigen alternativen Filterbedingung werden counts fĆ¼r dieselbe Variable wiederholt ausgefĆ¼hrt. In der unteren LUA-Bedingung ist fĆ¼r jede Variable nur eine ZƤhlanforderung erforderlich.
Kurz und Ć¼bersichtlich: Je mehr Variablen zu prĆ¼fen sind, desto lƤnger und verwirrender wird die alternative Filterbedingung. Im untenstehenden LUA-Filter werden dem Abschnitt "Konfiguration" einfach zusƤtzliche Variablen hinzugefĆ¼gt.
Einfachere Wartung und Konfiguration:
āĀ Wenn Sie Ćnderungen vornehmen, mĆ¼ssen Sie lediglich die beiden Arrays im Abschnitt "Konfiguration" Ƥndern.
āĀ Nicht-Programmierer kƶnnen die Bedingung wiederverwenden, indem sie diese einfach durch Kopieren und EinfĆ¼gen und ein paar kleine Ćnderungen Ć¼bernehmen.
Quelltext
Vergleich von Antwortmustern
Der Filter prĆ¼ft, ob die Summe der Antworten in einem ersten Zweig gleich der Summe der Antworten in einem zweiten Zweig ist.Ā Im folgenden Beispiel wird aus GrĆ¼nden der KĆ¼rze nur eine dieser Summen gebildet. Die Umfrage enthƤlt Variablen im Bereich v_135 bis v_173.
Die in der alternativen Filterbedingung verwendete Syntax ( v_x > 0 ? 1 :0) stellt sicher, dass Verstecke und unbeantwortete Elemente angemessen berĆ¼cksichtigt werden:
Wenn der Teilnehmer v_x > 0 beantwortet hat. Mit v_x > 0 ? 1 wird der Wert einheitlich auf = 1 gesetzt.
Hat der Teilnehmer ein Element nicht gesehen oder nicht beantwortet, d.h. v_x kleiner oder gleich 0, wird der entsprechende Faktor auf = 0 gesetzt, da System-Missings, wie z.B. -77, eine korrekte Berechnung der Summe verhindern.
(( v_135 > 0 ? 1 :0) + ( v_136> 0 ? 1 :0) + ( v_137 > 0 ? 1 :0) + ( v_138 > 0 ? 1 :0) +( v_139 > 0 ? 1 :0) +( v_140 > 0 ? 1 :0) + ( v_141 > 0 ? 1 :0) + ( v_142 > 0 ? 1 :0) + ( v_143> 0 ? 1 :0) + ( v_144 > 0 ? 1 :0) + ( v_145 > 0 ? 1 :0) + ( v_146 > 0 ? 1 :0) + ( v_147 > 0 ? 1 :0) + ( v_148 > 0 ? 1 :0) + ( v_149 > 0 ? 1 :0) + ( v_150 > 0 ? 1 :0) + ( v_151 > 0 ? 1 :0) +( v_152 > 0 ? 1 :0) +( v_153 > 0 ? 1 :0) +( v_154 > 0 ? 1 :0) +( v_155 > 0 ? 1 :0) +( v_156 > 0 ? 1 :0) +( v_157 > 0 ? 1 :0) +( v_158 > 0 ? 1 :0) +( v_159 > 0 ? 1 :0) +Ā ( v_160 > 0 ? 1 :0) + ( v_161 > 0 ? 1 :0) + ( v_162 > 0 ? 1 :0) + ( v_163 >Ā 0 ? 1 :0) + ( v_164 > 0 ? 1 :0) +( v_165 > 0 ? 1 :0) +( v_166 > 0 ? 1 :0) +( v_167> 0 ? 1 :0) +( v_168 > 0 ? 1 :0) +( v_169> 0 ? 1 :0) + ( v_170 > 0 ?Ā 1 :0) +( v_171 > 0 ? 1 :0) +( v_172 > 0 ? 1 :0) +( v_173 > 0 ? 1 :0))Ā [...etc]
Mit LUA kann dies viel einfacher erreicht werden, indem eine for-Schleife erstellt und ein ZƤhler im Bereich von 135 bis 173 Ć¼bergeben wird, alternativ kann der for-Schleife ein Array von spezifischen Variablen-IDs zugefĆ¼hrt werden.
Quelltext
Mein Code funktioniert nicht, was soll ich tun?
ĆberprĆ¼fen Sie zunƤchst, ob im UmfragemenĆ¼ Triggerfehler gemeldet wurden, EFS zeigt den Umfrageteilnehmern in der Befragung keine LUA-Fehler an. Sie kƶnnen auch im MenĆ¼ Test und Validierung -> ProjektprĆ¼fung, auf Fehler in "Fehler wƤhrend des Umfragedurchlaufs" klicken, um eine Liste aller Triggerfehler in Ihrer Umfrage zu erhalten. ĆberprĆ¼fen Sie auch den AusfĆ¼hrungszeitpunkt des LUA Codes an, ob dieser beim Laden der Seite oder erst beim Absenden der Seite verarbeitet wird und ob alle benƶtigten Variablen beim AusfĆ¼hren des LUA Codes bereits vom Teilnehmer ausgefĆ¼llt wurden.
Es empfiehlt sich hartnƤckige Fehler in externen LUA-Sandboxen zu debuggen, z.B. online unter repl.it oder in einer lokalen LUA 5.1-Sandbox auf Ihrem Computer. Sie mĆ¼ssen alle EFS-Variablen oder EFS-spezifischen Funktionen in der externen LUA-Sandbox anlegen, siehe Beispiel am Ende dieser Seite.
Bitte beachten Sie, dass das EFS-Supportteam Ihnen nicht bei der Fehlerbehebung Ihres LUA-Codes helfen kann.
NĆ¼tzliche LUA-Ressourcen
Programming in LUA 5.0,Ā kostenlos fĆ¼r den persƶnlichen Gebrauch
Repl.itĀ bietet eine komfortable LUA 5.1 Online-Umgebung zum Schreiben und Debuggen von LUA-Code in einer kontrollierten Arbeitsumgebung. Einige EFS-Funktionen kƶnnen durch Umschreiben emuliert werden, siehe Beispiel unten.
Beispiele zu repl.it
Ā
Ā© 2024 Tivian XI GmbH