我正在尝试清理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?所以,如果这个代码可以简化,或者更优雅,那也是受欢迎的。)
答案 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(我觉得应该有办法,但我看不出它是什么)。