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.
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