Erinnerungen sind Aufgaben im Kalender

Bei den meisten mir bekannten Möglichkeiten der digitalen Aufgabenverwaltung unter iOS und Mac OS X wundere ich mich immer wieder. Das liegt an dem meines Erachtens völlig falschen Ansatz.

Für mich sind Erinnerungen Aufgaben. Aufgaben, die mit einer Handlung verbunden sind. Jede Handlung ist wiederum mit einer Zeitdauer verbunden. Es gilt: Für jede Tätigkeit benötige ich eine gewisse Menge Zeit.

aufgaben-mittwoch-10-2013

Eine einfach Erinnerung wie „Geburtstag Tante Erna“ ist möglicherweise mit einer Vielzahl weiterer Aufgaben verbunden. Geschenk kaufen, telefonisch gratulieren oder zur Geburtstagsfeier fahren, schließlich ist es ihr 80. Geburtstag und so weiter. Jede dieser Handlungen kostet Zeit, die nicht unbegrenzt zur Verfügung steht. Jeder Tag hat 24 Stunden, die muss ich mir also einteilen. Eine lange Aufgabenliste führt zu Frustration, weil ich alles niemals an einem Tag erledigen kann.

Jedes GTD-System, welches die Dauer einer Aufgabe nicht berücksichtigt, ist von vornherein zum scheitern verurteilt.

Nehme ich an einer Besprechung im Büro teil, die zwei Stunden dauert, trage ich dies als Termin im Kalender ein. Selbstverständlich kann ich in der Zeit keinen Außentermin beim Kunden wahrnehmen. Genau so müsste ich jede Aufgabe im Kalender eintragen, denn Aufgaben sind nichts anderes als Termine mit mir selber.

Durch das Eintragen von Aufgaben im Kalender, durch das Abschätzen, wie lange ich für eine bestimmte Tätigkeit voraussichtlich brauche, sehe ich sofort, was alles noch schaftbar ist und was eben nicht mehr in den aktuellen Tag passt. Das verhindert Frustration, da man im Kalender auch entsprechende Leerläufe (so genannte Pausen) einplanen sollte.

Manuelles Eintragen im digitalen Kalender ist möglich, erscheint mir aber widersinnig. Die Erfassung aller für den heutigen Tag geplanten Aufgaben zur späteren Abschätzung, was davon wie lange dauert und überhaupt im Rahmen des Tages noch möglich ist, gehört genau zu den Tätigkeiten, die einem Software abnehmen sollte.

Nach länger vergeblicher Suche habe ich mir ein System zusammengebastelt. Das ist noch nicht der Weisheit letzter Schluss, weil es Optimierungsmöglichkeiten gibt, aber zumindest ein großer Schritt (zumindest für mich) in die richtige Richtung.

Mein Aufgaben erfasse ich komplett in Evernote (in dem Notizbuch „Aufgaben“). Durch die Erinnerungsfunktion kann ich einen Fälligkeitszeitpunkt anlegen. Bisher fehlte mir die Möglichkeit, die Erinnerungen für den heutigen Tag auszulesen und weiterzuverarbeiten. Dabei ist das Auslesen dank der API und dem SDK von Evernote das kleinere Problem. Das weitaus größere ist es, die Aufgaben in einen Kalender zu stopfen. Aus verschiedenen Gründen habe ich vor zwei Wochen meinen Kalender wieder zu Google migriert (unter anderem, weil das Zusammenspiel mit Calendars 5 erheblich besser ist). Für den Kalender von Google gibt es ebenfalls eine API, bei habe ich allerdings vorerst kapituliert. Für eine schnelle Lösung taugte das nicht.

Seit dem ich mich mit Pythonista und Drafts unter iOS beschäftige, weiss ich die Vorzüge des ULR Schemas mit seinen Möglichkeiten zu schätzen. Mit < href=“http://flexibits.com/fantastical-iphone „>Fantasical steht unter iOS (iPhone only) eine Möglichkeit zur Verfügung, mit natürlicher Sprache Termine zu erfassen. Eine der großen Stärken von Fantasical ist dabei die vollständige Unterstützung des URL Schemas. Daraus habe ich mir dann meine Lösung des „Aufgaben in den Kalender“-Problems gebastelt.

