Benutzerdefinierte Funktionen in Google Tabellen

Google Tabellen bietet Hunderte von integrierten Funktionen wie AVERAGE, SUM und VLOOKUP. Wenn diese für Ihre Anforderungen nicht ausreichen, können Sie mit Google Apps Script benutzerdefinierte Funktionen schreiben, um beispielsweise Meter in Meilen umzuwandeln oder Live-Inhalte aus dem Internet abzurufen, und sie dann wie eine integrierte Funktion in Google Tabellen verwenden.

Erste Schritte

Benutzerdefinierte Funktionen werden mit Standard-JavaScript erstellt. Wenn Sie noch nicht mit JavaScript vertraut sind, bietet Codecademy einen tollen Kurs für Anfänger. Hinweis: Dieser Kurs wurde nicht von Google entwickelt und ist nicht mit Google verknüpft.

Hier sehen Sie eine einfache benutzerdefinierte Funktion namens DOUBLE, die einen Eingabewert mit 2 multipliziert:

/**
 * Multiplies an input value by 2.
 * @param {number} input The number to double.
 * @return The input multiplied by 2.
 * @customfunction
*/
function DOUBLE(input) {
  return input * 2;
}

Wenn Sie sich mit JavaScript nicht auskennen und keine Zeit für weitere Informationen haben, können Sie im Add-on-Store nachsehen, ob eine andere Person die benötigte benutzerdefinierte Funktion bereits erstellt hat.

Benutzerdefinierte Funktion erstellen

So schreiben Sie eine benutzerdefinierte Funktion:

  1. Erstellen Sie eine Tabelle oder öffnen Sie sie in Google Tabellen.
  2. Wählen Sie den Menüpunkt Erweiterungen > Apps Script aus.
  3. Löschen Sie den Code im Skripteditor. Für die obige Funktion DOUBLE kopieren Sie einfach den Code und fügen ihn in den Skripteditor ein.
  4. Klicken Sie oben auf „Speichern“ .

Jetzt können Sie die benutzerdefinierte Funktion verwenden.

Benutzerdefinierte Funktion von Google Workspace Marketplaceabrufen

Google Workspace Marketplace bietet mehrere benutzerdefinierte Funktionen als Add-ons für Google Tabellen. So verwenden oder entdecken Sie diese Add-ons:

  1. Erstellen Sie eine Tabelle oder öffnen Sie sie in Google Tabellen.
  2. Klicken Sie oben auf Add-ons > Add-ons aufrufen.
  3. Klicken Sie nach dem Öffnen von Google Workspace Marketplace rechts oben auf das Suchfeld.
  4. Geben Sie „&“ ein und drücken Sie die Eingabetaste.
  5. Wenn Sie ein benutzerdefiniertes Funktions-Add-on finden, das Sie interessiert, klicken Sie auf Installieren, um es zu installieren.
  6. In einem Dialogfeld werden Sie möglicherweise aufgefordert, das Add-on zu autorisieren. Lesen Sie die Benachrichtigung in diesem Fall sorgfältig und klicken Sie dann auf Zulassen.
  7. Das Add-on ist dann in der Tabelle verfügbar. Wenn Sie das Add-on in einer anderen Tabelle verwenden möchten, öffnen Sie die andere Tabelle und klicken Sie oben auf Add-ons > Add-ons verwalten. Suchen Sie das Add-on, das Sie verwenden möchten, und klicken Sie auf „Optionen“ > In diesem Dokument verwenden.

Benutzerdefinierte Funktion verwenden

Sobald Sie eine benutzerdefinierte Funktion geschrieben oder eine Funktion ausGoogle Workspace Marketplaceinstalliert haben, ist sie so einfach wie eine integrierte Funktion:

  1. Klicken Sie auf die Zelle, in der Sie die Funktion verwenden möchten.
  2. Geben Sie ein Gleichheitszeichen (=) gefolgt vom Namen der Funktion und einem beliebigen Eingabewert ein, z. B. =DOUBLE(A1), und drücken Sie die Eingabetaste.
  3. In der Zelle wird kurz „Loading...“ angezeigt und das Ergebnis wird angezeigt.

