Wie wir die Geburtstagsinformationen über den Umweg eines Google-Kalenders in eine ioBroker-VIS integrieren können, haben wir bereits in diesem Artikel beschrieben.

Wir würden gerne die Angabe im Kalender noch um das Alter ergänzen und passen hierzu das Google APPS Script hierfür an.

Die Logik aus dem bestehenden Kalender bleibt bestehen. Über eine App laden wir die Kontakte in eine Google Kontaktliste, über eine Google APPS Script erstellen wir in einem Google-Kalender die entsprechenden Einträge und rufen diese über eine URL ab.

Die Beschreibungen für den Sync der Kontakte, die Benutzung von Google APPS Scripts bleibt bestehen, wir müssen lediglich die Scripte hierfür wie folgt anpassen.

Auf Grund der etwas restriktiven Timeout-Einstellungen müssen wir unsere Scripts zur Verarbeitung der Kontakte aufteilen, ca. 200 Kontakte lassen sich je Scriptlaufzeit verarbeiten.

Geburtstage mit Alter in VIS anzeigen

Geburtstage mit Alter in VIS anzeigen

Beispiel für Script, Kontakte 1-200:

/**
 * Gets a list of people in the user's contacts.
 * @see https://developers.google.com/people/api/rest/v1/people.connections/list
 */
function getConnections() {

  var calendarDestination = CalendarApp.getCalendarById("##ID hier eintragen##d@group.calendar.google.com");

  try {
    // Get the list of connections/contacts of user's profile
    var peoples = People.People.Connections.list('people/me', {
      personFields: 'names,birthdays',
      pageSize: '500'
    });
    var anzahl = 200; //Anzahl auf die ersten 200 wegen scripttimeout beschränken
    for (let i = 0; i < anzahl; i++){
      //console.log(peoples.connections[i].names[0].displayName + " " +i+","+peoples.connections[i].birthdays[0].date.month);
      if(peoples.connections[i]){
        if(peoples.connections[i].birthdays){
          var heute = new Date();
          var dif = "";
          if(peoples.connections[i].birthdays[0].date.year){
            var dif = Number(heute.getFullYear()) - Number(peoples.connections[i].birthdays[0].date.year) + "."; //an dieser Stelle berechnen wir das Alter, heute minus Geburtsjahr
          } 
          var Name = peoples.connections[i].names[0].displayName;
          var CalBez = Name + " " + dif +" Geburtstag";
          const d = new Date(heute.getFullYear()+"-"+peoples.connections[i].birthdays[0].date.month+"-"+peoples.connections[i].birthdays[0].date.day);
          console.log(d + ", " + i);

          var newEvent = calendarDestination.createAllDayEvent(CalBez, d);
        }
      }
    }    
    // Print the connections/contacts
    //const pjson = JSON.parse(JSON.stringify(peoples, null, 2));
    //Logger.log(pjson.items[0].toalItems);
    //console.log('Connections: %s', JSON.stringify(peoples, null, 2));
  } catch (err) {
    // TODO (developers) - Handle exception here
    console.log('Failed to get the connection with an error %s', err.message);
  }
}

Für die weiteren Kontakte einfach dieses Script duplizieren und folgende Stelle anpassen:

var anzahl = 340;
for (let i = 199; i < anzahl; i++){

Wir starten also bei Eintrag #200 und Enden bei 339. Für alle weiteren Einträge dementsprechend die Werte anpassen.

Wichtig ist, dass wir die Timings der geplanten Abläufe nacheinander konfigurieren, also zunächst alle Einträge im Kalender löschen, danach Block für Block der Kontakte wieder importieren.

Trigger für Google Apps Scripte

Trigger für Google Apps Scripte

Das Ergebnis in der ioBroker VIS-Oberfläche kann dann wie folgt aussehen:

Geburtstage mit Alter in der ioBroker VIS

Geburtstage mit Alter in der ioBroker VIS