3

我正在尝试编写一个 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 可能改进了可用的操作库。

4

3 回答 3

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

与遍历所有事件相比,将返回所有未来事件的摘要,而且速度非常快。

于 2010-03-06T21:57:31.477 回答
3

它不是 AppleScript,但最好的其他方法似乎是iCalBuddy,它使用公共 Cocoa API,而不是直接解析日历文件并明智地处理重复事件。

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

于 2010-03-12T00:18:54.080 回答
0

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

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

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

作为参考,这些文件位于“~/Library/ApplicationSupport/iCal”中。

于 2009-10-17T12:12:50.063 回答