Richtlinien für benutzerdefinierte Funktionen

Bevor Sie eine eigene benutzerdefinierte Funktion schreiben, müssen Sie einige Richtlinien beachten.

Benennung

Zusätzlich zu den Standardkonventionen für die Namenskonvention von JavaScript-Funktionen ist Folgendes zu beachten:

  • Der Name einer benutzerdefinierten Funktion muss sich von den Namen integrierter Funktionen wie SUM() unterscheiden.
  • Der Name einer benutzerdefinierten Funktion darf nicht mit einem Unterstrich (_) enden, der eine private Funktion in Apps Script angibt.
  • Der Name einer benutzerdefinierten Funktion muss mit der Syntax function myFunction() deklariert werden, nicht mit var myFunction = new Function().
  • Die Großschreibung spielt keine Rolle, obwohl die Namen von Tabellenfunktionen traditionell in Großbuchstaben geschrieben sind.

Argumente

Wie eine integrierte Funktion kann eine benutzerdefinierte Funktion Argumente als Eingabewerte verwenden:

  • Wenn Sie die Funktion mit einem Verweis auf eine einzelne Zelle als Argument aufrufen (z. B. =DOUBLE(A1)), ist das Argument der Wert der Zelle.
  • Wenn Sie die Funktion mit einem Verweis auf einen Zellenbereich als Argument aufrufen (z. B. =DOUBLE(A1:B10)), ist das Argument ein zweidimensionales Array der Zellenwerte. Im Screenshot unten werden die Argumente in =DOUBLE(A1:B2) beispielsweise von Apps Script als double([[1,3],[2,4]]) interpretiert. Der Beispielcode für DOUBLE von oben muss geändert werden, damit ein Array als Eingabe akzeptiert wird.


  • Argumente für benutzerdefinierte Funktionen müssen deterministisch sein. Integrierte Tabellenfunktionen, die bei jeder Berechnung ein anderes Ergebnis zurückgeben (z. B. NOW() oder RAND()), sind als Argumente für eine benutzerdefinierte Funktion nicht zulässig. Wenn eine benutzerdefinierte Funktion versucht, einen Wert basierend auf einer dieser veränderlichen integrierten Funktionen zurückzugeben, wird Loading... auf unbestimmte Zeit angezeigt.

Rückgabewerte

Für jede benutzerdefinierte Funktion muss ein Wert zurückgegeben werden, der so angezeigt wird:

  • Wenn eine benutzerdefinierte Funktion einen Wert zurückgibt, wird der Wert in der Zelle angezeigt, aus der die Funktion aufgerufen wurde.
  • Wenn eine benutzerdefinierte Funktion ein zweidimensionales Array von Werten zurückgibt, überlaufen die Werte in benachbarte Zellen, solange diese Zellen leer sind. Wenn dies dazu führen würde, dass das Array vorhandene Zelleninhalte überschreibt, löst die benutzerdefinierte Funktion stattdessen einen Fehler aus. Ein Beispiel finden Sie im Abschnitt zur Optimierung benutzerdefinierter Funktionen.
  • Eine benutzerdefinierte Funktion kann sich nur auf Zellen auswirken, in denen sie einen Wert zurückgibt. Mit anderen Worten: Eine benutzerdefinierte Funktion kann nicht beliebige Zellen bearbeiten, sondern nur die Zellen, aus denen sie aufgerufen werden, und ihre benachbarten Zellen. Wenn Sie beliebige Zellen bearbeiten möchten, verwenden Sie stattdessen ein benutzerdefiniertes Menü, um eine Funktion auszuführen.
  • Ein Aufruf einer benutzerdefinierten Funktion muss innerhalb von 30 Sekunden zurückgegeben werden. Andernfalls wird in der Zelle ein Fehler angezeigt: Internal error executing the custom function.

Datentypen

