Archiv des Autors: dasaweb

Über dasaweb

Blog von einem dieser Daniels: Volgelstraußartiger Friedolin, der auf die Backen braucht. (Props to Felix Blume.)

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[c].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[c].getName());
    kalenderauswahl = kalenderauswahl + '- ' + cals[c].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...')
  }
}

Cross Country: Ein alter Hut

War heute mit dem Mountainbike eine Runde in den Wäldern Südtirols unterwegs. Irgendwie dachte ich, dass das ein relativ junger Sport ist, den ich da betreibe, aber dieses Video eines Cross-Country-Rennens von 1920 beweist das Gegenteil:


via http://overnighter.de/2014/06/video-nicht-neu-cross-country-cycling/

Würde durch Demut

Ich bin jetzt mal so dreist und kopiere nahezu 1:1 einen Beitrag von Gerd. Er verweist auf die Rede des Schriftstellers Navid Kermani zur Feierstunde “65 Jahre Grundgesetz”. Gerd ist darin eine Passage aufgefallen, die auch ich ziemlich bemerkens- und erwähnenswert finde. Es geht darin um Willy Brandts Kniefall von Warschau:

Dies ist noch merkwürdiger als das Paradox mit dem das Grundgesetz beginnt und wohl beispiellos in der Geschichte der Völker: Dieser Staat hat Würde durch einen Akt der Demut erlangt. Wird nicht das Heroische gewöhnlich mit Stärke assoziiert? Mit Männlichkeit und also auch physischer Kraft? Und am allermeisten mit Stolz?
Hier jedoch hat einer Größe gezeigt, indem er seinen Stolz unterdrückte und Schuld auf sich nahm. Noch dazu Schuld, für die er persönlich als Gegner Hitlers und Exilant am wenigsten verantwortlich war. Hier hat einer seine Ehre bewiesen, indem er sich öffentlich schämte. Hier hat einer seinen Patriotismus so verstanden, dass er vor den Opfern Deutschlands auf die Knie ging.

Falls du die durchaus kontrovers diskutierte Rede Kermanis noch nicht angehört hast solltest du das dringend nachholen:

Passwortmanager: KeePass oder nix

Passwörter braucht man heutzutage ja an jeder Ecke, und im Umgang mit Passwörtern kann man so einiges falsch machen: Die Hitliste der am häufigsten verwendeten Passwörtern verschlägt einem die Sprache. Und das ist nur die Spitze des Eisbergs.

Was bisher geschah

Ganz so fahrlässig hatte ich das bisher nicht gehandhabt. Ich hatte schon ein ziemlich ausgeklügeltes System, bei dem ich… Lassen wir das besser. Immerhin hatte ich nicht bei jedem Dienst das selbe Passwort. Richtig verlässlich fand ich das alles trotzdem nicht. Vor allem kann man – vergibt man Passwörter nach einem System – nicht mal so einfach hier oder da ein Passwort ändern, nur weil von diesem Dienst gerade die Passwörter entwendet wurden. Ungefährlich ist ein sorgloser Umgang mit Passwörtern auch nicht, in regelmäßigen Abständen wird z.B. mit geklauten Passwörtern viel Schaden angerichtet (nicht nur finanzieller). Wenn du denkst, das wäre alles halb so wild, dann gib doch mal testweise nur ein einziges deiner Passwörter an deine fünf besten Freunde: Dein Mailpasswort. Na also.

Mein Plan

Ich wollte das endlich besser geregelt haben. Nein, nicht besser, sondern gut. Dazu braucht man 1) für jeden Dienst ein separates Passwort, welches 2) zufällig generiert und ausreichend lange ist. Wenn man diese Anforderungen stellt, führt kein Weg an einem Passwortmanager vorbei. Ein Passwortmanager funktioniert so, dass man alle seine tollen Passwörter in eine Art digitales Safe speichert und sich nur den einen (richtig gut ausgedachten!) Schlüssel dazu merken muss, das Masterpasswort.

Weiterlesen

Dominosteine eng oder weit stellen? Ein Experiment.

