Befehl im Apple-Script nur einmal ausführen

robert170

Aktives Mitglied
Thread Starter
Dabei seit
29.12.2006
Beiträge
797
Reaktionspunkte
27
Hallo,
ich will ein Script schreiben, dass iCal aufruft und dann einmalig die Kalender aktualisiert. Es soll aber nur beim ersten Aufruf die Kalender aktualisieren. Wenn man danach klickt, soll nur das Kalenderfenster in den Vordergrund geholt werden.
Wie kann man das programmieren?
(Hintergrund ist, dass meine Internetverbindung sehr langsam ist, so dass ich immer nur einmal die freigegebenen Kalender aktualisieren will, das dauert nämlich ca. 1 min, solange kann man nichts eingeben.
Bisher sieht das Script so aus:

tell application "iCal" to activate
tell application "System Events"
tell process "iCal"
keystroke "r" using {command down, shift down}
end tell
end tell

tell application "System Events"
tell process "iCal"
keystroke "t" using {command down}
end tell
end tell

Der erste Block soll eben nur beim ersten Mal klicken durchlaufen.
 
Du möchtest also sozusagen, dass iCal nur 1 mal täglich aktualisiert wird, und zwar das 1. mal, wenn du das Skript startest? Das Skript soll dann

iCal öffnen
prüfen ob es das erste mal an diesem Tag geöffnet wurde
wenn ja -> aktualisieren
wenn nein -> weiter
Heute anzeigen

richtig?
 
Genau, man könnte ja meinen, dass man das Apple so einstellen könnte, aber wenn man da auf "automatisch" geht, wird nach jeder Änderung aktualisiert...
 
Probier das mal:

Code:
[FONT="Verdana"][size=2][b]property[/b] [color=#3F7F00]lastOpened[/color] : ""

[b]set[/b] [color=#3F7F00]curDate[/color] [b]to[/b] ([color=#0016B0][b]do shell script[/b][/color] "date \"+%Y-%m-%d\"")
[b]if[/b] [color=#3F7F00]curDate[/color] [b]is[/b] [color=#3F7F00]lastOpened[/color] [b]then[/b]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "iCal" [b]to[/b] [color=#0000FF][b]view calendar[/b][/color] [color=#0000FF]at[/color] ([color=#0016B0][b]current date[/b][/color])
[b]else[/b]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "iCal"
		[color=#0000FF][b]reload calendars[/b][/color]
		[color=#0000FF][b]view calendar[/b][/color] [color=#0000FF]at[/color] ([color=#0016B0][b]current date[/b][/color])
	[b]end[/b] [b]tell[/b]
[b]end[/b] [b]if[/b]
[b]set[/b] [color=#3F7F00]lastOpened[/color] [b]to[/b] [color=#3F7F00]curDate[/color][/size][/FONT]
 
Klappt schon ziemlich gut, danke schon mal.
Ich musste noch etwas ändern, das geht leider nur mit dem keystroke-Befehl, wird an verschiedenen Stellen im Netz so diskutiert, ist komisch, weiß ich, aber "reload" bewirkt nichts.
Einziger Haken ist im Moment noch, das beim ersten Aufrufen an einem neuen Tag, erst mal nur im Script-Editor unten das Datum ausgegeben wird. Beim zweiten Klicken wird dann der Kalender aufgerufen und aktualisert. (und bei allen weiteren Aufrufen wird nur der Kalender aufgerufen). Wie bekäme man das noch weg??
Wenn man es als App speichert, passiert das Gleiche...
Bei deinem Code klappt der direkte Aufruf... Irgendwas scheint durch meine Einfügung noch durcheinander zu kommen, aber ich bin in Bezug auf Applescript auch eher Anfänger.
Hier der aktuelle Code:
property lastOpened : ""

set curDate to (do shell script "date \"+%Y-%m-%d\"")
if curDate is lastOpened then
tell application "iCal" to view calendar at (current date)
else
tell application "iCal"
tell application "System Events"
tell process "iCal"
keystroke "r" using {command down, shift down}
end tell
end tell
end tell
end if
set lastOpened to curDate
 
Du darfst nur die gespeicherte App verwenden, nur da wird der Property-Wert mit abgespeichert.
Sobald Du mit dem Editor rangehst, wird die Property auch wieder "geleert".

Code:
property lastOpened : ""

set curDate to (do shell script "date \"+%Y-%m-%d\"")
if curDate is lastOpened then
   tell application "iCal" to view calendar at (current date)
else
   tell application "iCal" to activate
   tell application "System Events" to keystroke "r" using {command down, shift down}
end if
set lastOpened to curDate
 
Zuletzt bearbeitet:
Ich habs gerade mal ausprobiert und so müsste es jetzt gehen:

Code:
[FONT="Verdana"][size=2][b]property[/b] [color=#3F7F00]lastOpened[/color] : ""
[b]set[/b] [color=#3F7F00]curDate[/color] [b]to[/b] ([color=#0016B0][b]do shell script[/b][/color] "date \"+%Y-%m-%d\"")
[b]if[/b] [color=#3F7F00]curDate[/color] [b]is[/b] [color=#3F7F00]lastOpened[/color] [b]then[/b]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "iCal" [b]to[/b] [color=#0000FF][b]view calendar[/b][/color] [color=#0000FF]at[/color] ([color=#0016B0][b]current date[/b][/color])
[b]else[/b]
	[b]tell[/b] [color=#0000FF][i]application[/i][/color] "iCal"
		[color=#0000FF][b]view calendar[/b][/color] [color=#0000FF]at[/color] ([color=#0016B0][b]current date[/b][/color])
		[color=#0016B0][b]delay[/b][/color] 1
		[b]tell[/b] [color=#0000FF][i]application[/i][/color] "System Events"
			[color=#0000FF][b]keystroke[/b][/color] "r" [color=#0000FF]using[/color] {[color=#4A1E7F]command down[/color], [color=#4A1E7F]shift down[/color]}
		[b]end[/b] [b]tell[/b]
	[b]end[/b] [b]tell[/b]
[b]end[/b] [b]if[/b]
[b]set[/b] [color=#3F7F00]lastOpened[/color] [b]to[/b] [color=#3F7F00]curDate[/color][/size][/FONT]
 
Also ich musste noch eine Zeile mit tell process einfügen für meinen Snowleopard, aber jetzt funktioniert es super! THX!
Ich lade es nachher noch mal als App hoch, für alle die das direkt downloaden wollen.
Code:
property lastOpened : ""
set curDate to (do shell script "date \"+%Y-%m-%d\"")
if curDate is lastOpened then
	tell application "iCal" to view calendar at (current date)
else
	tell application "iCal"
		view calendar at (current date)
		delay 1
		tell application "System Events"
			tell process "iCal"
				keystroke "r" using {command down, shift down}
			end tell
		end tell
	end tell
end if
set lastOpened to curDate
Hier das App Anhang anzeigen iCal-Starter.app.zip
 
Zuletzt bearbeitet:
Jetzt knobele ich doch noch an einer Sache: Ich hätte gerne, dass ein bestimmtert Kalender ausgewählt wird. (Unter Snowleo gibt es noch keinen Default-Kalender).
Bei "calendar" gibt es die property "name", aber meine bisherigen Versuche, das mit einzubauen, schlugen fehl...
 
Hallo!

Da fällt mir auch nichts vernünftiges ein...
Das wäre eine Möglichkeit:

Code:
set currdt to current date
tell application "iCal"
	activate
	set c to calendar "Büro"
	## oder wenn mehrere Kalender mit dem Namen existieren z.B.:
	--set c to (calendar 2 whose name is "Büro")
	tell c
		set theEvent to last event where start date is less than currdt
		show theEvent
		view calendar at currdt
		
		tell application "System Events"
			tell process "iCal"
				keystroke "r" using command down
			end tell
		end tell
		
	end tell
end tell

Gruß
 
Hm, danke schon mal, dann wird allerdings der letzte Eintrag auch geöffnet, ich will ja eigentlich nur, dass der Kalender markiert ist. Wie es scheint, gibt es dafür aber keinen direkten Befehl.
 
Zurück
Oben Unten