Google Tabellen speichert Daten je nach Art der Daten in verschiedenen Formaten. Wenn diese Werte in benutzerdefinierten Funktionen verwendet werden, behandelt Apps Script sie als den entsprechenden Datentyp in JavaScript. Dies sind die häufigsten Verwirrungsbereiche:

  • Uhrzeiten und Datumsangaben in Google Tabellen werden in Apps Script zu Date-Objekten. Wenn die Tabelle und das Skript unterschiedliche Zeitzonen haben (ein seltenes Problem), muss die benutzerdefinierte Funktion ausgeglichen werden.
  • In Google Tabellen werden die Werte für die Dauer auch Date-Objekte. Es kann jedoch kompliziert sein, mit ihnen zu arbeiten.
  • Prozentwerte in Google Tabellen werden in Apps Script zu Dezimalzahlen. Beispielsweise wird eine Zelle mit dem Wert 10% in Apps Script zu 0.1.

Automatische Vervollständigung

Google Tabellen unterstützt die automatische Vervollständigung für benutzerdefinierte Funktionen ähnlich wie für integrierte Funktionen. Wenn Sie einen Funktionsnamen in eine Zelle eingeben, wird eine Liste der integrierten und benutzerdefinierten Funktionen angezeigt, die Ihrer Eingabe entsprechen.

In dieser Liste werden benutzerdefinierte Funktionen angezeigt, wenn ihr Skript ein JsDoc-@customfunction enthält, wie im Beispiel DOUBLE() unten dargestellt.

/**
 * Multiplies the input value by 2.
 *
 * @param {number} input The value to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return input * 2;
}

Erweitert

Apps Script-Dienste verwenden

Benutzerdefinierte Funktionen können bestimmte Apps Script-Dienste aufrufen, um komplexere Aufgaben auszuführen. Eine benutzerdefinierte Funktion kann beispielsweise den Dienst Language aufrufen, um eine englische Wortgruppe ins Spanische zu übersetzen.

Im Gegensatz zu den meisten anderen Arten von Apps Scripts werden Nutzer bei benutzerdefinierten Funktionen nie aufgefordert, den Zugriff auf personenbezogene Daten zu autorisieren. Daher können sie nur Dienste aufrufen, die keinen Zugriff auf personenbezogene Daten haben, insbesondere folgende:

Unterstützte Dienste Hinweise
Cache Funktioniert, ist aber in benutzerdefinierten Funktionen nicht besonders nützlich
HTML Kann HTML generieren, aber nicht anzeigen (selten hilfreich)
JDBC
Sprache
Sperren Funktioniert, ist aber in benutzerdefinierten Funktionen nicht besonders nützlich
Maps Kann Wegbeschreibungen berechnen, aber keine Karten anzeigen
Properties getUserProperties() ruft nur die Properties des Tabelleninhabers ab. Mitbearbeiter können keine Nutzereigenschaften in einer benutzerdefinierten Funktion festlegen.
Tabelle Nur lesen (kann die meisten get*()-Methoden verwenden, aber nicht set*()).
Andere Tabellen (SpreadsheetApp.openById() oder SpreadsheetApp.openByUrl()) können nicht geöffnet werden.
URL-Abruf
Dienstprogramme
XML

Wenn die benutzerdefinierte Funktion die Fehlermeldung You do not have permission to call X service. auslöst, muss der Dienst eine Nutzerautorisierung haben und kann daher nicht in einer benutzerdefinierten Funktion verwendet werden.

Wenn Sie einen anderen Dienst als den oben genannten verwenden möchten, erstellen Sie ein benutzerdefiniertes Menü, in dem eine Apps Script-Funktion ausgeführt wird, anstatt eine benutzerdefinierte Funktion zu schreiben. Eine Funktion, die über ein Menü ausgelöst wird, fordert den Nutzer bei Bedarf zur Autorisierung auf und kann folglich alle Apps Script-Dienste verwenden.

Umsatzbeteiligung

Benutzerdefinierte Funktionen sind an die Tabelle gebunden, in der sie erstellt wurden. Das bedeutet, dass eine benutzerdefinierte Funktion in einer Tabelle nur dann in anderen Tabellen verwendet werden kann, wenn Sie eine der folgenden Methoden nutzen:

  • Klicken Sie auf Erweiterungen > Apps Script, um den Skripteditor zu öffnen. Kopieren Sie dann den Skripttext aus der ursprünglichen Tabelle und fügen Sie ihn in den Skripteditor einer anderen Tabelle ein.
  • Erstellen Sie eine Kopie der Tabelle, die die benutzerdefinierte Funktion enthält. Klicken Sie dazu auf Datei erstellen &kopieren. Beim Kopieren einer Tabelle werden auch alle angehängten Skripts kopiert. Jeder, der Zugriff auf die Tabelle hat, kann das Skript kopieren. Mitbearbeiter, die nur Lesezugriff haben, können den Skripteditor nicht in der ursprünglichen Tabelle öffnen. Wenn sie jedoch eine Kopie erstellen, werden sie zum Eigentümer der Kopie und können das Skript sehen.
  • Veröffentlichen Sie das Skript als Add-on für Google Tabellen.

Optimierung

Jedes Mal, wenn eine benutzerdefinierte Funktion in einer Tabelle verwendet wird, sendet Google Tabellen einen separaten Aufruf an den Apps Script-Server. Wenn Ihre Tabelle Dutzende (oder sogar Hunderttausende) benutzerdefinierte Funktionsaufrufe enthält, kann dieser Vorgang ziemlich langsam sein.

Wenn Sie eine benutzerdefinierte Funktion mehrmals für einen großen Datenbereich verwenden möchten, sollten Sie die Funktion daher so ändern, dass sie einen Bereich als Eingabe in Form eines zweidimensionalen Arrays akzeptiert und dann ein zweidimensionales Array zurückgibt, das in die entsprechenden Zellen überlaufen kann.

Die oben gezeigte Funktion DOUBLE() kann beispielsweise so umgeschrieben werden, dass sie eine einzelne Zelle oder einen Zellenbereich akzeptiert:

/**
 * Multiplies the input value by 2.
 *
 * @param {number|Array<Array<number>>} input The value or range of cells
 *     to multiply.
 * @return The input multiplied by 2.
 * @customfunction
 */