Zunächst frage ich mittels eines Skripts in Pythonista die Notizen ab, die sich in meinem Notizbuch „Aufgaben“ befinden und heute fällig sind:

import sys
sys.path.append('evernote-sdk')
import time
import urllib2
import webbrowser
import evernote.edam.userstore.constants as UserStoreConstants
import evernote.edam.type.ttypes as Types
from evernote.api.client import EvernoteClient
from evernote.edam.notestore.ttypes import NoteFilter, NotesMetadataResultSpec
from evernote.edam.type.ttypes import NoteSortOrder
dev_token = "EVERNOTEDEVELOPERTOKENHIEREINSETZEN"
client = EvernoteClient(token=dev_token, sandbox=False)
note_store = client.get_note_store()
updated_filter = NoteFilter(notebookGuid='GUIDDESNOTIZBUCHES',
words = "reminderTime:day-1 -reminderTime:day+1")
offset = 0
max_notes = 50
result_spec = NotesMetadataResultSpec(includeTitle=True)
result_list = note_store.findNotesMetadata(dev_token,
updated_filter,offset, max_notes, result_spec)
temp_string=''
stunde = int(time.strftime('%H'))
for note in result_list.notes:
stunde2str = str(stunde)
if temp_string:
temp_string =  + '\n'temp_string
temp_string =  +note.title+' heute '+stunde2strtemp_string
stunde = stunde + 1
print temp_string
temp_string= urllib2.quote(i)temp_string
webbrowser.open('drafts://x-callback-url/create?text='+temp_string+
'&action=Fantasical%20Aufgaben')

Wie man an den Developer-Token und die GUID eines Notizbuches kommt, habe ich hier beschrieben. Das Skript ruft gefiltert die Einträge aus dem Notizbuch ab, und nimmt deren Titel. Für jede Aufgabe wird Pauschal der Umfang von einer Stunde festgelegt. Zeile für Zeile wird ein String aufgebaut, der aus dem Titel und einer Zeitangabe besteht. Beim Schleifendurchlauf wird der Uhr immer um eine Stunde weiter gestellt und ein Zeilenumbruch angehängt. Zur Kontrolle gibt das Skript kurz vor seinem Ende den Spring aus. Danach wird Drafts aufgerufen und der String übergeben.

In Drafts gibt es eine URL-Aktion mit dem Namen Fantasical-Aufgaben. Die Idee dafür stammt von Eric Pramono, der auch auf einen Bug in der aktuellen Version von Drafts hingewiesen hat. So ist es derzeit möglich, eine Aktion auszuführen, obwohl kein Text eingegeben wurde. Das führt dann bei bestimmten URL-Aktionen zu einer Endlosschleife. Die unten stehende Aktion lässt sich dagegen jederzeit manuell in Fantasical beenden – spätestens dann, wenn man merkt, dass man grade dabei ist einen leeren Termin einzutragen.

fantastical://x-callback-url/parse/?
sentence=[[title]]&
x-cancel=
{{drafts://x-callback-url/create?
text=[[body]]&
action=Add%20Events%20to%20Fantastical&
afterSuccess=Delete}}&
x-success=
{{drafts://x-callback-url/create?
text=[[body]]&
action=Add%20Events%20to%20Fantastical&
afterSuccess=Delete}}

Rekursiv wird von Drafts immer wieder Fantasical aufgerufen, man bestätigt den Eintrag und kehrt automatisch zurück zu Drafts, welches wiederum mit dem nächsten Eintrag zu Fantasical springt, bis die Liste mit den aus Pythonista übergebenen Aufgaben abgearbeitet ist.

Wie bereits erwähnt, lässt sich das Ganze noch eleganter machen. Der erste Schritt würde darin bestehen, Drafts einzusparen und direkt von Pythonista nach Fantastical die Aufgaben zu übergeben (ist allerdings etwas trickreicher). In der finalen Version verzichtet man auch auf Fantasical als Hilfsmittel und spricht direkt aus dem Python-Skript den Kalender an. Vorerst aber funktioniert diese Lösung für mich recht gut.

Kommentar verfassen