Workflows für wiederkehrende Aufgaben

Einfacher Workflow für Rechnungen

Es gibt Vorgänge, die uns immer wieder beschäftigen: Rechnungen bezahlen zu müssen gehört dazu. Geht es nur um eine schnelle Überweisung, wird dies möglichst gleich erledigt und ist somit vom Tisch. In einigen Fällen ist aber mehr zu tun; eine Rechnung muss zum Beispiel geprüft, bezahlt und archiviert werden.

Wenn ich meine Post durchgehe, erledige ich Kleinigkeiten sofort – für aufwändigere Dinge lege ich lediglich eine oder mehrere Tasks in Things an.

Für häufige Vorgänge, die in mehreren Schritten erledigt werden müssen, lohnt es, einen Workflow festzulegen. Unter Workflow soll hier einfach eine definierte Sequenz von Schritten verstanden werden. Einen solchen einfachen Workflow will ich hier vorstellen.

Als Beispiel benutze ich Arztrechnungen – aus Kundensicht. Die durchzuführenden Schritte sind einfach und anschaulich, und sicher auch den meisten vertraut. Natürlich lässt sich die Vorgehensweise auf komplexere Vorgänge übertragen.

Für jeden Schritt wird eine Task in Things angelegt. Wahlweise ließen sich diese Tasks auch in einem Projekt bündeln; dies ist für größere und langwierigere Vorgänge zu empfehlen. Für unser einfaches Beispiel sollen die isolierten Tasks genügen.

Der Workflow

Die durchzuführenden Schritte:
1. Rechnung prüfen
2. Rechnung überweisen
3. Rechnung archivieren
4. Prüfen, ob die Rechnung bei der Krankenkasse eingereicht werden sollte.

Da es lästig ist, für jede Rechnung vier Tasks anzulegen, wollen wir dies automatisieren. Dazu bietet sich AppleScript an.

Das Script

Im Anhang ist ein entsprechendes Script zu finden. Für die Verwendung werden einige kleine Anpassungen nötig sein; deshalb hier eine kurze Führung durch den Code. Das Script gliedert sich in vier Teile:
* Konstanten zur Konfiguration.
* Abfrage einer Bezeichnung für die Rechnung.
* Erzeugen der Tasks in Things.
* Benachrichtigung über das erfolgreiche Anlegen der Tasks via Growl.

Konstanten

dueDate erlaubt die Festlegung eines Zieldatums für den Vorgang. Es wird auf das aktuelle Datum gesetzt – die Task wäre also am gleichen Tag zu erledigen. Es mag sinnvoll sein, dieses Datum einige Tage in die Zukunft zu setzen. Falls kein Zieldatum gebraucht wird, kann die Konstante entfernt werden; die Verwendung der Konstante bei der Taskerzeugung wird dann ebenfalls nicht mehr benötigt.

Mit der Konstante theArea lässt sich festlegen, in welchem Bereich die Tasks angelegt werden sollen.

Die Eingabe

Der Dialog erwartet die Eingabe eines kurze Textes, der dann in den Titel jeder Task übernommen wird und so den konkreten Kontext liefert.

Anlegen der Tasks

Nach Eingabe dieses Idents werden endlich die Tasks angelegt. Die Tasks für die ersten drei Schritte werden in einer Schleife erzeugt; sie bestehen lediglich aus einem Titel und dem Zieldatum. Sollen weitere Tasks erzeugt werden, reicht ein entsprechender Eintrag in der Variablen tasks.

Die vierte Task zur Entscheidung, ob die Rechnung eingereicht werden soll, ist etwas aufwändiger zu erzeugen. Ausser Titel und Zielatum erhält sie einen link auf eine Tabelle, die in DEVONthink archiviert ist. In dieser Tabelle wird der Rechnungsbetrag eingetragen. Ein dort hinterlegter einfacher Algorithmus berechnet dann, ob eine Einreichung bei der Krankenkasse Sinn macht.

Der link auf die Tabelle ist hier direkt in die Variable URL eingetragen. Diese URL erhält man über das Kontextmenü in DEVONthink (Verweis kopieren). Dies lässt sich sicher  eleganter lösen, zeigt aber die Möglichkeiten, die sich durch die Verknüpfung von Things und DEVONthink ergeben.

Bei der Bearbeitung dieser Task reicht jetzt ein Klick auf diesen link, um die Tabelle in DEVONthink zu öffnen.

Nachricht via Growl

Der letzte Block des Scripts gibt eine Meldung via Growl aus. Wird diese nicht gewünscht, kann dieser Block einfach komplett gelöscht werden.

