Freitag, 7. Januar 2011

Automatischer Funktionsaufruf beim Bearbeiten einer Tabelle

Möchte man automatisch eine Google Apps Script Funktion aufrufen, sobald eine Tabelle bearbeitet wurde, hat man dafür zwei Möglichkeiten:
  1. Einfache Event Handler
  2. Installierbare Event Handler
Einfacher Event Handler sind bereits in Google Apps Script eingebaut. Um sie zu nutzen, muss man nur eine Funktion mit einem speziellen Namen (onOpen(), onEdit() oder onInstall()) erstellen. Der Inhalt der Funktion wird dann beim Eintreten des entsprechenden Events ausgeführt.

Um nun eine Funktion nach dem Bearbeiten einer Tabelle auszuführen, erstellt man eine Funktion mit dem Namen “onEdit”. Dieser wird ein Parameter "event" übergeben, der ein Objekt mit dem aktuellen Tabellen-Dokument enthält. Um das alles einmal auszuprobieren erstellt an ein neues Tabellen-Dokument, öffnet den Skripteditor (Tools -> Skripte -> Skripteditor) und erstellt folgende Funktion:

function onEdit(event{
  Browser.msgBox("Tabelle wurde bearbeitet.");
}

Nun noch die Funktion unter einem beliebigen Namen speichern und eine Änderung an der aktuellen Tabelle vornehmen. Voilà, eine Message-Box erscheint.

Doch warum die Übergabe des Parameters "event"? Was kann man damit machen? Ganz einfach. Der Inhalt dieses Parameters ist, wie bereits weiter oben geschrieben - aber hier sicherheitshalber ein zweites Mal, ein Objekt, welches das Tabellen-Dokument (Spreadsheet) enthält. Aus diesem Objekt kann man nun zum Beispiel die Information auslesen, welche Tabellenzelle gerade aktiv ist.

function onEdit(event{
  var rowIndex event.source.getActiveCell().getRowIndex();
  var columnIndex event.source.getActiveCell().getColumnIndex();

  Browser.msgBox("Spalte: "+String(rowIndex));
  Browser.msgBox("Zeile: " String(columnIndex));
}

Sind mehrere Tabellenzellen aktiv, wird übrigens immer die oberste linke zurückgegeben. Ach noch was: Führt man diese Funktion innerhalb des Skripteditors aus, erhält man eine Fehlermeldung wie diese hier: TypeError: Cannot read property "source" from undefined. (line 2). Keine Sorge. Es ist alles in Ordnung mit der Funktion. Funktion speichern, zur Tabelle wechseln und eine Änderung vornehmen. Geht!

So, nun zur zweiten Möglichkeit: Installierbare Event Handler. Komischer Name, aber etwas Besseres als Übersetzung für "Installable Event Handlers" wollte mir einfach nicht einfallen.

Hierbei ist der Name der Funktion nicht ausschlaggebend. Zum Ausprobieren erstellt man einfach eine Funktion mit dem Namen "myOnEdit":

function myOnEdit(event{
  Browser.msgBox("Tabelle wurde bearbeitet.");
}

Nun wählt man im Skripteditor den Menüpunkt Triggers -> All your Triggers aus und klickt in der angezeigten Dialogbox auf den Link "No triggers set up. Click here to add one now." (wenn man noch keinen Trigger angelegt hat) beziehungsweise "Add a new trigger" (wenn man bereits einen Trigger angelegt hat). In der Spalte "Run" wählt man aus der Select-Box die Option "myOnEdit" aus und in der Spalte "Events" wählt man bei der ersten Select-Box die Option "From spreadsheet" und bei der zweiten Select-Box die Option "On edit" aus. Speichern.

Zum Testen kann man nun Änderungen an der Tabelle durchführen und es erscheint nach jeder Änderung die Message-Box.

Fertig!

1 Kommentar:

  1. Ist es damit auch möglich, beim Öffnen einer Tabelle (also wohl onOpen() ) das dazugehörige Formular automatisch zu öffnen? Falls ja, wären dadurch für mich mehrere Zentner Probleme gelöst :-)

    AntwortenLöschen