...
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.
Expand | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Kommentare
Variablen
Tabellen / Arrays
Bedingungen
Schleifen
Funktionen
Nützliche globale Funktionen
String API
Math API
|
EFS-spezifische Funktionen in LUA-Filtern und LUA-Fragetyp
Info |
---|
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.
...
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.
...
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.
...
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.
...
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.
...
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.
...
id int - Quoten-ID
returns int
getQuotaCurrentValue(id)
Gibt den Ist-Wert der Quote zurück, z. B. setVariableValue("v_1", getQuotaCurrentValue(1)).
...
id int - Quoten-ID
returns int
getQuotaFillingDegree(id)
Gibt den Füllgrad der Quote zurück, z. B. setVariableValue("v_1", getQuotaFillingDegree(1)*100 .. " %").
...
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.
...
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.
...
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.
...
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.
...
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.
...
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.
...
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 -.
...
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
Code Block | ||
---|---|---|
| ||
function Set (list) local set = {} for _, l in ipairs(list) do set[l] = true end return set end local blockedIps = Set { "78.34.112.1", "78.34.112.2", "78.34.112.3" } if blockedIps[remote_addr] then return false else return true end |
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
Code Block | ||
---|---|---|
| ||
local randomRestaurants = { "Indian Curry Basmati House", "Calypso Grillbar", "Rim Kong", "Hayati", "Metzgerei Kremer", "Nakwon", "KuroMaku Poke", "Sushi Ninja", "Vina Asia Express", "485Grad", "Osman Bey" } -- Initialize the randomiser with the current day, use "%y%m%d%H" for hours or "%y%m%d%H%M" for minutes math.randomseed( date("%y%m%d") ) setVariableValue("v_1", randomRestaurants[math.random( #randomRestaurants )]) |
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
Code Block | ||
---|---|---|
| ||
-- pattern for company name setVariableValue("v_10",_G["v_1"]:match("@([%w+%-_]*)%.?"):gsub("^%l", string.upper)) -- pattern for first name setVariableValue("v_11",_G["v_1"]:match("^([%w%-]+)[%._]"):gsub("^%l", string.upper)) -- pattern for last name setVariableValue("v_12",_G["v_1"]:match("[%._]([%w%-]+)@"):gsub("^%l", string.upper)) |
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)
Code Block | ||
---|---|---|
| ||
countries = { [-99]="Unknown", [1]="Satellite Provider", [2]="Other Country", [3]="Andorra", [4]="United Arab Emirates", [5]="Afghanistan", [6]="Antigua and Barbuda", [7]="Anguilla", [8]="Albania", [9]="Armenia", [10]="Angola", [11]="Asia/Pacific Region", [12]="Antarctica", [13]="Argentina", [14]="American Samoa", [15]="Austria", [16]="Australia", [17]="Aruba", [18]="Aland Islands", [19]="Azerbaijan", [20]="Bosnia and Herzegovina", [21]="Barbados", [22]="Bangladesh", [23]="Belgium", [24]="Burkina Faso", [25]="Bulgaria", [26]="Bahrain", [27]="Burundi", [28]="Benin", [29]="Saint Barthelemy", [30]="Bermuda", [31]="Brunei", [32]="Bolivia", [33]="Bonaire, Saint Eustatius and Saba", [34]="Brazil", [35]="Bahamas", [36]="Bhutan", [37]="Bouvet Island", [38]="Botswana", [39]="Belarus", [40]="Belize", [41]="Canada", [42]="Cocos Islands", [43]="Democratic Republic of the Congo", [44]="Central African Republic", [45]="Republic of the Congo", [46]="Switzerland", [47]="Ivory Coast", [48]="Cook Islands", [49]="Chile", [50]="Cameroon", [51]="China", [52]="Colombia", [53]="Costa Rica", [54]="Cuba", [55]="Cape Verde", [56]="Curacao", [57]="Christmas Island", [58]="Cyprus", [59]="Czechia", [60]="Germany", [61]="Djibouti", [62]="Denmark", [63]="Dominica", [64]="Dominican Republic", [65]="Algeria", [66]="Ecuador", [67]="Estonia", [68]="Egypt", [69]="Western Sahara", [70]="Eritrea", [71]="Spain", [72]="Ethiopia", [73]="Europe", [74]="Finland", [75]="Fiji", [76]="Falkland Islands", [77]="Micronesia", [78]="Faroe Islands", [79]="France", [80]="Gabon", [81]="United Kingdom", [82]="Grenada", [83]="Georgia", [84]="French Guiana", [85]="Guernsey", [86]="Ghana", [87]="Gibraltar", [88]="Greenland", [89]="Gambia", [90]="Guinea", [91]="Guadeloupe", [92]="Equatorial Guinea", [93]="Greece", [94]="South Georgia and the South Sandwich Islands", [95]="Guatemala", [96]="Guam", [97]="Guinea-Bissau", [98]="Guyana", [99]="Hong Kong", [100]="Heard Island and McDonald Islands", [101]="Honduras", [102]="Croatia", [103]="Haiti", [104]="Hungary", [105]="Indonesia", [106]="Ireland", [107]="Israel", [108]="Isle of Man", [109]="India", [110]="British Indian Ocean Territory", [111]="Iraq", [112]="Iran", [113]="Iceland", [114]="Italy", [115]="Jersey", [116]="Jamaica", [117]="Jordan", [118]="Japan", [119]="Kenya", [120]="Kyrgyzstan", [121]="Cambodia", [122]="Kiribati", [123]="Comoros", [124]="Saint Kitts and Nevis", [125]="North Korea", [126]="South Korea", [127]="Kuwait", [128]="Cayman Islands", [129]="Kazakhstan", [130]="Laos", [131]="Lebanon", [132]="Saint Lucia", [133]="Liechtenstein", [134]="Sri Lanka", [135]="Liberia", [136]="Lesotho", [137]="Lithuania", [138]="Luxembourg", [139]="Latvia", [140]="Libya", [141]="Morocco", [142]="Monaco", [143]="Moldova", [144]="Montenegro", [145]="Saint Martin", [146]="Madagascar", [147]="Marshall Islands", [148]="Macedonia", [149]="Mali", [150]="Myanmar", [151]="Mongolia", [152]="Macao", [153]="Northern Mariana Islands", [154]="Martinique", [155]="Mauritania", [156]="Montserrat", [157]="Malta", [158]="Mauritius", [159]="Maldives", [160]="Malawi", [161]="Mexico", [162]="Malaysia", [163]="Mozambique", [164]="Namibia", [165]="New Caledonia", [166]="Niger", [167]="Norfolk Island", [168]="Nigeria", [169]="Nicaragua", [170]="Netherlands", [171]="Norway", [172]="Nepal", [173]="Nauru", [174]="Niue", [175]="New Zealand", [176]="Oman", [177]="Panama", [178]="Peru", [179]="French Polynesia", [180]="Papua New Guinea", [181]="Philippines", [182]="Pakistan", [183]="Poland", [184]="Saint Pierre and Miquelon", [185]="Pitcairn", [186]="Puerto Rico", [187]="Palestinian Territory", [188]="Portugal", [189]="Palau", [190]="Paraguay", [191]="Qatar", [192]="Reunion", [193]="Romania", [194]="Serbia", [195]="Russia", [196]="Rwanda", [197]="Saudi Arabia", [198]="Solomon Islands", [199]="Seychelles", [200]="Sudan", [201]="Sweden", [202]="Singapore", [203]="Saint Helena", [204]="Slovenia", [205]="Svalbard and Jan Mayen", [206]="Slovakia", [207]="Sierra Leone", [208]="San Marino", [209]="Senegal", [210]="Somalia", [211]="Suriname", [212]="South Sudan", [213]="Sao Tome and Principe", [214]="El Salvador", [215]="Sint Maarten", [216]="Syria", [217]="Swaziland", [218]="Turks and Caicos Islands", [219]="Chad", [220]="French Southern Territories", [221]="Togo", [222]="Thailand", [223]="Tajikistan", [224]="Tokelau", [225]="East Timor", [226]="Turkmenistan", [227]="Tunisia", [228]="Tonga", [229]="Turkey", [230]="Trinidad and Tobago", [231]="Tuvalu", [232]="Taiwan", [233]="Tanzania", [234]="Ukraine", [235]="Uganda", [236]="United States Minor Outlying Islands", [237]="United States", [238]="Uruguay", [239]="Uzbekistan", [240]="Vatican", [241]="Saint Vincent and the Grenadines", [242]="Venezuela", [243]="British Virgin Islands", [244]="U.S. Virgin Islands", [245]="Vietnam", [246]="Vanuatu", [247]="Wallis and Futuna", [248]="Samoa", [249]="Yemen", [250]="Mayotte", [251]="South Africa", [252]="Zambia", [253]="Zimbabwe", [254]="Kosovo", [255]="Serbia and Montenegro", [256]="Netherlands Antilles" } setVariableValue("v_1",countries[_G["participant_country"]]) |
Aktuelle GMT-Zeit abrufen
Dieser Code gibt die serverseitige Zeit in GMT zurück und kann für datumsbezogene Berechnungen verwendet werden.
Beispielcode
Code Block | ||
---|---|---|
| ||
setVariableValue("v_1", date("!%H %M")) |
Vergleich der Häufigkeit der abgeschlossenen Teilnahmen
Die folgende alternative Filterbedingung prüft, welche von mehreren Möglichkeiten die Teilnehmer bisher bevorzugt haben:
...
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
Code Block | ||
---|---|---|
| ||
-- configuration vars={"v_1","v_2","v_3"} relevant_filter_vars={"v_1","v_2"} -- no need to change anything below counts={} max=nil max_var=nil for k,v in ipairs(vars) do local count=count(v) if max==nil or max<count then max_var=v max=count end end for k,v in pairs(relevant_filter_vars) do if v==max_var then return true end end return false |
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.
...
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
Code Block | ||
---|---|---|
| ||
sum=0 for i=135,173 do if _G["v_"..i]>0 then sum=sum+1 end end |
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.
...
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.
...