Fazit

Durch die Verwendung eines Workflows werden häufig wiederkehrende Arbeiten effizienter und weniger fehleranfällig erledigt. Das automatische Erzeugen und Anstoßen dieses Workflows erleichtert das Leben noch ein bißchen mehr – und Spaß macht es auch, wenn erst mal alles läuft.


(* Start workflow for processing of health care invoices
2011-12-30 sbraun
*)

-- we assume that the tasks shall be performed during the current day
set dueDate to current date

-- add tasks to project "Finanzen"
set theArea to "Finanzen"

-- URL of the spread sheet
set theURL to "x-devonthink-item://25303449-E61A-491C-AF46-BB157383E8CD"

-- ask user for Release
display dialog "Bitte Namen / Ident für Rechnung eingeben" default answer ¬
	"Rechnung" buttons ¬
	{"OK", "Cancel"} default button 1 ¬
	with icon note
if button returned of result = "OK" then
	set theIdentifier to "Rechnung " & text returned of result
end if
-- create tasks in Things
tell application "Things"
	set tasks to {"Rechnung überweisen: " & theIdentifier, "Scannen und taggen: " & theIdentifier}
	repeat with task in tasks
		set newTask to make new to do with properties {name:task, due date:dueDate} at beginning of area theArea
		move newTask to list "Today"
	end repeat
	-- this task gets some specific properties
	set newTask to make new to do with properties {name:"Tabelle updaten: " & theIdentifier, due date:dueDate} at beginning of area theArea
	set URLString to "[url=" & theURL & "]Tabelle[/url]"
	set notes of newTask to "Link zur Tabelle" & linefeed & URLString
	move newTask to list "Today"
end tell
-- send completion message per growl
tell application "Growl"
	-- register once, but it's also ok to register multiple times
	register as application "Start Rechnungs Workflow" all notifications {"workflow"} default notifications {"workflow"}
	notify with name "workflow" title "Tasks erzeugt" description "Tasks für Rechnungs Workflow wurden erzeugt" application name "Start Rechnungs Workflow"
end tell

Advertisements

Angenehm schreiben mit iAWriter

iA Writer ist ein schönes, minimalistisches Schreibprogramm für den Mac. Während des Schreibens ist ausschließlich der Text auf dem Bildschirm zu sehen. Menüs und Textstatistiken werden ausgeblendet solange geschrieben wird. Erst nach einer kurzen Schreibpause tauchen am unteren Bildschirmrand diskret Informationen zum Text sowie ein kleines Icon zum Ein- oder Ausschalten des sogenannten Focus auf.

Bild 1 - Statuszeile

Fokusiertes Schreiben

Dieser Focus hält die Eingabe neuen Textes immer in der vertikalen Mitte des Bildschirms. Bei anderen Editoren wird dies oft Schreibmaschinen Modus genannt, weil sich, wie bei einer mechanischen Schreibmaschine, das Papier nach oben schiebt, die Schreibposition dabei aber immer gleich bleibt. Außer diesem Verhalten wird auch der gerade aktuelle Satz hervorgehoben; der andere Text wird optisch dezent zurückgenommen. Beides zusammen macht das Schreiben sehr angenehm. Wie der Name Focus verspricht, wird ein konzentriertes Arbeiten erleichtert.

Markdown

Neben reinem Text unterstützt Writer das Arbeiten mit Markdown sehr schön. Formatanweisungen werden dynamisch in Hervorhebungen umgesetzt. Nach getaner Arbeit kann der Text als HTML- oder RTF-Dokument exportiert werden. Mehr zu Markdown ist in Formatieren von Texten mit Markdown zu finden.

Mit dem Löwen brüllen

Wie bei allen modernen Anwendungen für den Mac werden Fullscreen Mode, automatisches Sichern und das Sichern von Versionen unterstützt.

Auch einen Menüpunkt Sichern unter … bzw. Save as… sucht man vergebens. Dafür gibt es seit Lion die Funktion Duplicate. Damit wird das Dokument in einem neuen Editorfenster geöffnet und kann dann unter anderem Namen abgespeichert werden.

Writer ist außer für den Mac auch für das iPad verfügbar. Die Integration mit iCloud macht den Austausch von Dokumenten einfach und transparent. Sehr schön gelöst! Markdown wird auf dem iPad allerdings leider nicht so schön unterstützt. Schade ist vor allem, dass in der erweiterten virtuellen Tastatur die *- und #-Tasten fehlen, die bei Markdown oft benötigt werden.