function DOUBLE(input) {
  return Array.isArray(input) ?
      input.map(row => row.map(cell => cell * 2)) :
      input * 2;
}

Bei dem obigen Ansatz wird die map-Methode des JavaScript-Objekts Array verwendet, um rekursiv DOUBLE für jeden Wert im zweidimensionalen Zellenzellen aufzurufen. Sie gibt ein zweidimensionales Array zurück, das die Ergebnisse enthält. So können Sie DOUBLE nur einmal aufrufen, dies wird jedoch für eine große Anzahl von Zellen gleichzeitig berechnet, wie im Screenshot unten gezeigt. Dasselbe können Sie mit verschachtelten if-Anweisungen anstatt mit dem map-Aufruf erreichen.

In ähnlicher Weise werden mit der folgenden benutzerdefinierten Funktion Liveinhalte aus dem Internet abgerufen und ein zweidimensionales Array verwendet, um zwei Ergebnisspalten mit einem einzigen Funktionsaufruf anzuzeigen. Wenn für jede Zelle ein eigener Funktionsaufruf erforderlich ist, würde der Vorgang deutlich mehr Zeit in Anspruch nehmen, da der Apps Script-Server den XML-Feed jedes Mal herunterladen und parsen muss.

/**
 * Show the title and date for the first page of posts on the
 * Developer blog.
 *
 * @return Two columns of data representing posts on the
 *     Developer blog.
 * @customfunction
 */
function getBlogPosts() {
  var array = [];
  var url = 'https://gsuite-developers.googleblog.com/atom.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
  var entries = document.getRootElement().getChildren('entry', atom);
  for (var i = 0; i < entries.length; i++) {
    var title = entries[i].getChild('title', atom).getText();
    var date = entries[i].getChild('published', atom).getValue();
    array.push([title, date]);
  }
  return array;
}

Diese Techniken können auf fast jede benutzerdefinierte Funktion angewendet werden, die wiederholt in einer Tabelle verwendet wird. Die Details der Implementierung variieren jedoch je nach Verhalten der Funktion.