Bulk Calendar – Mehrere Termine auf einmal bei Google Calendar eintragen

Ihr kennt das: Man will weder einen einzelnen Termin in seinen Google Calendar eintragen, noch einen Serientermin erstellen. Man hat beispielsweise eine Reihe an Seminaren mit verschiedenen Themen, irgendwelche Meetings an wechselnden Orten oder die Fussballtermine der Kinder gegen verschiedene Gegener. Man kann jetzt entweder auf die Details verzichten und doch einen Serientermine anlegen, oder aber man hat viel Handarbeit vor sich.

Genau diese Handarbeit kann man sich deutlich erleichtern, indem man die anzulegenden Termine in eine simple Google Tabelle einträgt und anschließend dort ein Skript startet, welches diese tabellarisch erfassten Daten in einen Kalender einträgt. Es ist schon etwas länger her, dass ich mich auf die Suche nach einem solchen Skript gemacht habe. Daher fehlt mir jetzt leider die Referenz auf das Original an dem ich anschließend noch ziemlich weitergebastelt habe.

Ich habe hier eine Kopie meiner Tabelle erstellt und freigegeben. Sieht in etwas so aus:

Bulk Calendar - Tabelle

Wenn du die Tabelle und das Skript verwenden willst erstellst du dir am besten erst mal eine Kopie der Tabelle (das Skript ist darin eingebettet):

Bulk Calendar - Kopie erstellen

Zuerst muss man logischerweise die gewünschten Daten in die Tabelle eintragen (Tabelle s.o.). Die grau markierten Zellen (Start- und Endzeitpunkt) dürfen nicht editiert werden. Wichtig ist, dass man die Formel in den grauen Spalten nur soweit nach unten kopiert, wie auch Daten in die Zeilen eingetragen sind:

Bulk Calendar - Formeln

Anschließend muss das Skript ausgeführt werden:

Bulk Calendar - Tools - Skriptmanager

Bulk Calendar - Skriptmanager Ausführen

Beim Ausführen des Skript gibt es diverse Kontroll-Dialoge, die man einfach im Skript nach Belieben auskommentieren kann.

Der Vollständigkeit halber hier noch der Code des Skripts. Wie immer quick’n’dirty, tut es aber für mich. Falls jemand damit weiter bastelt bin ich offen für Anregungen.


// Custom Menu:
// see https://developers.google.com/apps-script/guides/bound#custom_menus_dialogs_and_sidebars
function onOpen() {
  
//  var cals = CalendarApp.getAllOwnedCalendars();
//  Browser.msgBox('Es gibt genau %s Kalender zu Auswahl:', CalendarApp.getAllOwnedCalendars().length);
//  for (var c=0; c < cals.length; c++) {
//    ui.createMenu('Termine eintragen')
//      .addItem(cals.getName(), 'TermineInCalendarEintragen')
//      .addToUi();
//  }  
  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Termine eintragen')
      .addItem('Go!', 'TermineInCalendarEintragen')
      .addToUi();

}





