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.

Kommentare

-- Kommentar --[[ Mehrzeiliges Kommentar ]]

Variablen

local x = 2 x, y = 2, 4

Tabellen / Arrays

t = {} t = { a = 1, b = 2 } t.a = function() ... end -- Tabellen kƶnnen auch Funktionen enthalten t = { ["hello"] = 200 } t.hello -- Arrays sind auch Tabellen: array = { "a", "b", "c", "d" } setVariableValue("v_1",array[2]) -- "b" setVariableValue("v_2",#array) -- gibt die GrĆ¶ĆŸe des Arrays zurĆ¼ck (hier: 4)

Bedingungen

Schleifen

Funktionen

NĆ¼tzliche globale Funktionen

String API

Math API



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

Beispiele zu repl.it

Ā 

Ā© 2024 Tivian XI GmbH