Google Sheets-Kochbuch: Lambda-Funktionen & Benannte Funktionen
Eine Lambda-Funktion ist eine anonyme Funktion. Sie arbeitet mit den Lambda-Hilfsfunktionen zusammen, und ist die Grundlage für benannte Funktionen. Lambda-Funktionen sind immer dann hilfreich wenn wir mit Arrays arbeiten, also die gleichen Operationen auf eine Vielzahl von Daten anwenden wollen.
Lambda-Funktionen
BearbeitenSyntax:
LAMBDA([Name; …]; Formelausdruck)
- Name steht hier für optionale Namen, die im Formelausdruck verwendet werden können.
- Die LAMBDA-Funktion kann so übrigens gar nicht aufgerufen werden, entweder verwendet man sie in einer Helfer-Funktion, oder in einer benannten Funktion. Es fehlen hier die Werte.
LAMBDA([Name; …]; Formelausdruck)(Wert[; Wert …])
- So wird die Lambda-Funktion mit Werten aufgerufen. Es ist die einzige Funktion in Google-Sheets, die mit zwei runden Klammern aufgerufen werden kann.
- Beispiele für Lambda-Funktionen die mit Werten aufgerufen werden, folgen sofort.
Beispiel 1:
=LAMBDA(wert;wert*2)(A1)
- Dieser Ausdruck entspricht der Eingabe von
=A1*2
- Der Variablen "wert" wird also der Inhalt der Zelle A1 zugewiesen, dann wird die Funktion "wert*2" ausgeführt.
- Dieser Ausdruck entspricht der Eingabe von
Beispiel 2:
=LAMBDA(Wert1;Wert2;(Wert1-Wert2)/Wert2)(A1;B1)
- Dieser Ausdruck entspricht der Eingabe von
=(A1-B1)/B1
- Der Variablen "Wert1" wird also der Inhalt der Zelle A1 zugewiesen, der Variablen "Wert2" der Inhalt der Zelle B1, dann wird die Funktion "(Wert1-Wert2)/Wert2" ausgeführt.
- Dieser Ausdruck entspricht der Eingabe von
Der Aufruf als LAMBDA-Funktion macht hier offensichtlich noch nicht viel Sinn, aber das erschließt sich gleich, wenn wir die gleiche Funktion auf eine Vielzahl von Daten anwenden wollen.
Lambda-Helfer-Funktionen
BearbeitenDie Lambda-Helfer-Funktionen wenden eine anonyme Funktion auf ein Array/mehrere Arrays an. Das kann z.B. ein Zellbereich wie A1:A10
sein.
Map-Funktion
BearbeitenDie Map-Funktion wendet eine Lambda-Funktion auf ein oder mehrere Arrays an. Der Rückgabewert ist ein Array. Verwendet man mehrere Arrays, müssen die Arrays die gleiche Dimension (die gleiche Größe) haben, Listen also z.B. gleich lang sein.
Die Map-Funktion kann für viele Zwecke angewendet werden, wo sonst eine Arrayformula gebraucht wurde.
Syntax:
MAP(Array1; [Array2; …]; LAMBDA([Name; …]; Formelausdruck))
Beispiel 1:
=MAP(A1:A10;LAMBDA(wert;wert*2))
- Hier stehen die Werte also nicht hinter der Lambda-Funktion in runden Klammern, sondern vor der Lambda-Funktion.
- Das entspricht unserem Beispiel 1 von oben.
- Die Lambda-Funktion wird hier nicht nur auf den Wert in Zelle A1 angewendet, sondern auf jeden Wert aus dem Zellbereich A1:A10.
Beispiel 2:
=MAP(A1:A10;B1:B10;LAMBDA(Wert1;Wert2;(Wert1-Wert2)/Wert2))
- Wieder stehen die Werte vor der Lambda-Funktion.
- Die Lambda-Funktion wird also auf den Zellbereich A1:A10 und B1:B10 angewendet.
REDUCE-Funktion
BearbeitenDurchläuft ein Array und man kann jeden einzelnen Arraywert auf einen Ausgangswert (Accumulator) anwenden. Der Rückgabewert ist skalar (also kein Array). Die REDUCE-Funktion kann verwendet werden, um eine iterative Berechnung durchzuführen.
Die REDUCE-Funktion zum Anwenden einer Ersetzungstabelle auf einen Text
Bearbeiten=REDUCE(A2;INDEX(Ersetzungstabelle;0;1);
LAMBDA(_text;_zeichen;
SUBSTITUTE(_text;_zeichen;
OFFSET(_zeichen;0;1))))- Diese Formel führt eine mehrfache Substitution in einem Text (in Zelle A2) durch, wobei die zu ersetzenden Zeichen und ihre entsprechenden Ersatzzeichen in einer separaten, zweispaltigen Tabelle (Ersetzungstabelle) definiert sind. Die Funktion REDUCE wird hier verwendet, um diesen Substitutionsprozess iterativ für jedes Zeichen in der Ersetzungstabelle anzuwenden. Es werden also alle zu ersetzenden Zeichen (Ersetzungstabelle Spalte 1) durch ihre Ersatzzeichen (Ersetzungstabelle Spalte 2) ersetzt.
- Als Beispiel für eine Ersetzungstabelle kann die Ersetzungstabelle dienen. Wegen des Einsatzes der Funktion OFFSET kann keine Arraykonstante als Ersetzungstabelle verwendet werden, es muss sich um einen Zellbezug handeln.
REDUCE(A2;INDEX(Ersetzungstabelle;0;1);LAMBDA(...))
- A2: Dies ist der Ausgangstext, in dem die Substitutionen durchgeführt werden sollen.
- INDEX(Ersetzungstabelle;0;1): Hier wird die erste Spalte der Ersetzungstabelle (die zu ersetzenden Zeichen) als Array an REDUCE übergeben.
- LAMBDA(...): Dies definiert eine anonyme Funktion, die für jedes Element des Arrays (also jedes zu ersetzende Zeichen) ausgeführt wird.
LAMBDA(_text;_zeichen;SUBSTITUTE(_text;_zeichen;OFFSET(_zeichen;0;1)))
- _text: Repräsentiert den aktuellen Wert (Text) in jeder Iteration. Anfänglich ist dies der Wert in A2.
- _zeichen: Repräsentiert das aktuelle Zeichen aus der Ersetzungstabelle, das ersetzt werden soll.
SUBSTITUTE(_text;_zeichen;OFFSET(...))
- SUBSTITUTE: Diese Funktion ersetzt alle Vorkommen eines bestimmten Zeichens in einem Text durch ein anderes.
- _text: Der Text, in dem ersetzt werden soll (der aktuelle Wert in jeder Iteration).
- _zeichen: Das Zeichen, das ersetzt werden soll.
OFFSET(_zeichen;0;1)
- Das Ersatzzeichen rechts vom zu ersetzenden Zeichen.
Vorbereiten der Funktion zur Anwendung als eine benannte Funktion
BearbeitenDie obige REDUCE-Funktion hat mehrere Bezüge auf externe Größen, zum einen auf die Zelle A2, zum anderen auf einen benannten Bereich Ersetzungstabelle. Um sie als benannte Funktion zu verwenden, müssen diese Bezüge entfernt werden. Dazu erstellen wir zunächst eine äußere LAMBDA-Funktion:
=LAMBDA(_text;_table;
REDUCE(_text;INDEX(_table;0;1);LAMBDA(_text;_zeichen;SUBSTITUTE(_text;_zeichen;OFFSET(_zeichen;0;1))))
)(A2;Ersetzungstabelle)- Die beiden externen Bezüge wurden also durch die internen Variablen _text und _table ersetzt.
- Diese Form kann nun als benannte Funktion verwendet werden, nachdem wir sichergestellt haben, dass die Funktion funktioniert.
Byrow
BearbeitenDurchläuft ein Array zeilenweise und kann die Lambda-Funktion auf jede Zeile einzeln anwenden.
Bycol
BearbeitenDurchläuft ein Array spaltenweise und kann die Lambda-Funktion auf jede Spalte einzeln anwenden.
Makearray
BearbeitenErstellt ein Array, ähnlich wie die Sequence-Funktion. Makearray ist allerdings flexibler, da nun ein beliebiger Formelausdruck für die Werte im Array verwendet werden kann.
Scan
Bearbeiten... tbd ...
Benannte Funktionen (Named Functions)
BearbeitenBenannte Funktionen erlauben es, komplizierte Funktionen zu speichern und sie über das Menü wie eingebaute Funktionen abzurufen, ohne dafür in jedem Fall ein Script schreiben zu müssen. Das vereinfacht auch sehr ihre Weitergabe.
Beispielfunktion
BearbeitenMeine Beispielfunktion berechnet das Datum des n-ten Auftreten eines Tages in einem Monat, also z.B. die Frage: Welches Datum hat der vierte Freitag im August 2024?
=LAMBDA(_date;_day;_n;
LET(_result;DATE(YEAR(_date);MONTH(_date);IF(WEEKDAY(_date)>_day;_n*7+_day-WEEKDAY(_date)+1;(_n-1)*7+_day-WEEKDAY(_date)+1));
IF(MONTH(_result)=MONTH(_date);_result;"Es gibt keinen " &_n & ". Tag in diesem Monat."))
)("01.08.2024";6;4)- Die Funktion braucht drei Parameter: das Datum des 1. eines Monats, der Wochentag in numerischem Format 1-7, wobei 1 der Sonntag und 7 der Samstag ist, sowie das n-te Auftreten.
- Für die Erklärung dieser Funktion siehe Rechnen mit Kalenderdaten
Erstellen der benannten Funktion
BearbeitenNachdem sichergestellt ist dass diese Funktion funktioniert, soll sie zu einer benannten Funktion gemacht werden. Dazu rufen wir über das Menü Daten->Benannte Funktionen auf. Im ersten Fenster wählen wir Neue Funktion hinzufügen Im folgenden Fenster geben wir an:
- Funktionsnamen: NTHDAY
- Eine Beschreibung, was die Funktion macht.
- Die Argumentplatzhalter. In meinem Fall sind das _date, _day, _n. Ich habe hier Unterstriche verwendet, um nicht reservierte Funktionsnamen zu verwenden. Man kann die Reihenfolge der Parameter mit der Maus ändern (Hoch- oder Runterschieben).
- Unter Formeldefinition wird dann die eigentliche Formel eingegeben, aber nur die tatsächliche Funktion.
=LET(_result;DATE(YEAR(_date);MONTH(_date);IF(WEEKDAY(_date)>_day;_n*7+_day-WEEKDAY(_date)+1;(_n-1)*7+_day-WEEKDAY(_date)+1));IF(MONTH(_result)=MONTH(_date);_result;"Es gibt keinen " &_n & ". Tag in diesem Monat."))
- Es fehlt also der erste Teil mit dem LAMBDA und der Definition der drei Variablen, sowie die schließende Klammer und das letzte Klammerpaar mit den Werten.
Unter weiteren Details kann man nun Argumentbeschreibungen und Beispielargumente angeben.
Verwenden der benannten Funktion
BearbeitenDie benannte Funktion wird genauso verwendet wie vordefinierte Funktionen.
Die Beispiele auf dieser Seite wurden getestet: 08/2024