Erinnerung für mehrere Termine im iCal

floeru

Mitglied
Thread Starter
Dabei seit
10.10.2004
Beiträge
52
Reaktionspunkte
0
Hallo experts! :)

Habe heute schon wieder beinahe einen Geburtstag verpasst, weil bei den Geburtstag-Serientermine im iCal keine Erinnerung eingestellt ist.

Jetzt möchte ich bei sämtlichen Terminen mit "Geburtstag" im Titel eine "Message with Sound" und "the day before at 20:00" erstellen. Selbstverständlich für "All further events". Nur ist das bei ca. 50 dieser Termine doch recht aufwändig.

Gibt dafür ein AppleScript? Mit dem Automator kann man scheinbar keine Termine abändern. Ich bin ein absoluter Noob (switcher ;)) auf diesem Gebiet.
 
...

Hallo floeru,

Gibt dafür ein AppleScript?

Jetzt ja ;)

Code:
set all_calendars to {}
set this_calendars to {}
set the_trigger_time to {-240}
set the_recurrence to {"FREQ=YEARLY;INTERVAL=1"}

tell application "iCal"
	set this_calendars to calendars whose writable is true
	repeat with i from 1 to count of this_calendars
		copy title of item i of this_calendars to end of all_calendars
	end repeat
end tell

set the_choice to choose from list all_calendars with prompt "Wählen Sie den Geburtstags-Kalender aus" OK button name "OK" without multiple selections allowed and empty selection allowed

if the_choice is not false then
	set this_calendar to item 1 of the_choice
end if
set name_calendar to this_calendar
set i to 1
repeat with an_item in all_calendars
	if item i of all_calendars is equal to name_calendar then
		set the_id to i
		exit repeat
	end if
	set i to i + 1
end repeat

set current_calendar to item the_id of this_calendars

tell application "iCal"
	activate
	display dialog "Alte Alarmzeiten entfernen?" buttons {"Ja", "Nein"} default button 2
	copy the result as list to {remove_old_alarms}
	repeat with i from 1 to count events in current_calendar
		set this_event to event i of current_calendar
		if remove_old_alarms is equal to "Ja" then
			repeat with j from 1 to count sound alarms in this_event
				delete last sound alarm of this_event
			end repeat
		end if
		set recurrence of this_event to item 1 of the_recurrence
		make new sound alarm at end of sound alarms of this_event with properties {trigger interval:(item 1 of the_trigger_time)}
	end repeat
	
end tell

Gruß Andi
 
Vielen Dank Andi für deine Hilfe! :)

Dein Script hat sehr gut funktioniert, ehrlich gesagt sogar zu gut! ;) Etwas voreilig habe ich das Script auf den "Privat" Kalender ausgeführt weshalb jetzt sämtliche Termine zu einer Serie wurden, was natürlich nicht beabsichtigt war. Tja, und ich Noob habe natürlich kein Backup von meinem Kalender gemacht! :rolleyes: Shame on me!

Ich habe erst anschliessend gemerkt, dass ich ja mit dem Adressbook automatisch Geburtstage erstellen kann. Das habe ich dann aber gemacht und alle alten Geburtstagstermine gelöscht. Allerdings ist auch bei diesen Terminen keien Erinnerung eingestellt, weshalb ich dein Script so oder so brauchen kann.

Anyway, jetzt versuche ich die Sache natürlich wieder gerade zu biegen, also die ungewollten Serientermine zu löschen. Mit dem Automator will das irgendwie nicht richtig klappen da die Termine IMHO ziemlich willkürlich selektiert werden. Ich möchte nur gewisste Termine ab November 2006 löschen, doch es werden auch ältere Termine gelöscht.

Es wäre wohl am einfachsten, dein Script so anzupassen, dass bei allen Terminen die Wiederholung und die Erinnerung gelöscht wird. Leider habe ich nicht herausgefunden, wie ich den Code hier anpassen muss:
Code:
set the_recurrence to {"FREQ=YEARLY;INTERVAL=1"}