function TermineInCalendarEintragen() {
 
  // Default-Kalender auswählen:
  //var cal = CalendarApp.getDefaultCalendar();
 
  // Besser: Auswahl an Kalendern anbieten.
  // Ansatz: Alle möglichen Kalender auflisten, per Eingabefeld den gewünschten eingeben lassen:
  var kalenderauswahl = 'In welchen Kalender sollen die Termine eingetragen werden?\\n\\n';
  // Alle eigenen Kalender abrufen:
  var cals = CalendarApp.getAllOwnedCalendars();
  
  Logger.log('Es gibt genau %s Kalender zu Auswahl:', cals.length);
  
  // Kalender durchgehen und Ausgabenachricht zusammenbasteln:
  //for (c in cals) {
  for (var c=0; c < cals.length; c++) {
    Logger.log("ID: " + cals.getName());
    kalenderauswahl = kalenderauswahl + '- ' + cals.getName() + '\\n';
  }
  kalenderauswahl = kalenderauswahl + '\\nBitte Kalendername EXAKT eingeben:';
  var kalendername = Browser.inputBox(kalenderauswahl)
  Logger.log("Kalender: " + kalendername);
  
  // Jetzt den Kalender mit dem übergebenen Namen auswählen:
  cal = CalendarApp.getCalendarsByName(kalendername);
 
  
  // Falls ein (brauchbarer) Kalendername eingegeben wurde:
  if (kalendername && cal.length > 0) {
    Browser.msgBox('Kalender "' + cal[0].getName()  + '" gewählt.')
    
    // Jetzt werden die Daten aus der Tabelle gezogen:
    var sheet = SpreadsheetApp.getActiveSheet();
    var startRow = 2;
    var numRows = SpreadsheetApp.getActiveSheet().getLastRow()-1;  // -1, weil die Kopfzeile keine Daten enthält
    Browser.msgBox('Es sollen ' + numRows + ' Termine eingetragen werden.')
    // Datenbereich auswählen:
    var dataRange = sheet.getRange(startRow, 1, numRows, 8);
    // Daraus Daten in Variable schreiben:
    var data = dataRange.getValues();
    // Jetzt jede Zeile durchgehen:
    for (d in data) {
      // Daten aus dieser Zeile wählen:
      var row = data[d];
      
      // Jetzt einzelne Felder davon:
      var title  = row[0];
      var tstart = row[4];
      var tstop  = row[5];
      var loc    = row[6];
      var desc   = row[7];
      
      // Jetzt wird der Termin eingetragen:
      // https://developers.google.com/apps-script/class_calendarapp?hl=de#createEvent
      cal[0].createEvent(title, tstart, tstop, {description:desc,location:loc});
      
      // ... und noch eine Meldung ausgegeben. Denn manchmal steigt das Skript aus, und so weiß man, wie weit es war.
      Browser.msgBox( parseInt(d)+1 + '. Termin in Kalender "' + kalendername + '" eingetragen:\\n\\n' + title + '\\n\\n' +  tstart + '\\n\\n' + desc )
    }
    // Am Ende nochmal Meldung, dann ist klar, dass alles durchgelaufen ist:
    Browser.msgBox('Fertig!');
  }
  else {
    Browser.msgBox('Kein Kalender ausgewählt oder Kalender falsch angegeben...')
  }
}


