Zeitstempel mit Benutzer als Notiz (Google Tabellen Script)
In diesem Tutorial zeige ich Euch wie Ihr mit der GOOGLE TABELLEN Script Programmierung einen Zeitstempel mit Benutzer als Notiz erstellen könnt.
Das Script ist so aufgebaut dass bei der Änderung einer Zelle automatisch in einer vorher festgelegten Spalte ein Zeitstempel eingetragen wird. Wir tragen es in der Zeile ein wo auch die Änderung durchgeführt wurde. Zusätzlich bekommt die Zelle mit dem neuen Zeitstempel noch eine Notiz von uns. In dieser Notiz schreiben wir die Emailadresse von dem aktuellen Benutzer der Tabelle.
Ich habe ja bereits ein Tutorial für einen normalen Zeitstempel erstellt. Dieses Tutorial ist etwas einfacher gehalten und sieht auch ein bisschen anders aus. Falls Ihr Euch das Script ebenfalls mal anschauen wollt, dann findet Ihr es hier:
Zeitstempel programmieren in Google Tabellen
Dort findet Ihr auch noch ein paar Hinweise zum ändern des Zeitformats.
Wer jetzt das erste mal ein Google Tabellen Script programmiert, sollte sich zuerst dieses Tutorial hier anschauen:
Mein erstes Google Tabellen Script programmieren
Hier das Zeitstempel – Script zum kopieren:
// Funktion die beim Ändern einer Zelle aufgerufen wird function onEdit(e){ // Hier kann die Spaltennummer geändert werden A=1, B=2, C=3 ... var zeitStempelSpalte=3; // Aktuelles Tabellendokument var tabellenblatt = e.source.getActiveSheet(); // Aktueller Benutzer-Email var userEmail = Session.getActiveUser(); // Aktuellen Zeitstempel holen var zeitStempel = Utilities.formatDate(new Date(), "GMT+0100", "dd.MM.yyyy HH:mm:ss"); // Aktuelle Zellposition auslesen var aktuelleZelle = e.source.getActiveRange(); // Aktuelle Zeile var aktuelleZeile = aktuelleZelle.getRowIndex(); // Auf die Zelle für den Eintrag des Zeitstempels zugreifen var zeitStempelZelle = tabellenblatt.getRange(aktuelleZeile, zeitStempelSpalte); // Zeitstempel in die Zelle eintragen und die User-Email als Notiz hinzufügen. zeitStempelZelle.setValue("'" + zeitStempel).setComment(userEmail); }
Beschreibung des Scripts "Zeitstempel mit Benutzer als Notiz"
Die Funktion onEdit wird automatisch immer aufgerufen sobald eine Zelle verändert wird. Hier können wir jetzt unser Script eintragen.
Als Parameter wird für die Funktion onEdit ein Objekt benutzt welches Informationen enthält die wir jetzt nutzen können. In meinem Beispiel ist es das kleine e in der Klammer von onEdit.
e wird häufig als Abkürzung für Event benutzt weil es ein Ereignis kennzeichnet. Es wird auch statt dem "e" häufig "event" benutzt.
Hier könnt Ihr natürlich auch ein anderen Namen benutzen. Achtet aber darauf dass Ihr den dann unten auch überall anpassen müsst.
Als nächsten deklarieren wir ein paar Variablen.
var zeitStempelSpalte=3;
Hier könnt Ihr die Spalte bestimmen wo später der Zeitstempel eingetragen werden soll. Wenn ihr also viele Spalten nutzen solltet, dann erhöht die Zahl entsprechend, damit der Zeitstempel weiter rechts eingetragen wird.
In meinem Beispiel benutze ich die 3. Das bedeutet das der Eintrag in Zeile C vorgenommen wird. Also A=1, B=2, C=3 und so weiter.
var tabellenblatt = e.source.getActiveSheet();
Mit e.source.getActiveSheet() greifen wir auf das Tabellenblatt zu welches gerade geändert wurde und weisen es der Variablen tabellenblatt zu. Das e ist das Objekt welches wir bei der Funktion oben als Parameter eingetragen haben. Solltet Ihr dort etwas anderes eingetragen haben müsst Ihr das hier entsprechend anpassen.
var userEmail = Session.getActiveUser();
Die Emailadresse vom aktuellen Benutzer können wir mit Session.getActiveUser() auslesen und weisen es der Variablen userEmail zu.
var zeitStempel = Utilities.formatDate(new Date(), "GMT+0100", "dd.MM.yyyy HH:mm:ss");
Um einen Zeitstempel in die Zelle zu schreiben müssen wir erst einmal ein Datum oder sogenannten Zeitstempel zusammen basteln. Das machen wir über newDate().
Wir können das Datumsformat über Utilities.formatDate() anpassen. Wir erzeugen also ein neues Datums Objekt mit newDate() und können jetzt auch noch die Zeitzone anpassen. Hier benutze ich für unsere Zone "GMT+0100" das bedeutet eine Stunde mehr als die Greenwich Mean Time Zone.
Im hinteren Teil könnt Ihr Euch das Format so anpassen wie Ihr das möchtet. Hier habe ich bereits beschrieben wie das mit dem Format funktioniert:
Zeitstempel programmieren in Google Tabellen
Das ganze wird jetzt der Variablen zeitStempel zugewiesen.
Die Position für den Zeitstempel
Wir müssen ja jetzt den Zeitstempel noch irgendwo eintragen. Dafür müssen wir natürlich auch erst einmal wissen wo wir uns aktuell befinden. Die Spalte haben wir oben ja schon mit zeitStempelSpalte festgelegt also Spalte 3 (C). Jetzt brauchen wir nur noch die Zeile.
// Aktuelle Zellposition auslesen var aktuelleZelle = e.source.getActiveRange(); // Aktuelle Zeile var aktuelleZeile = aktuelleZelle.getRowIndex(); // Auf die Zelle für den Eintrag des Zeitstempels zugreifen var zeitStempelZelle = tabellenblatt.getRange(aktuelleZeile, zeitStempelSpalte); // Zeitstempel in die Zelle eintragen und die User-Email als Notiz hinzufügen. zeitStempelZelle.setValue("'" + zeitStempel).setComment(userEmail);
e.source.getActiveRange gibt uns die aktuelle Position zurück. Wir müssen von dieser Position noch die Spalte auslesen. Das machen wir mit getRowIndex.
Um jetzt den Zeitstempel einzutragen, müssen wir die Zelle bestimmen wo das geschehen soll. mit getRange greifen wir genau auf die korrekte Zeile und Spalte zu.
Ihr seht ja das die Parameter von getRange einmal die Zeile und dann die Spalte ist.
In diese Zelle die wir jetzt bestimmt haben tragen wir mit setValue() unseren Zeitstempel ein. Der zusätzliche Aufruf setComment() fügt dann in die Zelle den Kommentar ein. Als Parameter übergeben wir die Variable mit der Emailadresse.
Das war es auch schon wieder mit dem Tutorial: "Zeitstempel mit Benutzer als Notiz". Anfangs ist es nicht ganz so leicht, aber umso mehr man sich mit dem Thema beschäftigt umso leichter fällt das einen.
Also nicht aufgeben 😉
Schaut auch mal nach meiner kleinen Google Tabellen Script Snippets – Sammlung. Ich habe hier einige kleine Scripte geschrieben die Ihr vielleicht für Eurer Projekt nutzen könnt.
Dieses Tutorial ist extra für Anfänger die sich mit dem Tabellenkalkulationsprogramm GOOGLE TABELLEN / SPREADSHEETS noch nicht so viel beschäftigt haben. Es zeigt die Funktionen und Möglichkeiten Schritt für Schritt.
Das könnte Dich auch interessieren
- Übersichts-Liste der Google Tabellen Tutorials
- Die Sprache in Google Tabellen einstellen
- Tutorials über Google Tabellen
- Zeitstempel programmieren in Google Tabellen
- Tutorials über Google Tabellen Script - Programmierung
- Google Tabellen Script autorisieren
- Übersichts-Liste der GOOGLE Tabellen Script Tutorials
- Email Betreff und Nachricht von GMail abrufen Google Tabellen Script
13 Comments
Hallo,
zunächst vielen Dank für das super Tutorial, sehr hilfreich!
Besteht die Möglichkeit das Script auf einen Tab zu beschränken, also dass das Sheet nur in einem Tab ausgeführt wird und nicht in allen?
Beste Grüße
Matthias
Die Funktion onEdit erhält die Daten über das e welches in der Funktion oben bei den Parametern eingetragen ist. In diesem e stecken eine Menge Daten. Du kannst dadurch zum Beispiel auch den Tabellenblatt Namen auslesen.
Das sieht dann in etwa so aus:
var activeSheet = e.source.getActiveSheet()
wenn Du jetzt mit activeSheet.getName() den Namen der Tabelle erhältst (aktuelles Tabellenblatt wo eine Zelle geändert wurde), kannst Du diesen benutzen um ihn über eine IF Abfrage mit einem von Dir bestimmten Namen zu vergleichen.
Die Zeitstempel Script Zeilen packst Du dann in die IF Abfrage zwischen den geschweiften Klammern rein. Das heißt der Zeitstempel wird nur ausgeführt wenn die Bedingung erfüllt wurde, also die Tabellennamen übereinstimmen.
Wenn Du das Script im ScriptEditor ausführst kann es zu einem Fehler kommen. Du musst das wirklich mit einer Eingabe testen weil nur dann etwas der Funktion übergeben wird.
Viele Grüße
Chris
Herzlichen Dank für das tolle Tutorial!!!
Hat super geklappt.
Ich würde gerne die Länge der Spalte für die Datumsausgabe ändern – var zeitStempelSpalte=3;
Sollte so funktionieren: Nur in "C6:C38" ausgeben.
Ist getRowIndex() das Problem?
var aktuelleZeile=aktuelleZelle.getRange("C6:C38"); geht auch nicht
Habe mich stundenlang bemüht eine Lösung zu finden. Es funzt nichts.
Wäre toll, wenn du mir helfen möchtest
Liebe Grüße,
Melinda
Hallo Melinda,
wenn Du Deine gesamte Funktion aus dem Beispiel in der onEdit Funktion eingebaut hast, dann wird diese immer komplett ausgeführt.
Damit diese aber nur in bestimmte Zellen ausgeführt wird musst Du natürlich noch etwas anpassen. Da gibt es je nach Wunsch natürlich verschiedene Lösungsmöglichkeiten.
Schau Dir mal in diesem Artikel die Kommentare an (meine Antwort auf Raphael). Dort ist ein sehr kurzes Script welches Dir das ganz kurz zeigt wie Du das in der onEdit Funktion lösen könntest.
Zeitstempel programmieren in Google Tabellen
Viele Grüße
Chris
Das Datum + Zeit wird eingetragen, die E-Mail allerdings nicht. Kann es sein, dass nur Google-Mails funktionieren?
Das ist wohl nicht davon abhängig sondern von den Sicherheitsrichtlinien. Schau Dir mal den Eintrag unter getActiveUser() an:
https://developers.google.com/apps-script/reference/base/session
Hallo, ich habe es mit privaten Konten probiert. Lediglich bei einem Konto (Gmail) wurde die E-Mail-Adresse eingetragen. Bei allen anderen nicht (Web.de, GMX ect.). Die Einstellungen in den Google-Konten habe ich überall gleich gewählt.
Wenn Du die Tutorials von mir kennst, weißt Du ja dass ich das nur hobbymäßig mache und kein Profi bin. Ich versuche das gelernte hier zu zeigen und die letzten etwas komplizierteren Tutorials von mir stellen dann auch schon meine Grenzen dar. Wie das jetzt mit den Sicherheitsrichtlinien im Bereich der Emails ist weiß ich deshalb nicht und habe das bisher auch noch nicht mit verschiedenen Emailaccounts getestet.
Man könnte jedoch sicher auch das Script so umschreiben dass nur Personen die den Sicherheitsrichtlinien entsprechen (also Ihre Emailadresse preisgeben) die Änderungen vornehmen dürfen.
Gerade wenn es um wichtige Bereiche oder Änderungen geht will man ja vielleicht wissen wer das war. Wie man diese dann allerdings anpassen kann, sodass Einträge anschließend möglich sind weiß ich derzeit nicht.
Viele Grüße
Chris
Hallo,
ich bin ganz neu in dem Thema und kenne mich bisher wenig aus.
Ist es möglich, dass das Skript auf ein Tabellenblatt begrenzt wird?
Und kann man es so einstellen, dass z. B. im Bereich von Spalte A – D ein Zeitstempel eingetragen wird und wenn man beispielsweise in Spalte E – H etwas ändert dort ein separater Zeitstempel hinterlegt wird, auch wenn etwas in derselben Zeile geändert wird? Sozusagen die Spaltenbereiche unabhängig voneinander sind?
Viele Grüße
Alicia
Ja, das kannst Du alles machen. Du siehst ja in der Funktion onEdit oben den Parameter e. Über diesen kannst Du sehr viele Informationen beziehen.
Hiermit kannst du dann die Zeile, Spalte und den Tabellennamen auslesen. Über Bedingungen kannst Du dann festlegen dass nur dann ein Zeitstempel gesetzt wird wenn sich die geänderte Zelle innerhalb Deines gewünschten Bereichs befindet. Die Bedingungen kannst Du sehr vielschichtig gestalten. Die erste Bedingung wäre zum Beispiel der Tabellenname. Sollte der nicht stimmen kannst Du den gesamten Block inklusive aller Verschachtelungen überspringen. Innerhalb des Blocks (also wenn der Tabellenname stimmt) kannst Du dann für Zellen und Spaltenbereiche die verschiedensten Bedingungen zum Beispiel mit if Abfragen festlegen.
Ein kleines Beispiel für das Auslesen solch einer Information kannst Du schon mal hier sehen 😉
function onEdit(e){
var range = e.range;
range.setNote('Zuletzt geändert: ' + new Date() + "\n"+
"Zeile: " + e.range.getRow() + "\n"+
"Spalte: " + e.range.getColumn() + "\n"+
"Tabellenname: " + e.source.getSheetName() + "\n"+
"Zelle: " + e.range.getA1Notation() + "\n"+
"ID: " + e.source.getId());
}
Viele Grüße
Chris
Hallo Chris,
danke erstmal für die tollen Tutorials und Erklärungen. Ich komme eigentlich aus der VBA Richtung und tue mich echt ein bisschen schwer mit dem etwas anderem coding. Ich will eigentlich nur genau das machen, was du oben mit dem Zeitstempel und User gezeigt hast, es sollte aber nur für gewisse Tabs (Tabellenblätter) gelten und mir nicht bei jedem Tabellenblatt den Stempel überall ins Dokument knallen :(. Dadurch dass es außerdem zwei Parteien geben wird, welche jeweils in einem Tab auf Zeilen-Ebene abarbeiten, brauche ich den Status auch noch an zwei Stellen.
Etwas leichter und bildlicher dargestellt 🙂 :
Du gibst in Spalte 1 zb. "STELL MAL DAS BIER KALT !" ein und in Spalte 2 knallt das Skript den Stempel rein. Dann erledigt der andere Kollege (Lagermitarbeiter) die Aufgabe und gibt z.B. in Spalte 4 " BIER IST KALTGESTELLT" ein. In der Spalte 5 (natürlich in der jeweiligen Zeile) haut das Skript dann den anderen Zeitstempel mit User rein.
Somit weiß jeder wann das BIER KALT ist bzw. kalt gestellt wurde und alle sind glücklich:). Dies soll aber nur im Tab "BIER" gelten . Wenn ich in einem anderen Tab in z.B. der 2 oder 4ten Spalte was eingebe passiert nichts.
Wäre echt mega wenn du mir hiermit helfen könntest.
——————————————————————————————————————————————————————-
Hier nochmal deine ursprüngliche Funktion wie ich sie gerade nutze.
// Funktion die beim Ändern einer Zelle aufgerufen wird
function onEdit(e){
// Hier kann die Spaltennummer geändert werden A=1, B=2, C=3 …
var zeitStempelSpalte=3;
// Aktuelles Tabellendokument
var tabellenblatt = e.source.getActiveSheet();
// Aktueller Benutzer-Email
var userEmail = Session.getActiveUser();
// Aktuellen Zeitstempel holen
var zeitStempel = Utilities.formatDate(new Date(), "GMT+0100", "dd.MM.yyyy HH:mm");
// Aktuelle Zellposition auslesen
var aktuelleZelle = e.source.getActiveRange();
// Aktuelle Zeile
var aktuelleZeile = aktuelleZelle.getRowIndex();
// Auf die Zelle für den Eintrag des Zeitstempels zugreifen
var zeitStempelZelle = tabellenblatt.getRange(aktuelleZeile, zeitStempelSpalte);
// Zeitstempel in die Zelle eintragen und die User-Email als Notiz hinzufügen.
zeitStempelZelle.setValue("'" + zeitStempel).setComment(userEmail);
}
1000 DANK für eine Rückmeldung
Liebe Grüße aus München
Markus
Hallo Chris,
vorab erst mal danke für die tollen Tutorials. Super Arbeit. Nun suche ich für mein Unternehmen nach einer Abwandlung:
Variante 1:
Auf einem zweiten Tabellenblatt (Timestamps) wird jede Veränderung, die auf dem ersten Tabellenblatt (Arbeitszeit) vorgenommen wurde mit einem Zeitstempel und einer Notiz (Emailadresse) versehen.
Variante 2:
Auf dem Tabellenblatt (Arbeitszeit) wird die letzte Änderung der Zelle samt Emailadresse ALS NOTIZ gespeichert.
Kannst Du dabei helfen?
Viele Grüße aus Rostock
Colin
Hallo Chris,
ich hab auch hierzu eine Frage 🙂
Ist es möglich, dass man dieses Script, wie du es oben abgebildet hast, erst ab Zeile 11 anwendet?
Hintergrund:
In Spalte "G" soll der Zeitstempel eingetragen werden – aber in den Zeilen 1 – 10 stehen in den Spalten A – H Werte, deren Änderung keinen Zeitstempel auslösen sollen.
Ich danke dir schon jetzt für die Antwort 🙂
MfG
Daniel