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