Google Sheets-Kochbuch: Schleifen


... in Bearbeitung ...

Hier betrachten wir Schleifen in Google Sheets ohne die Verwendung von JavaScript, sondern nur mit "normalen" Funktionsaufrufen. In Google Sheets erzeugen wir die Schleifen for und foreach mit den LAMBDA-Hilfsfunktionen REDUCE oder SCAN. REDUCE gibt einen einzelnen Wert zurück, den Akkumulator. SCAN erzeugt ein Array (das bei Bedarf mit JOIN zu einem einzelnen String-Wert verbunden werden kann).

Der LAMBDA-Teil enthält den eigentlichen Code, der in der Schleife ausgeführt wird.

Die for-Schleife wird typischweise als Zählschleife verwendet. "Normalerweise" steht zu Beginn der Schleife die Anzahl der Wiederholungen bereits fest.

  • for (i = Anfang; Abbruch-Bedingung für i; i = i + Schrittweite) { mach etwas }
    • Der Wert von i kann innerhalb der Schleife verändert werden, das sollte aber sehr mit Vorsicht geschehen und nur dann, wenn es keine Alternative gibt (z.B. eine while-Schleife). In der Google Sheets-Variante kann der Wert von i nicht inerhalb der Schleife geändert werden.

In Google-Sheets wird die Logik hinter der for-Schleife anders erzeugt. Statt der Initialisierung und der Veränderung von i wird dieser Teil durch SEQUENCE erzeugt (oder durch MAKEARRAY oder durch ein Array-Literal oder durch eine Liste). SEQUENCE kommt dem typischen i++ aber am nächsten. SEQUENCE hat eine Obergrenze von 10.000.000 (zehn Millionen) Zeilen bzw. Spalten. Bei so großen Zahlen wird der Vorgang außerdem sehr langsam. Die Schleife kann maximal 199991 mal ausgeführt werden, bei größeren Zahlen bricht die Berechnung wegen des Erreichens von Beschränkungen ab.

In Pseudocode:

  • =REDUCE(0;SEQUENCE(Anzahl;1;Anfang;Schrittweite);LAMBDA(accu;i;mach etwas))
    • Hier erzeugt die SEQUENCE-Funktion ein Array mit "Anzahl" Zeilen. In der Lambda-Funktion kann der Wert von i verwendet werden, das muss aber natürlich nicht sein. Fangen wir bei 1 an und benötigen die Standardschrittweite von 1, kann die SEQUENCE-Funktion vereinfacht werden.

Beispiel:

  • =REDUCE(0;SEQUENCE(10);LAMBDA(accu;i;accu + i))
    • Summiert die Zahlen 1 bis 10.
    • Die SEQUENCE läuft von 1 bis 10, der Startwert ist 0.

Vergleich von for-Schleifen in C# mit der Google Sheets Variante:

  • for (int i = 0; i < 4; i++) { Console.Write(i); }
    • =REDUCE("";SEQUENCE(4;1;0;1);LAMBDA(accu;i;accu & i))
      • Der ausgegebene String ist in beiden Fällen "0123".
  • for (int i = 1; i <= zahl; i++) { if (zahl % i == 0) { Console.Write(i + " "); } }
    • =REDUCE("";SEQUENCE(zahl);LAMBDA(accu;i;IF(MOD(zahl;i)=0;accu & i & " ";accu)))
      • Dies ist eine (sehr umständliche und überflüssig rechenintensive Methode) die Teilermenge einer Zahl zu ermitteln. In den Platzhalter "zahl" muss eine konkrete Zahl eingesetzt werden.

Es gibt (meines Wissens) keine Möglichkeit, die Schleife abzubrechen.

Die for each-Schleife macht etwas wie:

  • foreach (element in liste) { mach etwas }

In Pseudocode:

  • =REDUCE(init;liste;LAMBDA(akkumulator;element;mach etwas))
    • Die REDUCE-Funktion durchläuft jedes Element der Liste. Im Akkumulator wird das Ergebnis gespeichert. Am Ende wird der Akkumulator ausgegeben.
  • =SCAN(init;liste;LAMBDA(akkumulator;element;mach etwas))
    • Die SCAN-Funktion durchläuft jedes Element der Liste. Jedes Zwischenergebnis wird ausgegeben (in einer neuen Zeile).

Beispiele:

  • =REDUCE(0;A1:D1;LAMBDA(accu;element;accu+element))
    • Addiert die Elemente im Bereich A1:D1 und gibt das Ergebnis aus.
  • =SCAN("Wanze";{"";"e";"z";"n";"a";"W"};LAMBDA(accu;element;SUBSTITUTE(accu;element;"")))
    • Das Ergebnis ist eine Liste mit den Zeichenketten "Wanze" "Wanz" "Wan" "Wa" "W" " ".

Für ein etwas fortgeschritteneres Beispiel einer REDUCE-Funktion (Anwendung einer Ersetzungstabelle auf einen Text) siehe die Seite Lambda-Funktionen & Benannte Funktionen

Rekursive Funktionen, das ist aber für ein anderes Kapitel.


Die Beispiele auf dieser Seite wurden getestet: 09/2024