Skript statt Handarbeit: wiederkehrende Aufgaben mit Python oder Node.js
Welche wiederkehrenden Büroaufgaben sich für ein kleines Skript eignen, wie so ein Skript in Python oder Node.js aussieht und worauf es beim Betrieb ankommt.
- Veröffentlicht
- Autor
- Mario Gvozden
- Lesezeit
- 7 Minuten
- Leistung
- Programmierung
In vielen Firmen gibt es eine Tätigkeit, die jemand jeden Montag oder jeden Monatsersten erledigt: zwei Exporte in Excel nebeneinanderlegen und Abweichungen markieren, Dateien nach einem Schema umbenennen, Daten aus einem System holen und in ein anderes kopieren. Das dauert jeweils nicht lange, aber es wiederholt sich, ist fehleranfällig und bleibt liegen, wenn die zuständige Person im Urlaub ist.
Für solche Aufgaben braucht es kein Projekt und oft auch kein Automatisierungswerkzeug mit laufenden Lizenzkosten. Ein Skript mit wenigen Dutzend Zeilen reicht.
Woran Sie eine geeignete Aufgabe erkennen
Ein Skript lohnt sich, wenn diese Punkte zutreffen:
- Die Aufgabe folgt festen Regeln, die man aufschreiben kann.
- Die Eingaben haben ein stabiles Format, etwa ein CSV-Export, der immer gleich aufgebaut ist, oder eine API.
- Das Ergebnis ist klar: eine Datei, eine Liste, eine E-Mail, ein Eintrag in einem System.
- Die Aufgabe wiederholt sich regelmäßig.
Weniger geeignet sind Aufgaben, bei denen jedes Mal ein Mensch abwägen muss, oder bei denen die Eingaben jedes Mal anders aussehen, etwa frei formulierte E-Mails. Dafür gibt es andere Werkzeuge, zum Beispiel Workflows mit Fehlerbehandlung oder die Auswertung per KI.
Typische Kandidaten:
| Aufgabe | Eingabe | Ergebnis |
|---|---|---|
| Bestellungen ohne Rechnung finden | Shop-Export und Buchhaltungs-Export (CSV) | Liste der Abweichungen |
| Scans umbenennen | Ordner mit PDFs | Dateinamen nach Datum und Kunde |
| Lagerbestand melden | API des Warenwirtschaftssystems | E-Mail mit Artikeln unter Mindestbestand |
| Monatsreport | Datenbankabfrage | Excel-Datei im Teamordner |
Ein Beispiel in Python: zwei Exporte abgleichen
Angenommen, Sie exportieren jeden Montag die Bestellungen aus dem Shop und die Rechnungen aus der Buchhaltung und suchen von Hand nach Bestellungen, zu denen noch keine Rechnung existiert. Das folgende Skript erledigt das mit der Standardbibliothek von Python, ohne zusätzliche Pakete:
import csv
import sys
from pathlib import Path
def read_ids(path: Path, column: str) -> dict[str, dict]:
with path.open(newline="", encoding="utf-8-sig") as f:
rows = csv.DictReader(f, delimiter=";")
return {row[column].strip(): row for row in rows if row[column].strip()}
def main() -> int:
orders = read_ids(Path("bestellungen.csv"), "Bestellnummer")
invoices = read_ids(Path("rechnungen.csv"), "Bestellnummer")
missing = [orders[nr] for nr in sorted(orders.keys() - invoices.keys())]
with open("ohne_rechnung.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["Bestellnummer", "Datum", "Betrag"],
delimiter=";", extrasaction="ignore")
writer.writeheader()
writer.writerows(missing)
print(f"{len(missing)} Bestellungen ohne Rechnung")
return 0
if __name__ == "__main__":
sys.exit(main())
Ein paar Details, die in der Praxis wichtig sind:
encoding="utf-8-sig"liest auch CSV-Dateien, die Excel mit einem unsichtbaren BOM-Zeichen am Anfang speichert, und schreibt die Ergebnisdatei so, dass Excel Umlaute korrekt anzeigt.delimiter=";"entspricht dem, was deutsche Excel-Versionen standardmäßig erzeugen..strip()entfernt Leerzeichen, die beim Export gern an Nummern hängen und sonst zu falschen Abweichungen führen.
Dasselbe Prinzip in Node.js: Daten aus einer API holen
Liegt Ihr Team ohnehin im JavaScript-Umfeld, ist Node.js eine gute Wahl. Ab Node.js 18 ist fetch eingebaut. Das folgende Skript fragt Artikel aus einer API ab und schreibt alle mit zu niedrigem Bestand in eine CSV-Datei:
import { writeFile } from "node:fs/promises";
const API_URL = process.env.WAWI_API_URL;
const API_KEY = process.env.WAWI_API_KEY;
const res = await fetch(`${API_URL}/articles`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!res.ok) {
console.error(`API-Fehler: ${res.status} ${res.statusText}`);
process.exit(1);
}
const articles = await res.json();
const low = articles.filter(a => a.stock < a.minStock);
const csv = [
"Artikelnummer;Bezeichnung;Bestand;Mindestbestand",
...low.map(a => [a.sku, a.name, a.stock, a.minStock].join(";")),
].join("\n");
await writeFile("nachbestellen.csv", "" + csv, "utf8");
console.log(`${low.length} Artikel unter Mindestbestand`);
Die Datei wird als .mjs gespeichert (oder im Projekt mit "type": "module"), damit import und await auf oberster Ebene funktionieren. Der Endpunkt und die Feldnamen sind hier Platzhalter; sie hängen von Ihrem System ab. Bezeichnungen, die selbst ein Semikolon enthalten können, müsste man zusätzlich in Anführungszeichen setzen.
Zwei Dinge sind hier wichtiger als die eigentliche Logik: Der API-Schlüssel steht nicht im Code, sondern in einer Umgebungsvariable. Und bei einem Fehler der API bricht das Skript mit einem Exit-Code ungleich null ab, statt stillschweigend eine leere Datei zu schreiben.
Wo das Skript läuft
Ein Skript ist erst dann eine Entlastung, wenn es ohne jemanden läuft, der daran denkt. Die üblichen Optionen:
Auf einem Server mit cron. Ein Eintrag wie der folgende startet das Skript jeden Montag um 7 Uhr:
0 7 * * 1 cd /opt/abgleich && /usr/bin/python3 abgleich.py >> abgleich.log 2>&1Auf einem Windows-Rechner mit der Aufgabenplanung. Funktioniert, setzt aber voraus, dass der Rechner zur geplanten Zeit an ist.
Als geplanter Job in der Cloud, etwa mit GitHub Actions (
schedule), einer Cloud-Funktion oder dem Cron-Feature Ihres Hosters.Von Hand per Doppelklick. Klingt unspektakulär, ist aber für Aufgaben, die ohnehin ein Mensch anstößt, oft die vernünftigste Lösung.
Was ein Skript im Betrieb braucht
Damit Sie das Skript auch in einem Jahr noch nutzen können, gehören ein paar Dinge dazu, die über den Code hinausgehen:
- Eine kurze Anleitung: Was macht das Skript, wie startet man es, welche Dateien erwartet es?
- Konfiguration über Umgebungsvariablen oder eine Konfigurationsdatei, nicht im Code.
- Verständliche Fehlermeldungen, wenn eine Datei fehlt oder eine Spalte umbenannt wurde.
- Ein Log, damit man sieht, ob es gelaufen ist.
- Bei regelmäßigen Läufen: eine Benachrichtigung, wenn etwas schiefgeht.
- Ein fester Ablageort, am besten in einem Repository.
Ein häufiger Grund, warum Skripte aufgegeben werden, ist kein Programmierfehler, sondern ein geänderter Export. Eine Spalte heißt plötzlich anders, und das Skript liefert Unsinn. Eine Prüfung am Anfang, ob alle erwarteten Spalten vorhanden sind, verhindert das.
Wann ein Skript nicht die richtige Lösung ist
Ein Skript ist nicht immer die beste Wahl. Prüfen Sie Alternativen, wenn einer dieser Punkte zutrifft:
- Mehrere Systeme sollen in Echtzeit reagieren, etwa wenn eine neue Bestellung sofort eine Rechnung und eine Slack-Nachricht auslösen soll. Dafür sind Workflow-Werkzeuge wie n8n, Make oder Zapier mit ihren fertigen Anbindungen und der Wiederholung bei Fehlern oft besser geeignet.
- Fachabteilungen sollen den Ablauf selbst anpassen. Ein Workflow mit grafischer Oberfläche ist für Nicht-Entwickler zugänglicher als Code.
- Die Eingaben sind unstrukturiert, etwa frei formulierte E-Mails oder eingescannte Belege mit wechselndem Aufbau. Dann braucht es Texterkennung oder ein Sprachmodell, und das Skript wird zum kleineren Teil der Lösung.
- Niemand kann das Skript pflegen. Wenn in Ihrem Umfeld niemand Python oder JavaScript lesen kann, muss die Dokumentation umso besser sein, oder ein Dienstleister muss erreichbar bleiben.
Umgekehrt spricht für ein Skript, dass es keine laufenden Lizenzkosten verursacht, in Ihrem Repository versioniert werden kann und keine Daten an zusätzliche Anbieter weitergibt.
Python oder Node.js?
Die Wahl ist weniger wichtig, als oft diskutiert wird. Python ist stark bei Dateien, Tabellen und Datenauswertung, und auf vielen Servern bereits installiert. Node.js passt gut, wenn Ihre Web-Anwendung ohnehin in JavaScript oder TypeScript geschrieben ist und das Skript dieselben Bibliotheken nutzen soll. Entscheidend ist, dass jemand in Ihrem Umfeld die Sprache lesen kann.
Häufige Fragen
Welche Büroaufgaben eignen sich für ein Skript?
Aufgaben, die festen Regeln folgen, stabile Eingaben haben, ein klares Ergebnis liefern und sich regelmäßig wiederholen. Typische Beispiele sind der Abgleich zweier Exporte, das Umbenennen von Scans nach einem Schema oder ein Monatsreport aus einer Datenbank. Weniger geeignet sind Aufgaben, bei denen jedes Mal ein Mensch abwägen muss oder die Eingaben jedes Mal anders aussehen.
Wo läuft ein Skript, ohne dass jemand daran denken muss?
Zum Beispiel auf einem Server mit cron, auf einem Windows-Rechner mit der Aufgabenplanung oder als geplanter Job in der Cloud, etwa mit GitHub Actions. Für Aufgaben, die ohnehin ein Mensch anstößt, kann auch der Start per Doppelklick die vernünftigste Lösung sein. Bei regelmäßigen Läufen gehören ein Log und eine Benachrichtigung bei Fehlern dazu.
Wann ist ein Workflow-Werkzeug besser als ein Skript?
Wenn mehrere Systeme in Echtzeit reagieren sollen oder Fachabteilungen den Ablauf selbst anpassen möchten. Werkzeuge wie n8n, Make oder Zapier bringen fertige Anbindungen, Wiederholung bei Fehlern und eine grafische Oberfläche mit. Für ein Skript spricht dagegen, dass es keine laufenden Lizenzkosten verursacht und keine Daten an zusätzliche Anbieter weitergibt.
Ein Skript für eine klar beschriebene wiederkehrende Aufgabe ist bei uns typischerweise eine Aufgabe auf Ihrem Board: mit README zu Installation, Aufruf und Zeitsteuerung, geliefert als Pull Request in Ihr Repository oder in einen freigegebenen Ordner. Sobald wir beginnen, stehen die Abnahmekriterien auf der Karte; geliefert wird 48 Stunden nach Start – gezählt von Montag 8 Uhr bis Freitag 16 Uhr –, vorher geprüft und freigegeben von einem Senior-Entwickler. Den typischen Umfang zeigt der Leistungskatalog. Die erste Aufgabe ist kostenlos, eine pro Unternehmen: Erste Aufgabe anlegen, am besten mit einer Beispieldatei. Für weitere Skripte und Anpassungen, etwa wenn ein Export umgebaut wird, ist das Prozess-Abo der passende Rahmen: Sie schreiben die Änderung als neue Karte auf, wir setzen sie um. Fragen vorab klären wir gern in einem kostenlosen Projekt-Check.
Die erste Aufgabe ist kostenlos – eine pro Unternehmen. Sie legen einen Workspace an, geben Zugang per Einladung und schreiben die Aufgabe auf Ihr Board. Wir liefern sie 48 Stunden nach Start, gezählt Mo 8 bis Fr 16 Uhr: Start am Montag um 10 Uhr – Lieferung am Mittwoch um 10 Uhr. Jede Lieferung prüft und gibt ein Senior-Entwickler frei, bevor sie zu Ihnen geht.
Danach im Prozess-Abo: Sie schreiben Aufgaben aufs Board und bestimmen die Reihenfolge, wir setzen sie um. Prozess-Abo 1: 1.000 € im Monat, 1 Aufgabe gleichzeitig in Arbeit, bis zu 1 Aufgaben pro Monat; Prozess-Abo 2,5: 2.500 € im Monat, 1 Aufgabe gleichzeitig in Arbeit, bis zu 4 Aufgaben pro Monat; Prozess-Abo 5: 5.000 € im Monat, 1 Aufgabe gleichzeitig in Arbeit; Prozess-Abo 10: 10.000 € im Monat, 2 Aufgaben parallel in Arbeit. Gezählt werden die Aufgaben, die wir im Abrechnungsmonat beginnen; eine Nachbesserung zählt nicht neu. Nicht genutzte Aufgaben verfallen am Monatsende. Preise zzgl. MwSt., nur für Unternehmen, monatlich kündbar – das Abo beginnt nur, wenn Sie es bestellen.
Fragen vorab oder mehr Aufgaben parallel? Im kostenlosen Projekt-Check (30 Minuten) klären wir das, auch für ein individuelles Abo.