2009-05-29 4 views
3

Я пытаюсь написать AppleScript для запроса iCal и поиска всех событий, которые у меня есть для данной даты, в любом календаре.Взаимодействие с Applescript и iCal

Я начал писать простой скрипт, который делает что-то простое с каждым событием в данном календаре:

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 

Однако этот простой сценарий берется много времени, чтобы выполнить (несколько секунд), даже если я не делаю ничего сложного внутри цикла. Я боюсь, что реальный сценарий действительно займет много времени, чтобы выполнить.

Я не очень хорошо знаком с Applescript, и поэтому, я думаю, я делаю что-то глупое, что имеет серьезные последствия для производительности.

Может ли кто-нибудь объяснить мне, почему это требует многого? Может кто-нибудь предложить что-то улучшить мой код? Теперь я начну проверять дату события с условием в цикле. Я подозреваю, что должен быть способ поиска событий с датой (например, действия Automator), но я не смог найти «собственный» способ сделать это.

EDIT : Я использую Mac OS X Tiger (10.4). Возможно, что более новые версии iCal улучшили доступную библиотеку доступных операций.

ответ

5

Я бороться с этим сегодня и обнаружили, что вы можете фильтровать по дате (по крайней мере, на Snow Leopard). Таким образом,

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 

вернет сводку всех будущих событий и очень быстро, по сравнению с повторением всех событий.

+0

Отлично! Большое спасибо! Я полностью потерял веру в этот вопрос :) – nozebacle

+0

Это не показывает повторяющиеся события. Есть ли способ обойти это? – Dov

+0

Я закончил тем, что отказался от API AppleScript и отказался от iCalBuddy. Вам нужно будет разобрать его вывод, но его запрос, по крайней мере, нормальный! –

0

Мое первоначальное намерение состояло в том, чтобы выбрать только события для заданной даты, но, по-видимому, в iCal нет методов доступа только к событиям за определенный день.

Таким образом, всегда необходимо просматривать все события, зарегистрированные в каждом календаре. Даже если вы заинтересованы в событиях одного календаря, скажем, «Сегодняшние собрания», необходимо пройти весь набор событий.

Лучшие альтернативы, которые я нашел в Интернете, не используют Apple Script , но вместо этого они обрабатывают файлы по «Ics», где информация хранится на самом деле.

Для справки, эти файлы находятся в «~/Library/ApplicationSupport/ческих».

3

Это не AppleScript, но лучшим из множества других способов сделать это представляется iCalBuddy, который использует публичные API-интерфейсы Cocoa, а не анализирует файл календаря напрямую и обрабатывает повторяющиеся события разумно.

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