これは一例です。重複フィールドを製造した 2 つのコンタクトのみでテストしました。そして、それらをテスト用のグループに配置しました
これにより、コードを作成する 1 つの方法がわかります。
あまり時間をかけたくなかったので、例はそのままです。しかし、私のテストではうまくいきました。
この例では、連絡先の重複するソーシャル プロファイルと電話番号フィールドを削除します。
ソーシャル プロファイルでは、削除アクションが繰り返されます。これは、最初の削除により、contacts.app がエントリをソーシャル メディア サイトの URL に置き換えることを強制するためです。
ここから他のフィールドの構築は比較的容易なはずです。
フィールドの各セット (電話、ソーシャル プロファイル、電子メール) には、コードをより管理しやすくするための独自の実行ハンドラーが必要です。私がここでやったように。
また、大量の連絡先に対してこれを実行すると、非常に長い時間がかかる可能性があることにも注意してください。
このいずれかでプレイする前に、アドレス帳の連絡先もバックアップする必要があります。自己責任で使用してください
set targetGroup to "BD"
tell application "Contacts" to set thePeople to people of group targetGroup -- TEST GROUP OF PEOPLE
---- tell application "Contacts" to set thePeople to people -- ALL PEOPLE
(* Run the Handler for Social profiles*)
my deleteSocialEntries(thePeople)
(* Run the Handler for phones *)
my deleteSocialPHONE(thePeople)
(* Handlers*)
on deleteSocialPHONE(thePeople)
tell application "Contacts"
(* iterate over the people - get each person in the contacts*)
repeat with i from 1 to number of items in thePeople
set this_person to item i of thePeople
(*get all the phones of the person*)
set theFields to (properties of phones of this_person)
set keepers to {}
(* iterate over the phones and get a phone's value*)
repeat with i from 1 to number of items in theFields
set this_item to item i of theFields
set thisValue to value of this_item
if thisValue is not in keepers then
(* Not in the list of keepers so add it*)
copy thisValue to end of keepers
else
(* Was already in the list of keepers try and delete it*)
try
set thisID to id of this_item
set thisD to (every phone of this_person whose id is thisID)
delete (item 1 of thisD)
save
end try
end if
end repeat
end repeat
end tell
end deleteSocialPHONE
on deleteSocialEntries(thePeople)
set social to {"Twitter", "Linkedin", "Facebook"}
tell application "Contacts"
(* iterate over the people - get each person in the contacts*)
repeat with i from 1 to number of items in thePeople
set this_person to item i of thePeople
(* iterate over the social media types for this person *)
repeat with i from 1 to number of items in social
set this_soc to item i of social
(*get all the *type* of social profiles of the person*)
set theFields to (properties of every social profile of this_person whose service name is this_soc)
set keepers to {}
(* iterate over the ocial profile and get a user name value*)
repeat with i from 1 to number of items in theFields
set this_item to item i of theFields
set thisValue to user name of this_item
if thisValue is not in keepers then
copy thisValue to end of keepers
else
(* Was already in the list of keepers try and delete it*)
set thisID to id of this_item
set thisD to (every social profile of this_person whose id is thisID)
delete (url of item 1 of thisD)
delete (user name of item 1 of thisD)
delete (url of item 1 of thisD)
delete (user name of item 1 of thisD)
save
end if
end repeat
end repeat
end repeat
end tell
end deleteSocialEntries