Zum Inhalt springen

Export-Skripte

Wenn der eingebaute CSV-Export nicht reicht, kannst du in NowDoing eigene Export-Skripte in JavaScript schreiben. Damit lassen sich beliebige Formate erzeugen: CSV-Varianten, JSON, JSON Lines, Markdown-Tagesnotizen, HTML-Reports oder Abrechnungs-Payloads für dein Buchhaltungssystem.

Einstellungen → Export-Skripte → „Editor öffnen…” startet einen vollständigen Editor in einem eigenen Fenster.

Der Editor basiert auf CodeMirror 6 in einer WKWebView und bringt mit:

  • Syntax-Highlighting für JavaScript
  • Zeilennummern und Klammern-Matching
  • Suche mit ⌘F
  • Light/Dark-Theme passend zum System
  • Shortcuts: ⌘↩ Run, ⌘S Save

Die Ausgabe erscheint in einem Text-Pane unterhalb des Editors. ⌘C kopiert sie, „Speichern als…” schreibt sie in eine Datei.

Skripte laufen in einem JSContext komplett offline:

  • kein DOM
  • kein fetch
  • kein Datei-I/O
  • Soft-Timeout 5 Sekunden Wall-Clock — Runaway-Skripte werden abgebrochen

Vorinjiziert in jeden Lauf:

HelperZweck
csvRow(values)Escapt RFC-4180-konform und gibt eine CSV-Zeile zurück
groupBy(items, key)Gruppiert Arrays nach Schlüssel
formatDate(date, format)Formatiert ein Datum
console.log(...)Schreibt ins Output-Pane

Das vollständige Save-File-Modell wird an dein Skript übergeben — alle Einträge, Aktivitäten, Gruppen, wiederkehrende Vorlagen, Export-Skripte und Metadata wie Notizen, Verrechnungsnummern und Farben. Die formale Beschreibung steht im JSON-Schema unter Spezifikationen.

Beim Anlegen eines neuen Skripts kannst du eine Vorlage als Startpunkt wählen:

VorlageZweck
CSV (Standard)Wie der eingebaute CSV-Export, als Startpunkt zum Anpassen
Markdown Daily-NoteTageszusammenfassung als Markdown für Obsidian, Bear oder Notion
Markdown WochenrückblickWochenreport mit Aktivitätsgruppierung
JSON Lines (NDJSON)Eine Zeile pro Eintrag, ideal für Pipelines
const today = entries.filter(e => e.date === input.date);
const lines = today.map(e =>
`- ${formatDate(e.start, "HH:mm")}${formatDate(e.end, "HH:mm")} **${e.activity}** ${e.note ?? ""}`
);
return `# ${input.date}\n\n${lines.join("\n")}`;

input.date kommt aus dem Eingabefeld über dem Editor, entries ist das vorgeladene Daten-Array.

Export-Skripte laufen ausschließlich lokal in der App. Die Sandbox erlaubt keinen Netzwerkzugriff und kein Datei-I/O — der einzige Weg, Output zu persistieren, ist der manuelle „Speichern als…”-Dialog. Deine Daten verlassen den Mac nicht.