Anschliessend kann ich ja dann wieder das urspünchlie Script anwenden. Nur: Bei der Auswahl des Kalenders kann ich nur zwischen Büro und Privat wählen. Der von iCal automatisch erstellte Birthdays Kalender steht dort komischerweise nicht zur Auswahl??

Irgendwie bin ich bei der ganzen Sache noch mehr überfordert, als wenn ich jeweils versuche mit Visual Basic ein Excel Makro zu programmieren! :D

Hoffentlich kannst du mir aus der Patsche helfen! :)
 
...

Hallo floeru,

der Geburtstagskalender von iCal ist schreibgeschützt darum taucht der auch nicht in der Auswahlliste auf.
set this_calendars to calendars whose writable is true
Ich bin auch davon ausgegangen, du hast den Kalender mit diesem Skript erstellt, welches traurigerweise mit der neuen iCal Version gar nicht funktioniert. Oder mit diesem Tool welches auch nicht funktioniert.

Nunja du hast richtig erkannt, was geändert werden muss. Tut mir auch leid, dass ich mich erst jetzt melde. Ich konnte es auch nicht ändern :rolleyes:
Logisch wäre ja
set the_recurrence to {""}
das wird aber nicht angenommen. Man kann alle möglichen gültigen Wiederholungen eintragen, aber nicht ohne :(
Da bin ich ehrlich gesagt stinkesauer darüber.

Ich kann dir folgende Möglichkeit anbieten, das Problem zu beheben.
Als erstes setzt du -- vor die Zeile " make new sound alarm at end of sound alarms of this_event with properties {trigger interval:(item 1 of the_trigger_time)}" damit wird diese Anweisung zu einem Kommentar und nicht ausgeführt.
Du lässt das Skript noch mal über den Kalender "Privat" laufen und bestätigst "Alte Alarme löschen".

Nun beendest du iCal!

Um die Wiederholung zu löschen, gehst du ins Verzeichnis ~/Library/Application Support/iCal/Sources/ in deinem Userverzeichnis. Dort liegen die Kalender in Ordnern mit kryptischer Bezeichnung (hasse ich auch sowas). Um den Kalender Privat zu finden, öffnest du die Ordner der Reihe nach und ziehst jeweils die Datei "Info.plist" auf das TextEdit (in Programme) Icon um es zu öffnen.
Es muss so:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Key</key>
<string>F7BCC920-BA61-43A1-B635-3C7FD7191099</string>
<key>Title</key>
<string>Privat</string>
<key>Type</key>
<string>com.apple.ical.sources.naivereadwrite</string>
</dict>
</plist>
aussehen.
In diesem Ordner befindet sich auch ein File namens "corestorage.ics" das Ist die eigentliche Kalenderdatei. Diese ziehst du auch auf das TextEdit Icon um es zu öffnen. Mit apfel-f rufst du nun den Suchen-Dialog auf. In die erste Zeile "Suchen nach:"setzt du "FREQ=YEARLY;INTERVAL=1" mit den Anführungszeichen! ein. Die Zweite Zeile "Ersetzen durch:" lässt du leer. Danach den linken Button "Alles Ersetzen" drücken."
Jetzt kannst du iCal wieder öffnen und die Wiederholungen in den Events sind weg. Jetzt brauchst du natürlich eine neue Erinnerung für deine Termine.

Dazu wieder das Skript anpassen. -- vor " make new sound alarm at end of sound alarms of this_event with properties {trigger interval:(item 1 of the_trigger_time)}" entfernen und nur vor "with properties {trigger interval:(item 1 of the_trigger_time)}"in der selben Zeile setzten. Eine Zeile höher --vor die Zeile "set recurrence of this_event to item 1 of the_recurrence" setzen, damit nicht wieder eine Wiederholung eingetragen wird.

OK - mein Fehler war das nicht vorher zu prüfen. Die Funktion "Geburtstagskalender einblenden" habe ich auch übersehen. Selbst wenn ich sie gesehen hätte, wäre ich NIIIEEE! auf die Idee gekommen etwas in einen "schreibgeschützten" Kalender einzutragen denn "set writable of calendar xy to true/false" geht geschickter weise auch nicht. :mad:

Das Script lautet also:

Code:
tell application "iCal"
activate
    set this_calendars to calendars whose writable is false
    set this_calendar to item 1 of this_calendars
    repeat with i from 1 to count events in this_calendar
        set this_event to event i of this_calendar
        make new sound alarm at end of sound alarms of this_event with properties {trigger interval:-240, sound name:"Basso"}
    end repeat
end tell

das trigger interval sind Minuten. Negative Zahlen vor dem Ereignis und positive Zahlen nach dem Ereignis.
der sound name ist der wie in der Auswahlliste.

Vorsicht: Jedweder Logik kannst du einen Soundalarm anhängen, dieser wird aber sofort schreibgeschützt. Du kannst alles aber zurücksetzten, indem du den Kalender löscht und in Einstellungen erneut anzeigen lässt.

Sorry für die Unannehmlichkeiten...

Gruß Andi
 
Zuletzt bearbeitet von einem Moderator:
...

Hallo floeru,

hmm - noch was. Hast du die Alten Alarme überhaupt gelöscht beim ersten mal? Dann wären ja noch die alten Alarmzeiten erhalten. Dann nicht löschen...
Hoffentlich ist's noch nicht zu spät :rolleyes:

Gruß Andi
 
Andi schrieb:
OK - mein Fehler war das nicht vorher zu prüfen. Die Funktion "Geburtstagskalender einblenden" habe ich auch übersehen. Selbst wenn ich sie gesehen hätte, wäre ich NIIIEEE! auf die Idee gekommen etwas in einen "schreibgeschützten" Kalender einzutragen denn "set writable of calendar xy to true/false" geht geschickter weise auch nicht. :mad:

Das Script lautet also:

Code:
tell application "iCal"
activate
	set this_calendars to calendars whose writable is false
	set this_calendar to item 1 of this_calendars
	repeat with i from 1 to count events in this_calendar
		set this_event to event i of this_calendar
		make new sound alarm at end of sound alarms of this_event with properties {trigger interval:-240, sound name:"Basso"}
	end repeat
end tell
Hallo Andi

Hoffentlich liest du hier noch mit! :) Habe meinen Kalender dank deiner Hilfe wieder fit gekriegt. Nun bin ich wieder beim Ursprungsproblem, Erinnerungen für den Geburtstagskalender zu setzten.