Gestern Abend stellte sich der Jüngere beim Spielen mit Dominosteinen eine Frage: Sind Dominosteine auf einer  bestimmten Strecke schneller, wenn man sie maximal weit auseinander oder wenn man sie ganz eng zusammen stellt?

Die Frage ist nicht trivial, immerhin gibt es bei diesem Prozess wohl teils konkurrierende Effekte:

  • Je weiter die Steine auseinander stehen, desto weniger Steine brauche ich für die Strecke, und desto weniger Umfallprozesse müssen stattfinden.
  • Je weiter die Steine auseinander stehen, desto länger dauert ein Umfallprozess, bis er den nächsten triggert.
  • Je enger die Steine zusammen stehen, desto mehr spielen Reibungsprozesse zwischen den Steinen eine Rolle.

Vermutlich wird es also irgendwo einen optimalen Steinabstand geben. Uns interessierten nun die beiden sinnvollen Grenzwerte, die man beim Stellen der Steine üblicherweise verwendet. Jetzt musste ein Experiment her. Wir stellten zwei Reihen an Steinen, die einen sehr eng zusammen, die anderen ziemlich weit auseinander. Die beiden Reihen mussten gleich lang sein, gleichzeitig gestartet werden und die Geschwindigkeit sollte gut sichtbar sein. Bevor du das Video mit der Lösung anschaust: Was ist dein Tipp?

Weiterlesen

Rubik’s Cube: P oder NP?

Rubik's Cube

Rubik’s Cube, kennt man. Kann man auch irgendwie lösen. Ich hatte als Kind nie einen und habe letztes Jahr meinen Jungs einen geschenkt. Wenn man sich ein bisschen reinfuchst dann bekommt man das Lösen dieses Teils nach Schema F auch hin. Jedenfalls bei dem Würfel mit der Kantenlänge n=3.

Weiterlesen

Schöne Widersprüchlichkeit

Ich kann mich immer wieder an guten Visualisierungen ergötzen. So auch an dieser hier:

biblecontradictions-reasonproject

via http://www.project-reason.org/

Dargestellt werden Bezüge in der Bibel, die bei einer speziellen Art der Bibelauslegung problematisch werden können. Schön, oder?

PS: Hier findest du das Ding als PDF mit lesbarer Schrift (bei entsprechendem Zoom).

You are traffic

Depone hat vor ein paar Tagen dieses Bild hier gepostet. Mir gefällt der simple, aber wirkungsvolle Perspektivwechsel:

You are traffic.

You are not stuck in traffic. You are traffic.

Die Schlussfolgerung mit dem Fahrrad ist eine nette Idee, allerdings ist die nicht Original, sondern einem Adbusting der portugisischen Zeitschrift “Cycle Chic” geschuldet:

You are traffic.

via http://www.lisboncyclechic.com/

Ganz klein schreiben sie unten auf der Werbeanzeige, woher das Original kommt. Und bei dem ist die Schlussfolgerung eben nicht das Fahrrad, sondern ein ordentliches Navigationsgerät…

Nocebo – Ich werde schaden

Den Plazebo-Effekt kennt jedes Kind: Ein Scheinmedikament hilft in vergleichbarer Weise wie ein wirkliches Präparat. Es gibt aber auch den gegenteiligen und leider nicht so bekannten Effekt: Den Nocebo-Effekt:

Nocebo heißt wörtlich “Ich werde schaden”. Es ist das dunkle Gegenstück zum Placeboeffekt. Beides ist in der Medizin allgegenwärtig und beruht auf zwei grundlegenden Mechanismen: Erwartung oder Erfahrung. “Wenn Sie einem Patienten eine falsche Diagnose mitteilen, beobachtet er trotzdem bald die dazu passenden Symptome bei sich”, sagt der Noceboforscher Paul Enck von der Universität Tübingen. Und wer einen Beipackzettel allzu genau liest, spürt bald die Nebenwirkungen. Krebspatienten wird oft schon auf dem Weg zur Chemotherapie übel.

(via zeit.de)

Im folgenden Video wird das schön ausgeführt:

Weiterlesen