0

我正在尝试清理我的 Mac 通讯簿中的漏洞。作为第一步,我想请我所有的朋友过生日,以便能够用俗气的 Hallmark 卡片祝贺他们。

我的通讯录中需要一个“组”,用于邮件合并来自的个性化消息。

这是我想出的Applescript:

tell application "Address Book"

make new group with properties {name:"No Birthday"}

set birthdayPeople to (get every person whose birth date is greater than date "Monday, January 1, 1900 12:00:00 AM")

repeat with i from 1 to number of items in people

    set thePerson to item i of people

    if not (birthdayPeople contains thePerson) then
        add thePerson to group "No Birthday"
    end if

end repeat
save 
end tell

它坏了,但从错误消息中我无法推断出什么是错误的:

结果:错误“无法将应用程序 \"Address Book\" 的 «class azf4» id \"05F770BA-7492-436B-9B58-E24F494702F8:ABPerson\" 转换为类型向量。” 编号 -1700 从 «class azf4» id "05F770BA-7492-436B-9B58-E24F494702F8:ABPerson" 到向量

(顺便说一句:我有没有提到这是我的第一个 AppleScript 代码?所以,如果这个代码可以简化,或者变得更优雅,那也是受欢迎的。)

4

1 回答 1

4

我们可以将其简化为五行:

tell application "Address Book"
    add (every person whose birth date is missing value) to ¬
        make new group with properties {name:"No Birthday"}
    save addressbook
end tell

事实证明,它既add可以接收列表也可以接收单个对象,因此我们可以跳过循环。(请注意,如果您使用了循环,则可以使用repeat with thePerson in people ... end repeat表单,因为它比您使用的更干净。)接下来,地址簿似乎将缺少生日的存储为missing value(有效null),因此我们应该检查而不是比较反对早日。因此,为了得到一份未过生日的人的名单,我们写every person whose birth date is missing value了 ,这正是它所说的。该whose子句过滤前面的列表,使其仅包含与给定谓词匹配的值。然后我们add将该列表添加到新组,我们创建内联。最后,save addressbook保存更改并使其可见。

但是,在这种情况下,您根本不需要 AppleScript。通讯录支持智能群组;要创建一个,请选择单击新组按钮。为智能组的名称选择“无生日”,并告诉它匹配“未设置”(来自第一个下拉列表)“未设置”(来自第二个下拉列表)的卡片。这将为您提供一组动态更新的没有设置生日的人。


编辑:似乎虽然add在 Leopard 上有一个列表,但在 Snow Leopard 上没有,所以我们需要使用显式repeat循环(也适用于 Leopard):

tell application "Address Book"
    set noBirthdays to make new group with properties {name:"No Birthday"}

    repeat with p in (every person whose birth date is missing value)
        add p to noBirthdays
    end repeat

    save addressbook
end tell

这与上述解决方案的工作方式几乎相同,只是我们事先创建了组,然后单独添加每个项目。我们不是迭代索引,而是直接迭代元素,因为这就是我们在这里关心的全部。


编辑:对于其他属性,情况类似;事实上,当使用智能组时,事情是相同的。在 AppleScript 方面,问题在于数据的格式。大多数插槽missing value在未设置时都有,但这email是一个例外。正如我们通过测试看到的那样,它们存储在一个列表中,所以我们想要every person whose email is {}. 但是,这对我不起作用——可能是因为email是一个列表,但我不确定——所以你会想要

    repeat with p in every person
        if email of p is {} then add p to noEmails
    end repeat

瞧,一切都应该工作。

加入和排除企业也很容易,但据我所知,地址簿并没有提供为他们创建智能组的方法。但是,相关属性是company,它true适用于企业和false其他人。因此,要创建一个没有公司的列表,你想做

    repeat with p in (every person whose company is false)
        add p to noCompanies
    end repeat

如果您想要一份包含所有这些标准的列表,有两种方法。首先,从 AppleScript 中获取两个条件和and它们,然后根据它们是否有电子邮件添加条件:

    repeat with p in (every person whose company is false and ¬
                                         birth date is missing value)
        if email of p is {} then add p to masterGroup
    end repeat

另一种选择是从通讯簿执行此操作。您首先需要以No CompaniesAppleScript 方式创建一个组。然后,您创建一个匹配所有三个条件的智能组(您使用+按钮添加它们):“未设置电子邮件”、“未设置生日”和“卡是‘无公司’的成员”。这可能是最好的选择,尽管不幸的是您必须为No Companies组使用 AppleScript(我觉得应该有一种方法,但我看不出它是什么)。

于 2010-05-26T15:40:34.180 回答