Mit dem oben zitierten Script funktioniert dies zwar einwandfrei, nur werden die Einstellungen nicht gespeichert. Nach einem iCal Neustart sind sie weg... Das hat sicher etwas mit dem Schreibschutz zu tun, oder? Gibt es da keine Möglichkeit, den Schreibschutz zu umgehen oder habe ich bei deiner erläuterung oben etwas überlesen?

Gruss und Danke für die Hilfe!
floeru
 
Mir haben die Ratschläge von Andi auch geholfen, allerdings bei einem anderen Problem...

@Andi: Danke!

@floeru: Schau dir doch mal Dates to iCal an. Damit kannst du dir nen neuen Geburtstagskalender aus dem Adressbuch machen mit editierbaren Einträgen und auch welche hinzufügen.

Man sollte den Kalender nur nicht "Geburtstage" nennen, weil er dann in den von iCal erstellten reinschreibt und dann hat man alles doppelt (ich spreche aus Erfahrung)!

Was mich noch dran gestört hat, war dass die Geburtstage dann als Vorname Nachname's birthday drinstehen: dazu hab ich das Kalenderfile geöffnet, wie Andi es beschrieben hat und Suchen und Ersetzen gemacht.
Jetzt ist alles zu meiner Zufriedenheit! :)

Gruß, zause
 
Zurück
Oben Unten