Ein schönes Feature ist unter dem Menüpunkt File / Revert Document … zu finden. Damit lassen sich ältere Versionen des aktuellen Dokuments durchsehen und auch wieder herstellen. Wer Time Machine kennt, wird sich sofort zuhause fühlen.

In der aktuellen Version wurde rudimentäre AppleScript-Unterstützung ergänzt.

Fazit

Writer ist ein schönes und nützliches Werkzeug mit einigen durchdachten und gut umgesetzten Features. Für das Schreiben mit Markdown ziehe ich derzeit Byword wegen der besseren Exportmöglichkeiten vor.
Das vielleicht bemerkenswerteste seit Version 1.2 ist die gelungene iCloud-Anbindung. So wünsche ich mir das.
Wer gerne in einer schönen ruhigen Umgebung schreibt, sollte Writer einfach einmal ausprobieren!

Automatisieren von Arbeitsabläufen

Im Alltag gibt es Arbeiten, die immer wieder anfallen. Solche Arbeiten sind oft lästig und zeitraubend.
Anhand meines Workflows für Blogartikel will ich zeigen, wie sich mit etwas Automatisierung das Leben erleichtern lässt. Dieser Workflow ist recht einfach und leicht nachvollziehbar. Die Vorgehensweise ist natürlich auf andere, auch komplexere Abläufe übertragbar.

Mein Workflow

Ein Artikel entsteht in drei Phasen. In der ersten Phase schreibe ich den Text in einem Editor. Bin ich mit dem Inhalt soweit zufrieden, übertrage ich ihn nach WordPress. Dort kümmere ich mich um das Layout und ergänze Bilder sowie links. Die letzte Phase ist dann das posten des Artikels.
Wenn ich einen Artikel plane, lege ich mir in Things für jede dieser Phasen eine Task an. Zusätzlich erzeuge ich in einem Ordner meiner Dropbox eine leere Datei für den Rohtext.
Habe ich mich schon für ein konkretes Datum für das Posting entschieden, werden die Fälligkeitsdaten der Tasks entsprechend gesetzt.

Die Automatisierung

Um diese vorbereitenden Arbeiten einfacher zu machen, habe ich ein kleines Script geschrieben (siehe Anhang). Dieses rufe ich mit dem Arbeitstitel des Artikels auf. Das Script erzeugt als erstes die leere Datei mit dem Titel als Dateinamen. Dann legt es in Things ein Projekt mit eben diesem Namen an, in dem anschließend drei Tasks für die Phasen erzeugt werden. In der Task für das schreiben des Rohtextes wird ein link auf die neue Datei erzeugt. So kann ich direkt aus Things heraus den Editor starten und anfangen zu schreiben.

Bild 1 zeigt das Projekt in Things, Bild 2 die Task mit dem erzeugten link. Der link auf das script sowie der Text wurden manuell ergänzt.

Bild 1 – Das erzeugte Projekt mit den Tasks

Bild 2 – Hier ist der erzeugte link auf die Textdatei zu sehen

Das Script

Am einfachsten lässt sich auf dem Mac solch eine Aufgabe mit AppleScript lösen. Es ermöglicht den einfachen Zugriff auf das Betriebssystem und wird von vielen Anwendungen gut unterstützt, so auch von Things.

Das vollständige Script ist im Anhang zu finden.

Das Script besteht aus mehreren Blöcken. Es beginnt mit zwei Parametern, die eine Anpassung an die eigene Umgebung ermöglichen.

theArea kann auf den Bereich in Things gesetzt werden, dem das neue Projekt zugeordnet sein soll. Dazu muss einfach der Name des Bereichs zugewiesen werden. Für einen Bereich namens Arbeit würde dies so aussehen:

set theArea to “Arbeit”

Der zweite Parameter, thePath, gibt an, wo die neue Textdatei erzeugt werden soll.

Im ersten Programmblock wird jetzt mit display dialog der Titel des Artikels vom Anwender erfragt. Der Titel ist anschließend in der Variablen theTitle zu finden.

Als nächstes wird die Textdatei erzeugt. Dies geschieht in dem Block, der mit tell application “SystemEvents” geklammert ist. Hier bereiten wir auch schon den link für das einbinden in unsere Task vor (linkToFile).

Jetzt folgt die Erzeugung des Projektes und der Tasks in Things. Welche Tasks erzeugt werden, wird über die Variable steps gesteuert. Momentan sind das die Tasks für schreiben, fertig machen und posten des Artikels. Jede Task wird durch ein Objekt mit mehreren Attributen definiert.

  • id enthält den Namen der Task (dieser wird später noch um den Titel erweitert!).
  • todayList kann auf den Wert “true” gesetzt werden, um die Task in Things der Liste “Heute” hinzuzufügen. Ansonsten wird sie in der Liste “Nächste” auftauchen.
  • notes erlaubt die Konfiguration eines Textes für die Notiz der Task. In der Task für schreiben wird hiermit der link auf die Textdatei eingefügt.

