2009-05-29 8 views
3

J'essaye d'écrire un AppleScript pour interroger iCal et trouver tous les événements que j'ai pour une date donnée, dans n'importe quel calendrier.Interaction Applescript et iCal

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 de complexe dans la boucle. J'ai peur que le vrai script prenne vraiment beaucoup de temps à exécuter. Je ne suis pas très familier avec Applescript, et donc j'imagine que je fais quelque chose de stupide qui a de graves implications sur les performances.

Quelqu'un peut-il m'expliquer pourquoi cela prend autant de choses à 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, avec une condition dans la boucle. Je suppose qu'il doit y avoir un moyen de rechercher des événements avec une date (comme l'action Automator), mais je n'ai pas été en mesure de trouver un moyen "natif" de le faire ....

EDIT : J'utilise Mac OS X Tiger (10.4). Il est possible que les nouvelles versions d'iCal aient amélioré la bibliothèque d'opérations disponibles.

Répondre

5

Je suis colletés avec ce aujourd'hui et trouvé 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 

retournera le résumé de tous les événements futurs, et très rapidement, comparé à l'itération de tous les événements.

+0

Très bien! Merci beaucoup! J'avais totalement perdu la foi sur cette question :) – nozebacle

+0

Cela ne montre pas les événements qui se répètent, cependant. Y a-t-il un moyen de contourner cela? – Dov

+0

J'ai fini par abandonner l'API AppleScript et tomber sur iCalBuddy. Vous aurez besoin d'analyser sa sortie, mais son interrogation est au moins sensée! –

0

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 aux événements d'un jour spécifique.

Ainsi, il est toujours nécessaire de parcourir tous les événements enregistrés dans chaque calendrier. Même si vous êtes intéressé par les événements d'un seul calendrier, dites «Réunions d'aujourd'hui», il est nécessaire de passer par l'ensemble des événements

Les meilleures alternatives que j'ai trouvées dans le Web n'utilisent pas Apple Script , mais ils traitent les dossiers 'ics de laquelle l'information est stocké.

Pour référence, ces fichiers se trouvent dans ~/Library/ApplicationSupport/iCal.

3

Ce n'est pas AppleScript, mais le meilleur du tas d'autres façons de le faire semble être iCalBuddy, qui utilise les API Cocoa publiques plutôt que d'analyser le fichier calendrier directement et gère les événements de façon sensible.

icalBuddy -nc -eed -iep title,datetime eventsToday+1