我们可以将其简化为五行:
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 Companies
AppleScript 方式创建一个组。然后,您创建一个匹配所有三个条件的智能组(您使用+
按钮添加它们):“未设置电子邮件”、“未设置生日”和“卡是‘无公司’的成员”。这可能是最好的选择,尽管不幸的是您必须为No Companies
组使用 AppleScript(我觉得应该有一种方法,但我看不出它是什么)。