尝试访问 Apple 提醒时出现 AppleScript 错误 -1700

AppleScript Error -1700 when trying to access Apple Reminders

我收到以下 AppleScript 脚本错误,如果有人能解释原因,我将不胜感激。

在 Apple 的 Reminders 应用程序中,我创建了一个包含四个提醒项的简单列表,命名如下:

列表名称: 颜色

提醒: 红色、黄色、浅绿色、深绿色

在 AppleScript 中,我设置了这个变量:

set lstMyList to {"Red", "Yellow", "Orange", "Blue"}

我不明白的是以下内容,前两个语句有效但第三个语句无效。

语句 1.(成功)

这个returns true,因为提醒1(“红色”)的名字在lstMyList

tell application "Reminders"
    return (name of reminder 1 of list "Colours") is in lstMyList
end tell

语句 2.(成功)

这个returns {"浅绿","深绿"}

tell application "Reminders"
    return (name of every reminder in list "Colours") whose name contains "Green"
end tell

语句 3.(失败)

这应该 return {"Red", "Yellow"},但却触发了 -1700错误

tell application "Reminders"
    return (name of every reminder in list "Colours") whose name is in lstMyList
end tell

弹出的完整错误是:

“提醒事项出错:无法将 {"Red", "Yellow", "Orange", "Blue"} 设为类型说明符。" number -1700 从 {"Red", "Yellow", "Orange", "Blue"} 到 specifier

我不明白第三种情况发生了什么,因为第一个语句使用“is in lstMyList”没有任何问题,第二个语句使用“whose”没有任何问题。

我应该补充一点,我知道可以通过改变代码来完全绕过这个错误,例如遍历 lstMyList 并检查提醒。但是,我试图避免这样的解决方案,因为这将需要重复发送 Apple 事件,这将导致 运行 时间显着增加,尤其是对于大量列表项。

任何解释 and/or 此处的建议将不胜感激。谢谢。

这取决于你在和谁说话。

当你说

return (name of reminder 1 of list "Colours") is in lstMyList

发生了两件事。

  1. 首先,发送一个 Apple 事件以获取列表“Colours”的提醒 1 的名称。这里的工作是由 Reminders 应用程序完成的;说明符 name of reminder 1 of list "Colours" 是它可以理解的层次结构。

  2. 其次,内部(在此脚本中),AppleScript-the-language 获取结果字符串并检查列表中是否包含该字符串。

当你说

return (name of every reminder in list "Colours") whose name contains "Green"

您正在向提醒事项发送 单个 Apple 事件,这就是您正在做的 全部。没有什么可以保证 Reminders 愿意为您做这个计算,但碰巧 愿意。它计算出整个说明符和 returns 结果给你。

同样当你说

return (name of every reminder in list "Colours") whose name is in lstMyList

您要求提醒事项也将 作为单个 Apple 事件进行。您希望 is in lstMyList 说明符是 Reminders 愿意做的事情。事实并非如此。 AppleScript 是,但提醒不是。包含在列表中并不是 Reminders 所做的说明符。您正在发送此 Apple 活动:

get «property pnam» 
    of every «class remi» 
    of «class list» "Colours" 
    whose {"Red", "Yellow", "Orange", "Blue"} contains «property pnam»

那个Apple事件太奇怪了。如果不尝试,您无法知道应用程序将响应哪些说明符;碰巧 Reminders 不喜欢这个,你也无能为力。

我会这样说

set lstMyList to {"Red", "Yellow", "Orange", "Blue"}
set output to {}
tell application "Reminders"
    tell list "Colours"
        set rems to (get every reminder)
        set names to (get name of every reminder)
    end tell
    repeat with i from 1 to count of names
        if item i of names is in lstMyList then
            set end of output to item i of rems
        end if
    end repeat
end tell

我们现在已经收集到正确提醒的参考(在output),但是我们只发送了两个苹果事件,既便宜又快速。其余工作由 AppleScript 在内部完成。当然,如果你只想要名字,而不是对实际提醒的引用,你可以只用 一个 Apple 事件来收集名字。