Das Projekt selbst wird im vorgegebenen Bereich innerhalb der Liste “Irgendwann” erzeugt. Wurde für eine Task allerdings todayList mit true konfiguriert, erscheint das Projekt in der Liste der aktiven Projekte, da bereits mit der Arbeit angefangen werden kann.

Zum guten Schluss wird im letzten Block noch eine Erfolgsmeldung per Growl ausgegeben. Dies ist natürlich optional. Ist kein Growl installiert, oder stört die Meldung, kann dieser komplette Block einfach gelöscht werden.

Fazit

Mit wenigen Zeilen AppleScript lassen sich lästige Aufgaben oft wesentlich angenehmer gestalten.
Das hier beschriebene Script lässt sich als Vorlage zur Erzeugung beliebiger Projekte in Things verwenden, die immer wieder gebraucht werden. Auch eine Verknüpfung mit DEVONthink lässt sich so recht einfach erreichen.
Vielleicht hilft dieser Artikel dem ein oder anderen, sich das Leben etwas leichter zu machen.

Über Anmerkungen, Anregungen und Verbesserungsvorschläge würde ich mich – wie immer – freuen!

Anhang

Hier noch einmal das komplette script. Zum Herunterladen bitte diesen link benutzen.

(* Start workflow for a blog article.

Creates an empty text file for the article and a project containing some configurable tasks for the required steps.
The project will be moved to list "Someday". In case one of the tasks is configured to show up in "Today", the project will be moved to "Next".
If you don't have Growl or you dont't want notifications please remove the block 'tell application "Growl"'.

The script allows for / needs some configuration.
  theArea: specify the Things area your tasks shall be assigned to.
  thePath: specify the path where the initial file for your text shall be created.
  steps: the tasks that shall be created. See section 'tell application "Things"' for more details.

Known issues:
- The link generated using filepath does not use the specified label, but the base name of the file. No big issue for me, just a miracle :-)

2011-12-30 sbraun
sb@action.ms
https://denkenswert.wordpress.com
*)

-- specify area to assign the project to
set theArea to "Blog Denkenswert"

-- specify path for creation of article text file
set thePath to "Macintosh HD:Users:sb:Dropbox:Documents:Business:Blog denkenswert"

-- ask user for title
display dialog "Bitte Titel des Artikels eingeben" default answer ¬
	"Artikel" buttons ¬
	{"OK", "Cancel"} default button 1 ¬
	with icon note
if button returned of result = "OK" then
	set theTitle to text returned of result
end if

tell application "System Events"
	set theFile to thePath & ":" & theTitle & ".txt"
	set newArticle to open for access file theFile with write permission
	write "#" & theTitle to newArticle
	close access newArticle
	set fileInfo to properties of alias theFile
	set filePath to POSIX path of fileInfo
	set linkToFile to ("[filepath=" & filePath & "]link zur Datei[/filepath]")
end tell

-- create tasks in Things
tell application "Things"
	(* Configure the tasks to create.
        Each record consists of these fields:
           - id: name of the workflow step. Will be appended to the task identifier
           - todayList: set to true if this task shall be created in the Today list
           - notes: any string that shall go into the task's note section.
      *)
	set steps to {{id:"schreiben", todayList:false, notes:linkToFile}, {id:"fertig machen", todayList:false, notes:null}, {id:"posten", todayList:false, notes:null}}
	set newProject to make new project at beginning of area theArea
	set name of newProject to "Artikel " & theTitle
	move newProject to list "Someday"
	repeat with step in steps
		set newTask to make new to do at beginning of project (name of newProject)
		set name of newTask to "Artikel " & theTitle & " " & id of step
		if notes of step is not null then
			set notes of newTask to (notes of step)
		end if
		if todayList of step is true then
			move newProject to list "Next"
			move newTask to list "Today"
		end if
	end repeat
end tell-- notify user after completion
tell application "Growl"
	-- register once, but it's also ok to register multiple times
	register as application "Start Blog Workflow" all notifications {"Setup"} default notifications {"Setup"}
	notify with name "Setup" title "Tasks erzeugt" description "Workflow für Artikel " & theTitle & " ist aufgesetzt." application name "Start Blog Workflow"
end tell
%d Bloggern gefällt das: