Automatische Erinnerungen einrichten

Hallo Community,

ich habe mir die letzten Tage DT eingerichtet und bin nun bei den Automatisierungen.

Punkt 1 der mich momentan sehr stört. Das man keine Gruppen für die intelligenten Regeln erstellen kann, da verliert man so sehr die Übersicht oder legt Regeln teils doppelt an. Nicht so schön.

Aber jetzt zu meiner Hauptfrage:

Ich würde gerne einem Dokument ein Etikett geben “Erinnerung”, hiernach soll ein Skript starten und dies automatisch an meine Erinnerung App weiter geben. Es gibt hierfür ja ein Skript, was ich händisch starten kann, aber ich stelle mich mit der Programmierung einfach zu doof an um es in die intelligente Regel einzufügen.
Und dazu sei gesagt, ich bin kein Programmierer, kenne mich mit Apple Skripten leider nicht wirklich aus. Vielleicht kann mir hier jemand helfen, oder ggf ein Skript senden, wo ich nur meine Liste eintragen kann, oder halt eine Erklärung wie ich die vorgefertigten Skripte verwenden könnte.
Vielen Dank

Gruß Michael

Wie man das macht, ist in der Dokumentation beschrieben (zugänglich über den Menüpunkt “Hilfe”, Abschnitt “Automation”).
Wenn Du damit nicht weiterkommst, solltest Du Dein Vorgehen genauer beschreiben, mit den dabei erzielten Ergebnissen etc. Dabei können Screenshots von der Regel ebenfalls helfen. Und auch welches Script du überhaupt meinst – eines der externen, die man zu einer Regel hinzufügen kann, oder ein anderes (welches)?

:confused: okay habe grob was dazu gefunden, aber direkt weiter komme ich nicht. Mein Vorhaben:
Habe ein Dokument “Rechnung”, dies liegt im Eingang. Nun möchte ich ein Etikett vergeben.
Etikett “zu erledigen”.
Jetzt soll eine intelligente Regel starten.

als Skript wollte ich nun ein vorgefertigtes Skript starten lassen

Dies muss ich aber irgendwie als Skript sprache einsetzen, aber so tief bin ich in der Materie nicht drin :confused:

Und als Ergebnis soll dieses Dokument nun als Aufgabe in “Erinnerungen” angezeigt werden, für den nächsten Tag.

Weswegen ich die Lektüre des Handbuchs empfahl. Hast Du da so gar nichts zu Deinem Problem gefunden?

Ich lese ungern vor, aber in erster Näherung würde ich mal statt “AppleScript” in der Regel “Extern” auswählen. Und dann mal schauen, was Dir da angeboten wird. Vielleicht ist da schon was Passendes dabei.

Wenn nicht, müsstest Du Dir das Gewünschte bauen (oder bauen lassen). Das von Dir erwähnte Script eignet sich eher nicht für eine Smart Rule, da es auf eine Benutzereingabe wartet. Man kann es vielleicht als Ausgangspunkt nehmen, um sich das Gewünschte zu bauen.

Ich habe es nun so ausgeführt wie du es beschrieben hattest.
Ich habe etwas dazu gefunden, allerdings harkt es bei mir dort, wo in der intelligenten Regel steht Skript bearbeiten

Dann kommt dieses Fenster

Und dort weiß ich leider nicht, wie ich das Skript dort einfügen kann. Ich kann durch mein Grundwissen einstellen das es für einen Tag später eingestellt werden soll. aber irgendwelche Fehler bleiben, die ich selber nicht sehe und nachverfolgen kann, da scheitert es mit meinem Wissen.

Ich habe mir dieses Skript halt EINFACH genommen und ein copy paste gemacht. Aber die Meldungen die dann kommen, kann ich leider nicht nachverfolgen.

-- Script to add a selected record to Reminders as a to do
-- Written by Eric Böhnisch-Volkmann, Version 1.1, Sep 12, 2012
-- © 2010–2014 DEVONtechnologies, LLC
-- Modified October 28, 2016 by Jim Neumann / BLUEFROG / DEVONtechnologies, LLC
--> Added Custom Date option


-- Set properties
property pDaysIntoFuture : -1 -- Created to do will have a due date n days in the future
property pPrefix : "Reminder" -- Prefix for the created to do item
property pDelays : {{displayname:"No due date", value:0}, {displayname:"Custom…", value:-1}, {displayname:"Tomorrow", value:1 * days}, {displayname:"In two days", value:2 * days}, {displayname:"In three days", value:3 * days}, {displayname:"In one week", value:1 * weeks}, {displayname:"In two weeks", value:2 * weeks}, {displayname:"In one month", value:4 * weeks}, {displayname:"In two months", value:8 * weeks}, {displayname:"In three months", value:90 * days}, {displayname:"In six months", value:180 * days}, {displayname:"In one year", value:365 * days}}
property pDefaultDelay : "In one week"

set theDueDate to ""

-- Import helper library
tell application "Finder" to set pathToAdditions to ((path to application id "DNtp" as string) & "Contents:Resources:Template Script Additions.scpt") as alias
set helperLibrary to load script pathToAdditions

try
	-- Get the selection
	tell application id "DNtp" to set thisSelection to the selection
	
	-- Error handling
	if thisSelection is {} then error localized string "Please select a document or group, the try again."
	if (length of thisSelection) > 1 then error localized string "Please select only one document or group, then try again."
	
	-- Get and format the data we need
	set pLocalizedPrefix to localized string pPrefix
	tell application id "DNtp"
		set thisItem to first item of thisSelection
		set theSummary to (pLocalizedPrefix & ": " & name of thisItem) as string
		set theURL to (reference URL of thisItem) as string
	end tell
	
	-- Let the user choose the reminder list
	tell application "Reminders"
		set theListNames to {}
		repeat with theList in the lists
			set theListNames to theListNames & {name of theList}
		end repeat
	end tell
	if (count of theListNames) = 0 then error (localized string "Please set up at least one list in Reminders.")
	set theChoice to choose from list theListNames with title (localized string "Choose list") default items {item 1 of theListNames}
	if theChoice is false then return false -- If the user pressed Cancel, exit
	if theChoice is missing value or class of item 1 of theChoice is not text then return false
	set theChosenListName to item 1 of theChoice
	
	-- Let the user choose when to receive the reminder
	-- Convert array into localized arrays
	set pLocalizedDelays to {}
	set pLocalizedDelayNames to {}
	repeat with theDelay in pDelays
		set pLocalizedDelays to pLocalizedDelays & {{displayname:localized string (displayname of theDelay), value:(value of theDelay)}}
		set pLocalizedDelayNames to pLocalizedDelayNames & {localized string (displayname of theDelay)}
	end repeat
	set theChoice to choose from list pLocalizedDelayNames with title (localized string "Set reminder") with prompt (localized string "Please choose when you want to get reminded of the item") & " \"" & theSummary & "\"" & (localized string "%choice prompt end%") & ":" default items {localized string pDefaultDelay}
	if theChoice is false then return false -- If the user pressed Cancel, exit
	set theDelayValue to pDaysIntoFuture -- Assume default
	try
		-- Find the number of days associated with the user's choice
		repeat with theDelay in pLocalizedDelays
			if ((displayname of theDelay) as string) is equal to (theChoice as string) then set theDelayValue to (value of theDelay)
		end repeat
	end try
	
	-- Calculate due date
	if theDelayValue > 0 then
		set theDueDate to (date (date string of (current date))) + theDelayValue
	else if theDelayValue < 0 then
		try
			set theDueDate to (date (text returned of (display dialog (localized string "Enter the due date") & ":" & return & (localized string "Example: 1/1/2017 10:45pm") default answer "")))
		on error
			return
		end try
	end if
	
	-- Add new to do to Reminders
	tell application "Reminders"
		tell list theChosenListName
			--Create new to do
			if theDueDate ≠ "" then
				set theEvent to make reminder with properties {name:theSummary, remind me date:theDueDate, body:theURL}
			else
				set theEvent to make reminder with properties {name:theSummary, body:theURL}
			end if
			show theEvent -- Show new to do item in Reminders so that the user can edit it right away
			activate
		end tell
	end tell
	
on error errMsg
	
	display alert (localized string "Error when adding item to Reminders") message errMsg
	
end try

In extern ist leider nichts drin, was ich hierfür nutzen könnte.
Danke schonmal

Nö. Ich hatte von „extern“ gesprochen und erklärt, warum das mitgelieferte Script nur ein Ausgangspunkt sein kann.
Man muss mE ein neues Script schreiben, das ohne Benutzereingriff auskommt und mehrere Dokumente nacheinander verarbeitet.

So, nach Stunden der Recherche und ner Menge testen usw. hier das Ergebnis für andere, die es sich gerne ebenfalls so einrichten möchten.
Erinnerung nach 3 Tagen und 8 Uhr morgens

