在Apple地址簿中查找丢失的生日

时间:2010-05-26 14:22:27

标签: applescript mailmerge

我正在尝试清理Mac地址簿中的漏洞。作为第一步,我想请所有朋友过生日,以cheesy Hallmark cards祝贺他们。

我需要在我的地址簿中使用“群组”来邮寄个性化的邮件。

这是我提出的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

它打破了,但是从错误消息中我无法推断出错误:

  

结果:错误“无法生成«类azf4»   ID   \ “05F770BA-7492-436B-9B58-E24F494702F8:ABPerson \”   应用程序“通讯录”进入   类型向量。“来自«类的数字-1700   azf4»id   “05F770BA-7492-436B-9B58-E24F494702F8:ABPerson”向量

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

1 个答案:

答案 0 :(得分: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(有效{ {1}}),所以我们应该检查一下,而不是比较早期。因此,为了获得一个没有生日的人的列表,我们写了null,这正是它所说的。 every person whose birth date is missing value子句过滤前面的列表,使其仅包含与给定谓词匹配的值。然后我们whose列出新组,我们创建内联。最后,add保存更改并使其可见。

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


编辑似乎虽然save addressbook在Leopard上列出了一个列表,但它不在Snow Leopard上,所以我们需要使用显式的add循环(也适用于Leopard):

repeat

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


编辑:对于其他属性,情况类似;事实上,在使用智能组时,事情是完全相同的。从AppleScript方面来看,问题是数据的格式。大多数广告位在未设置时都有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 ,但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

如果您想要一个包含所有这些条件的列表,则有两种方法。首先,从AppleScript中,您采用两个条件并 repeat with p in (every person whose company is false) add p to noCompanies end repeat ,然后根据是否有电子邮件添加条件:

and

另一种选择是通过地址簿执行此操作。您首先需要以AppleScript方式创建 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 Companies按钮添加它们):“未设置电子邮件”,“未设置生日”,以及“卡是'没有公司'的成员' ”。这可能是最好的选择,虽然不幸的是你必须为+组使用AppleScript(我觉得应该有办法,但我看不出它是什么)。