0

OS X 10.8.5 の連絡先に、多数 (数百) の重複するフィールド名と値があることに気付きました。「フィールド名と値」はおそらく正しい言葉ではありませんが、私が言いたいのは、次のような同一のフィールドを持つように見える連絡先カードがたくさんあるということです。

ここに画像の説明を入力

問題はソーシャル プロファイルに限定されません。また、電子メールアドレス電話番号 (およびおそらくそれ以上) も重複の影響を受けます。

私は昨日 AppleScript を紹介されましたが、少しは理解できましたが (それらを実行でき、既存のスクリプトを少しいじることができ、知っていsaveます :))、これはまだ私の能力を超えています:

同じ型 (?)と同じラベル (?)同じ値 (?)を持っている場合、カードごとに重複するフィールドを削除するような AppleScript が本当に役に立ちます。(ただし、1 つのインスタンスを保持します。)

住所 (番地、郵便番号など) が多すぎるのではないかと想像できます。しかし、非複合の「フィールド」はすでにアドレス帳を大幅にクリーンアップします。

確かに技術用語を正しく理解していないことをお詫びします。

4

1 に答える 1

1

これは一例です。重複フィールドを製造した 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
于 2013-09-15T14:54:32.287 に答える