Applescript和iCal互动

时间:2009-05-29 21:41:39

标签: applescript icalendar

我正在尝试编写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 个答案:

答案 0 :(得分: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
与迭代所有事件相比,

将返回所有未来事件的摘要,并且非常快。

答案 1 :(得分:3)

它不是AppleScript,但其他方法中最好的一个似乎是iCalBuddy,它使用公共Cocoa API而不是直接解析日历文件并合理处理重复事件。 / p>

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

答案 2 :(得分:0)

我最初的意图是只选择给定日期的事件,但显然iCal中没有方法只能访问特定日期的事件。

因此,始终需要检查每个日历中注册的所有事件。即使对单个日历的事件感兴趣,比如说“今天的会议”,也有必要经历整个事件。

我在网上找到的最好的替代品不使用Apple Script,而是处理实际存储信息的'ics'文件。

作为参考,这些文件位于'〜/ Library / ApplicationSupport / iCal'。