0

Mac アドレス帳の穴をきれいにしようとしています。最初のステップとして、安っぽいホールマーク カードでお祝いできるように、すべての友達に誕生日を尋ねたいと思います。

パーソナライズされたメッセージを差し込み印刷するために、アドレス帳に「グループ」が必要です。

これは私が思いついた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

それは壊れますが、エラーメッセージから何が間違っているのか推測できません:

結果: エラー「アプリケーション \"アドレス帳\" の «class azf4» id \"05F770BA-7492-436B-9B58-E24F494702F8:ABPerson\" を型ベクトルにできません。" number -1700 から «class azf4» id "05F770BA-7492-436B-9B58-E24F494702F8:ABPerson" を vector に

(ところで、これは私の初めての AppleScript コードだと言いましたか? したがって、このコードを単純化またはより洗練されたものにすることができれば、それも大歓迎です。)

4

1 に答える 1

4

これを 5 行に簡略化できます。

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 はまったく必要ありません。アドレスブックはスマートグループをサポートしています。作成するには、オプションを押しながら新しいグループ ボタンをクリックします。スマート グループの名前に「誕生日なし」を選択し、「誕生日」(最初のドロップダウンから)「設定されていない」(2 番目のドロップダウンから)カードに一致するように指示します。これにより、誕生日が設定されていない人々のグループが動的に更新されます。


編集: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

そしてほら、すべてがうまくいくはずです。

ビジネスの内外も簡単ですが、私が知る限り、Address Book にはそれらのスマート グループを作成する方法はありません。ただし、関連するプロパティはcompanyであり、これはtrueビジネス用およびfalseその他用です。したがって、企業のないリストを作成するには、次のようにします。

    repeat with p in (every person whose company is false)
        add p to noCompanies
    end repeat

これらの基準をすべて備えた1 つのマスターリストが必要な場合は、2 つの方法があります。まず、AppleScript から 2 つの条件と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

もう 1 つのオプションは、アドレス帳からこれを行うことです。No Companies最初に、AppleScript の方法でグループを作成する必要があります。+次に、 「メールが設定されていない」、「誕生日が設定されていない」、「カードが「会社なし」のメンバーである」という3 つの条件 (ボタンで追加) のすべてに一致するスマート グループを作成します。グループに AppleScript を使用しなければならないのは残念ですが、これがおそらく最良の選択肢ですNo Companies(方法があるはずだと思いますが、それが何であるかはわかりません)。

于 2010-05-26T15:40:34.180 に答える