on performSmartRule(theRecords)
	tell application id "DNtp"
		
		set theDelayValue to (3 * days) + 28800
		
		
		set theNewDate to (date string of (current date))
		set theDueDate to my convertDate(theNewDate)
		set theDueDate to theDueDate + theDelayValue
		
		repeat with theRecord in theRecords
			try
				set theSummary to ("Reminder: " & name of theRecord) as string
				set theURL to (reference URL of theRecord) as string
				
				tell application "Reminders"
					set theListNames to {}
					repeat with theList in the lists
						set theListNames to theListNames & {name of theList}
					end repeat
				end tell
				if (count of theListNames) = 0 then error ("Please set up at least one list in Reminders.")
				
				
				set theChosenListName to item 1 of theListNames
				
				
				tell application "Reminders"
					tell list theChosenListName
						
						if theDueDate ≠ "" then
							set theEvent to make reminder with properties {name:theSummary, remind me date:theDueDate, body:theURL}
						else
							set theEvent to make reminder with properties {name:theSummary, body:theURL}
						end if
						
					end tell
				end tell
				
			on error errMsg
				display alert ("Fehler beim Erstellen") message errMsg
			end try
		end repeat
	end tell
end performSmartRule

on convertDate(theNewDate)
	return date theNewDate
end convertDate
1 Like

Glückwunsch!
Am Anfang bin ich etwas irritiert von der Datums-Konvertierung (aber ich habe keine Ahnung von AppleScript, also ignoriere meine Anmerkungen ggfs. einfach).

  • current date ist vom Typ Date (hoffe ich)
  • date string of current date sollte ein String sein
  • theDueDate ist dann im ersten Schritt das aus dem String erzeugte Date-Objekt
  • Das sollte aber eigentlich™ genau current date sein.

Etwas klarer wäre (mE!) das hier

set newDate to (current date + days * 3 + 28800)
set hours of newDate to 8
set minutes of newDate to 0

reference URL of theRecord) as string scheint mir etwas übertrieben, da die reference URL ohnehin vom Typ text ist.

Die Abfrage, ob es überhaupt eine Erinnerungsliste gibt, ist ein bisschen umständlich. Ein einfaches
if lists = {} then error ...
sollte (denke ich) reichen. Die Namen der Listen interessieren dich ja gar nicht.
Außerdem würde ich mir diesen Test ganz sparen – es ergibt ja gar keinen Sinn, ein Script für das Eintragen in Erinnerungen zu haben, wenn es keine Erinnerungen-Liste gibt. Außerdem: Gibt es wirklich keine solche Liste, bekommst Du für jeden Datensatz die Fehlermeldung. Das ist nicht schön. Ich denke
set theChosenListName to name of item 1 of lists
reicht.

Zweimal tell hintereinander für dieselbe App (hier “Reminders”) ist nicht nötig, das kann an alles in einem tell-Block abhandeln.

Die Abfrage auf dueDate ≠ "" ist sinnlos, nachdem Du am Anfang dueDate gesetzt hast. Wenn nach all dem diese Variable immer noch leer wäre, hättest Du ein wirklich großes Problem.

Den ganzen try-on error-Block würde ich rauswerfen. Im laufenden Betrieb bringt das nix.

Zum Spaß das Ganze noch mal in JavaScript. Darin werden auch die Invarianten, also die Bestimmung des Zieldatums und der Zielliste, außerhalb der Schleife über die Datensätze erledigt – diese Daten ändern sich nie, deshalb ist es unsinnig, sie innerhalb dieser Schleife zu ermitteln.

function performsmartrule(records) {
  const dt = Application('DEVONthink 3');
  const rem = Application('Reminders');
  if (rem.lists().length === 0) return;

  /* Erinnerungen in erster Liste setzen */
  const reminderList = rem.lists[0];

  /* Erinnerungsdatum einstellen: Drei Tage von jetzt, 8:00 */
  let dueDate = new Date();
  dueDate.setDate(dueDate.getDate() + 3);
  dueDate.setHours(8);
  dueDate.setMinutes(0);

  /* Über alle DT-Datensätze laufen */
  records.forEach(r => {
    const URL = r.referenceURL();
	const summary = `Reminder: ${r.name()}`;

  /* Neues Ereignis anlegen */
	const event = rem.Reminder({name: summary, remindMeDate: dueDate, body: URL});

  /* Ereignis an die default-Liste anhängen */
	reminderList.reminders.push(event);
  })
}

Ja, sehr schön. Das funktioniert auch :slight_smile:
Und ist bestimmt einfacher als meins. Aber ich habe es aus mehreren verschiedenen Seiten zusammen gewürfelt und solange probiert, bis es geklappt hat.
Du hast es aber gut erklärt und vielen dank für die verbesserte Version.
Hab ich mir schon so oft durchgelesen, was die Programmiersprachen wie und wo bedeuten, aber da ich damit zu selten arbeite, bleibt es einfach nicht sitzen.

Wie andere Sprachen auch – mit der Übung kommt die Routine.

1 Like