Взаимодействие Apple и iCal - PullRequest
3 голосов
/ 30 мая 2009

Я пытаюсь написать 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), но я не смог найти "нативный" способ сделать это ....

РЕДАКТИРОВАТЬ : Я использую Mac OS X Tiger (10.4). Возможно, более новые версии iCal улучшили библиотеку доступных операций.

Ответы [ 3 ]

5 голосов
/ 07 марта 2010

Сегодня я столкнулся с этим и обнаружил, что вы можете фильтровать по дате (по крайней мере, для 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

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

3 голосов
/ 12 марта 2010

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

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

0 голосов
/ 17 октября 2009

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

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

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

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

...