AppleScript et l'interaction iCal
-
06-09-2019 - |
Question
Je suis en train d'écrire un AppleScript pour interroger iCal et trouver tous les événements que j'ai pour une date donnée, dans un calendrier.
J'ai commencé par écrire un script simple qui fait quelque chose de simple avec chaque événement dans un calendrier donné:
tell application "iCal"
tell calendar "Reuniones"
set the_events to every event
repeat with an_event in the_events
-- do something with every event
set value to summary of an_event
end repeat
end tell
end tell
Cependant, ce script simple est pris beaucoup de temps pour exécuter (quelques secondes), même si je ne fais rien complexe dans la boucle. Je crains que le script réel va vraiment prendre beaucoup de temps à exécuter.
Je ne suis pas très familier avec AppleScript, et donc je pense que je fais quelque chose de stupide qui a des conséquences graves de performance.
Quelqu'un peut-il me expliquer pourquoi cela prend beaucoup à exécuter? Quelqu'un peut-il suggérer quelque chose pour améliorer mon code? Je vais maintenant commencer à vérifier la date de l'événement, une condition dans la boucle. Je pense qu'il doit y avoir un moyen de rechercher des événements avec une date (comme l'action Automator fait), mais je ne l'ai pas été en mesure de trouver un moyen « indigène » de le faire ....
EDIT : J'utilise Mac OS X Tiger (10.4). Il est possible que les versions les plus récentes de iCal ont amélioré la bibliothèque des opérations disponibles.
La solution
J'ai prises avec aujourd'hui et a constaté que vous pouvez filtrer par date (au moins sur Snow Leopard). Donc,
tell application "iCal"
set out to ""
set todaysDate to current date
set time of todaysDate to 0
repeat with c in (every calendar)
set theEvents to (every event of c whose start date ≥ todaysDate)
repeat with current_event in theEvents
set out to out & summary of current_event & "\n"
end repeat
end repeat
return out
end tell
renverra le résumé de tous les événements futurs, et très rapidement, par rapport à itérer tous les événements.
Autres conseils
Il n'est pas AppleScript, mais le meilleur des tas d'autres façons de le faire semble être iCalBuddy , qui utilise les API publiques de cacao plutôt que d'analyser le fichier calendrier directement et poignées de répétition des événements sensiblement.
icalBuddy -nc -eed -iep title,datetime eventsToday+1
Mon intention initiale était de sélectionner uniquement les événements pour une date donnée, mais apparemment il n'y a pas de méthodes dans iCal pour accéder uniquement les événements pour un jour.
Ainsi, il est toujours nécessaire d'aller sur tous les événements enregistrés dans tous les calendriers. Même si intéressés par les événements d'un calendrier unique, dire « les réunions d'aujourd'hui », il est nécessaire de passer par l'ensemble des événements ensemble.
Les meilleures alternatives que j'ai trouvé autour du Web ne pas utiliser d'Apple Script, mais ils traitent les fichiers « ics » où l'information est stocké.
Pour référence, ces fichiers se trouvent dans ~ / Library / ApplicationSupport / iCal.