为什么在使用复杂的按键时需要延迟?

问题描述

我正在创建一个Applescript工作流以在Calendar中运行,这涉及将事件移至第二天。键盘快捷键是^⌥→(控件,选项和右侧)。因此,我认为以下代码会起作用:

tell application "System Events"
    tell application "Calendar" to activate
    key code 124 using {control down,option down}
end tell

但是,它没有用。经过一番修补,下面的代码可以工作。

tell application "System Events"
    tell application "Calendar" to activate
    delay 2
    key down {control}
    key down {option}
    delay 2
    key code 124
    delay 2
    key up {control}
    key up {option}
    delay 2
end tell

我想念什么?为什么单个按键/组合需要延迟?

解决方法

假设您拥有日历的名称以及您要移动的事件的名称,那么:

tell application id "com.apple.iCal"
    tell the calendar named "Calendar_Name"
        tell (the first event whose summary = "Event_Title")
            set the [end date,start date] to [¬
                end date + 1 * days,¬
                start date + 1 * days]
        end tell
    end tell
end tell

假设您没有任何一个,那么我们将不得不求助于UI脚本,这是我不情愿做的,也是最后的选择。但是由于似乎没有其他方法可以获取有关用户当前在应用程序中选择了哪个日历项的信息,因此我检查了以这种方式获取该日历的方法是否合理,这就是我想出的: / p>

set text item delimiters to linefeed

tell application id "com.apple.SystemEvents" to tell the ¬
        process "Calendar" to tell window 1 to tell the ¬
        splitter group 1 to tell its group 1 to tell the ¬
        UI element 1 to tell (every list where focused ¬
        of its every static text contains true) to tell ¬
        (static texts whose focused = true) to return the ¬
        text items of (contents of {help,description} ¬
        as text)

满口。基本上,当您处于月视图时,似乎每个月的每一天都是一种ui element类型的list,其中包含一个{{1} }针对当天安排的每个事件的对象。附加到对象上的可访问性信息并不是没有用的,但它们可能是由某个16岁的实习生完成的,他们只是想结束自己的一天。

static text对象,它具有优点,并且值得庆幸的是,它更新了其static text属性以反映是否选中了该对象(尽管这仅适用于单个选择,所以多次批量提取并不立即可行。

该块的大部分内容是将报告为focused的{​​{1}}隔离开来,当我们最终深深地嵌套它时,它具有两个包含我们需要的一切的属性。 ..但是它是用散文写成的,所以我将把它作为任务留给读者以提取相关信息。

为了给您一个想法,这是我选择的事件返回的结果:

  • static text 属性:“此事件属于日历“ CK”。”

    这给出了事件所属的日历。这在不同的地区之间会有所不同,但是我认为它应该转换为几乎相同类型的可用信息。提示,日历名称是引号中包含的唯一内容,这很有用,这样可使提取简洁明了。

  • focused 属性:“您好,这是一个 有关我的生活如何发生变化,颠倒过来的故事。始于S10Oct2020,始于0900,始于1000。”

    这有点尴尬,但是它确实包含事件的名称,这是我们唯一需要的其他东西。它还包含日期和时间,但是您已经了解了如何获取和设置日期和时间。您可以在单词“ down” 之后看到两个句号:第一个是我的,是事件名称的一部分;第二个是我将测试一分为二,而忽略后半部分,然后将第一个存储为针对将与适当事件匹配的help属性的搜索项(假设它具有唯一的名称)。

UI脚本是在月视图中与“日历”应用一起编写的,尽管可以随意提供,但几乎可以肯定它不能在任何其他视图中使用尝试一下。如果有时间,我可能会尝试其他视图以提供更大的灵活性,但由于时间太晚了,所以您可能必须使用我在这里演示的内容并自行应用。