26 Gedanken zu „Bulk Calendar – Mehrere Termine auf einmal bei Google Calendar eintragen

  1. Alex

    Hey,
    echt gutes Tutorial und vielen vielen Dank für das Skript!

    Damit ist das Eintragen der Termine bei weitem einfacher und vor allem schneller geworden!

    mfg

    Antworten
  2. lunalabs

    Cooles Tool!
    Was ich noch gern bei Terminen mache, ist eine Erinnerung zu hinterlegen, damit eine gewisse Zeit davor ein Pop-Up erscheint und mich an die Sache erinnert. Weisst du, ob dies einfach zu implementiern wäre?

    MfG

    Antworten
    1. dasaweb Beitragsautor

      Hallo lunalabs,

      freut mich, dass dir das Tool weiter hilft! Hab eben nochmal in der Doku nachgesehen, ob es möglich ist, einen Termin mit einer Erinnerung anzulegen, scheint aber nicht so zu sein. Siehe https://developers.google.com/apps-script/reference/calendar/calendar-app?hl=de#createEvent(String,Date,Date,Object)

      Allerdings kannst du ja für jeden Kalender separat einstellen, wie die Erinnerungen sein sollen (unter „Kalendereinstellungen“ > „Benachrichtigungen bearbeiten“). Bin mir nicht sicher, ob mit dem Skript erzeugte Termine dadurch auch die Standartbenachrichtigungen erhalten, könnte mir das aber vorstellen. Einfach mal ausprobieren.

      Antworten
  3. Bernhard Frye

    Tolles Projekt! Würde das gern für meine Notfalldienste einsetzen, habe auch die Anleitung brav befolgt, finde aber unter Tools den Script Manager nicht. Wenn ich stattdessen den Script editor öffne, eins der dreei hinterlegten Scripts anwähle und „run“, kommen keine Dialoge und im meinem Kalender erscheinen ausch keine Einträge. Kann ich z.B. den Script manager unter Tools anzeigen lassen?

    Antworten
    1. dasaweb Beitragsautor

      Musste mir das gerade selbst noch mal ansehen. Tatsächlich hat sich da bei Google einiges geändert. Bei mir klappt es, wenn ich auf „Tools“ > „Skripteditor“ gehe und das Script dort mit dem Play-Button ausführe. Allerdings kommen die ganzen Dialoge nicht in dem Fenster / Tab mit dem Skript, sondern in dem Tab mit der Tabelle.

      Antworten
  4. Sebastian

    Hallo dasaweb,
    ich habe gerade versucht ein paar Termine über das Script zu importieren. Leider passiert nichts bei dem Script. Benötige ich irgendwelche Bibliotheken?
    Danke und Grüße

    Antworten
    1. dasaweb Beitragsautor

      Nein, man braucht weiter keine Bibliotheken oder so. Wie schon im letzten Kommentar geschrieben musst du das Skript in dem einen Fenster starten und dann in dem Fenster mit der Tabelle weitermachen. So klappt es bei mir.

      Antworten
  5. Florian

    Hallo dasaweb,
    ich habe mich auch sehr über den Bericht von Dir gefreut, allerdings klappt das bei mir über deinen Link auch nicht wirklich. Dein Link führt einen auch nicht zu einer “Bulk Calendar“ Tabelle, sondern zu einer mit dem Titel Pfannkuchen. Kann das sein, dass drin der Fehler liegt? Ich würde mich sehr freuen, wenn ich die Richtige Tabelle bei Dir kopieren könnte, denn ich bekomme es selber leider nicht hin 🙁
    Mit freundlichen Grüßen und Danke schon mal im Voraus!

    Antworten
    1. dasaweb Beitragsautor

      Hallo Florian,

      ha, da haben wohl ein paar Scherzbolde meine Tabelle etwas umgearbeitet 😉 Ich hab sie mal wieder hergestellt. Schau mal, ob du damit jetzt weiter kommst.

      Viele Grüße
      Daniel

      Antworten
  6. Sven

    Servus dasaweb,

    ich bin die Anleitung 1:1 durchgegangen und alles beachtet. Nach dem Ausführen von von TermineInCalendarEintragen und drücken des Play Buttons, wurde gefragt ob Zugriff auf mein Konto gewährt werden darf, was ich bestätigt habe und im Excel Sheet erschien sofort „Fertig“. Eingetragen ist leider nichts. Hat sich da was geändert?

    Gruß Sven

    PS: Danke für die Mühe, die du da rein steckst 😉

    Antworten
    1. dasaweb Beitragsautor

      Servus Sven,

      das Skript ist tatsächlich nicht mehr gelaufen. Schon ärgerlich, wenn Google da ab und zu an seinen Objekten schraubt und so Sachen dann buggy werden. Hab’s mal wieder gefixt und auch den Code hier im Blogpost angepasst. Kannst ja jetzt nochmal testen.

      Grüße!

      Antworten
  7. Daniel

    vielen Dank, das Script läuft jetzt wieder 🙂 Nur eine Frage: hat jemand rausgefunden, ob man sich das Script vielleicht auf einen Button in der Tabelle direkt legen kann ? Also ich stelle mir wie in Excel vor, einen Button „Termine eintragen“ zu machen und dann startet das Script. Aktuell ist es mit dem Play-Knopf etwas umständlich für manche User 🙁

    Antworten
    1. dasaweb Beitragsautor

      Ob man hier auch einen Button erstellen kann weiß ich nicht, hab ich auf die Schnelle nichts gefunden. Was aber leicht geht ist einen separaten Menueintrag zu machen, siehe https://developers.google.com/apps-script/guides/bound#custom_menus_dialogs_and_sidebars und https://developers.google.com/apps-script/guides/menus.

      Hab das mal ins Skript mit eingebaut. Noch schöner wäre es, man könnte im Menu gleich auswählen, in welchen Kalender es eingetragen werden soll, aber auch da bin ich leider nicht weit gekommen…

      Antworten
      1. Daniel

        Sehr sehr gut! Für mich ist das optimal – werde es am Montag mit meinen Kollegen probieren ob die das verstehen 😉 Ich habe im Script den Kalender fest verdrahtet ( ist unser Team-Kalender ) daher müssen die gar nix auswählen. Aber theoretisch müsste man ja die Kalender des Users auch bei der OnOpen function auslesen können … hmm ich versuche mal mein Glück daran 😉

        Aber schon mal vielen herzlichen Dank ! Dafür gebe ich ein Bier aus ! 😉

        Antworten
        1. dasaweb Beitragsautor

          Freut mich, wenn ihr das nutzt. Das mit dem Auflisten des Kalenders bei OnOpen hab ich versucht, hat aber irgendwie nicht geklappt. Und das Debugging finde ich da schwierig…

          Hab nix gegen ein Bier 😉 Wann und wo? Oder virtuell?

          Antworten
      2. Ralf

        Cool, vielen vielen Dank. Mir war überhaupt nicht bekannt, dass man Goole Apps scripten kann. Jetzt habe ich innerhalb von 2 Stunden sogar ein Script angepasst und viel gelernt.

        In Sachen separatem Menüeintrag habe ich eine Lösung gefunden: onOpen ist ein „simple trigger“ und die dürfen keine Services anfassen, die einer Autorisierung bedürfen (also z.B. den Calendar). Man kann aber einen Trigger (bei mir dann eine Funktion onOpenInstalled) installieren, dann geht das. Eine Anleitung findet sich hier: https://developers.google.com/apps-script/guides/triggers/#Simple

        Super Idee übrigens im Code links zur Doku zu posten 🙂

        Antworten
        1. dasaweb Beitragsautor

          Danke für den Hinweise mit dem Trigger. Hast du da vielleicht noch einen Code-Schnipsel für mich?

          Antworten
        2. dasaweb Beitragsautor

          Ich hab nur Lesezugriff bei dem Dokument, kann daher nicht in den Code sehen. Du kannst mir den Code auch gerne per Mail schicken oder so, vielleicht pflege ich das dann oben mit ein: daniel@DIESE-DOMAIN-HIER

          Antworten
  8. Christian

    Hallo dasaweb,

    danke für das Dokument – das Eintragen hat wirklich super geklappt und eine Menge Arbeit erspart… Was bei mir nicht funktioniert hat: die Zelle mit dem aus Datum und Uhrzeit zusammengesetzten Wert hat (warum auch immer) ständig das falsche Datum ermittelt… ich hatte die Zeilen gelöscht und die Zellen dann dann per Maus mehrfach dupliziert, konnte aber keinen Fehler in der Formel erkennen – hatte aber immer das Problem, pro Zeile dann das Datum +1, +2, +3 usw. errechnet wurde? Mag aber an meiner Unwissenheit beim Umgang mit Google Docs liegen, war der erste Versuch.

    Trotzdem ein riesen Dankeschön!

    Christian

    Antworten
    1. dasaweb Beitragsautor

      Hallo Christian,

      du meinst die Spalten E und F? Hast du meine Tabelle dupliziert, oder dir selbst eine neue angelegt? Vielleicht hast du irgendwelche Spalten nicht als Datum formatiert? Ist jetzt bisschen Fischen im Trüben, wenn man die Tabelle nicht vor sich hat…

      Antworten
    2. Tigerentchen

      Hatte das gleiche problem, das liegt am weiterziehen der Start-Uhrzeit,
      googledocs interpretiert das dann so, dass du in jeder spalte den nächsten tag haben willst (anders als excel).
      Also irgendwie anders kopieren (z.b. crtl+c,ctrl+v) oder einfach die start und endzeiten manuell befüllen nicht mit der gegebenen formel berechnen lassen.
      Liebe Grüße

      Antworten
  9. Sebastian Schäfer

    Hallo dasaweb,

    vielen Dank für das Skript. Funktioniert super. Hatte es vorher leider schon mal in Excel abgetippt und habe jetzt noch ein bisschen mehr Arbeit, aber für die nächsten Termine ist das super. Ich hätte noch eine Frage:
    Kann ich mir die Termine auch farblich markieren? Bzw. Muss ich dann eine bestimmte Zeile farblich markieren, damit der Termin farblich unterlegt wird? Geht das oder muss ich das manuell machen?
    Vielen Dank. Lg

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.