Archive for the 'AddresBook/Contacts' Category

2016/05/04 Contacts(旧称:Address Book)のプラグインScriptのフォルダが変わった

最近利用していなかったので、気づかなかったのですが・・・Contacts(旧称:Address Book)のプラグインScriptを入れておくフォルダが(OS X 10.9で)変更になったとのこと。

# Release Notesに書いておくべき内容だと思うのですが(ーー;;

旧:~/Library/Address Book Plug-Ins/
新:~/Library/Application Scripts/com.apple.AddressBook/

plugin_resized.png
以前にアドレスブック用に作成したプラグインScriptも、問題なくContacts用に利用できています

2016/04/02 Contactsに登録してある自分の写真をPNGでデスクトップに保存する

Contacts.app(旧称:アドレスブック)に登録してある自分の写真をデスクトップにPNG形式で保存するAppleScriptです。

AppleScript名:Contactsに登録してある自分の写真をPNGでデスクトップに保存する
– Created 2016-04-02 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AddressBook”

set imgData to current application’s ABAddressBook’s sharedAddressBook()’s |me|()’s imageData()

set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)

saveTIFFDataAtPathAsPNG(imgData, savePath) of me

–NSImageを指定パスにPNG形式で保存
on saveTIFFDataAtPathAsPNG(anImage, outPath)
  –set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:anImage
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes –成功ならtrue、失敗ならfalseが返る
end saveTIFFDataAtPathAsPNG

★Click Here to Open This Script 

2012/02/28 tellブロックの書き方いろいろ

Mac OS X 10.5以降、tellブロックの書き方が拡張され、いろいろと柔軟性を持たせたAppleScriptを書けるようになりました。日常的には、Mac OS X 10.4で動かすケースを考えると積極的には採用してこなかったところですが、以下のように書けるようになっています。

スクリプト名:tell block
–Mac OS X 10.5以降で可能なtell文の記述方法の一覧

tell application “Address Book” –通常パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

tell application id “com.apple.addressbook” –Bundle ID指定パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

tell application “/Applications/Address Book.app” –フルパス指定パターン
  set mCard to my card
  
set aP to properties of mCard
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Mac OS X標準搭載のアプリケーションが、バージョンアップ時に名称変更になることは、ごくまれにあります。身近な例では、Script EditorがAppleScript Editorに変更になったりしました。

この夏にやってくるOS X 10.8では、OS標準添付アプリもiOSに合わせて微妙に名称変更してくることが予想されます。すでにきな臭いところでは、iChatがMessagesに変わることは間違いありません。

これまでに作った(膨大な)AppleScriptを書き換える必要があるかといえば、アプリケーションのBundle IDが変わっていなければ大丈夫だろうかといったところ。System Eventsでプロセス一覧を取得して特定アプリケーションの起動をプロセス名称で確認する、とかいった処理「以外」はそれほど書き換える必要はないものと見ています。

ただ、冒頭で紹介したtellブロックのうち、フルパスを指定するタイプは書き換えが必要になります。そもそもファイル名が異なるので、書き換えなくてはなりません。

AppleScript EditorをAppleScriptからコントロールして、絶対パスでアプリケーションを指定している箇所があれば、自動で書き換える……といったことも、それほど難しくはないため作っておいてもよいでしょう。

2010/07/14 アドレスブックプラグイン例(email)

アドレスブックのプラグインAppleScriptのサンプルです。

Mac OS X標準搭載のアドレスブックは、メールや電話番号などの欄の左側にポップアップメニュー表示ボタンが付いており、クリックするとポップアップメニューが表示されるようになっています。電話番号を「大きな文字で表示」したり、住所から「この住所の地図を表示」させたりする機能が標準搭載されています。

adb1.jpg

このポップアップメニューをAppleScriptで拡張できるようになっています。

決められた形式で記述しておいたAppleScriptを~/ライブラリ/Address Book Plug-Insフォルダに入れておくだけで、アドレスブックの起動時にこのフォルダ中のAppleScriptを読み込んで、Script中で宣言している対応データ欄の左側をクリックした際にポップアップ表示。

adb21.jpg

その中に、AppleScript中で宣言した文字列を表示。ポップアップ中から項目を選択すると、実際にAppleScript内のハンドラが呼び出されます。

adb3.jpg

通常のAppleScript内で処理を行うもよし、GUIベースのアプリケーションをAppleScript Studio/AppleScriptObjCで記述してデータを渡すもよし、いろいろAppleScriptのプログラムとアドレスブックを連携させることが可能です。

実際に、アドレスブックとGUIベースのAppleScript Studioアプリケーションを連携させ、データの登録をアドレスブックから選択して行うようにしてみました(ASとASSアプリの連携を行うための試作品がこれです)。割と、いろいろと有用な応用が行える機構です。

アドレスブックのプラグインScriptは、通常のScript形式で保存しておいて大丈夫です。iChatの拡張Scriptのようにテキスト形式で保存しておく必要はありません。ファイル名にもとくにルールはありません。

スクリプト名:アドレスブックプラグイン例(email)
using terms from application “Address Book”
  –どの種類のデータに対してポップアップ項目を表示するか
  
on action property
    return “email” –1つのプラグイン内で複数の種別のデータに応答することはできない
  end action property
  
  
–データの有無に応じてポップアップを表示するかどうかの制御
  
on should enable action for thePerson with theEntry
    if theEntry is not equal to missing value then
      return true
    else
      return false
    end if
  end should enable action
  
  
–ポップアップメニュー上に表示する項目名
  
on action title for thePerson with theEntry
    return “ぴよまるメールアドレスぷらぐいん”
  end action title
  
  
–ポップアップメニューから項目を選んで実行される
  
on perform action for thePerson with theEntry
    set theAddress to value of theEntry –この場合、theEntryはemailオブジェクトなので、valueを取るとメールアドレスが返ってくる
    
set theLabel to label of theEntry –emailのラベル
    
    
    
display dialog “メールアドレス:” & theAddress & return & “ラベル:” & theLabel buttons {“OK”} default button 1 with icon 1
    
  end perform action
end using terms from

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/07/13 アドレスブックでmy cardがあるかどうか取得する

アドレスブックに自分の情報(my card)があるかどうかを取得するAppleScriptです。

所有者情報をもとに処理を行うような場合に、アドレスブックからユーザーの情報を取得するような処理を書くことが、よくあります(無断でやったらウィルスまがいの処理ですが……)。

ただ、世の中は広いもので……アドレスブックにまともに情報が入っていないような悲惨なコンフィグレーションの環境が存在しており、そういうマシン上で「アドレスブックにはmy cardが存在しているに違いない」という前提のAppleScriptを走らせるとエラーになってしまいます。

そこで、my cardが存在しているかどうかを最初に確認しておくという処理が必要になってきます。

処理内容は、さほど面白くもなんともないものですが……「my cardが登録されていないような環境が存在する」という事実のほうが実に興味深いところです。

スクリプト名:アドレスブックでmy cardがあるかどうか取得する
set abRes to checkMYCARDonADB() of me

–アドレスブックに自分のカードが登録されていないかどうかをチェック
on checkMYCARDonADB()
  tell application "Address Book"
    try
      set myCard to my card
      
return true
    on error
      return false
    end try
  end tell
end checkMYCARDonADB

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/08 アドレスブックでPersonを検索

アドレスブックでPersonを検索するAppleScriptです。アドレスブックにはfindといった検索を想起させるようなコマンドはありませんが、フィルタ参照で絞り込み検索を行うことになります。

たとえば、苗字(last name)が「長野谷」のpersonを検索するには、

スクリプト名:アドレスブックを苗字で検索
tell application “Address Book”
  set the lastName to every person whose last name is equal to “長野谷”
end tell

–> {person id “094F257D-ED10-4844-B9FD-59FD995D3A69:ABPerson” of application “Address Book”, person id “22764B75-CC04-4274-BAE7-E8B75579F639:ABPerson” of application “Address Book”, person id “E4D07039-29ED-4A79-AD9F-A0CBA9E8DA02:ABPerson” of application “Address Book”, person id “BE0D07E5-A6A5-47D7-8E72-B72ED924A7A8:ABPerson” of application “Address Book”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

のようにします。条件に該当するpersonオブジェクトのリストが返ってくるので、あとはプロパティを取得するなりしてデータを取り出すだけです。

first name(名前)、last name(姓)、phonetic first name(名前よみがな)、phonetic last name(姓よみがな)などが使用できます。

adb1.jpg

姓よみがなに「ながの」を含むpersonを取得する場合には、

スクリプト名:アドレスブックを苗字のよみがなで検索
tell application “Address Book”
  set the lastName to every person whose phonetic last name contains “ながの”
end tell
–> {person id “094F257D-ED10-4844-B9FD-59FD995D3A69:ABPerson” of application “Address Book”, person id “22764B75-CC04-4274-BAE7-E8B75579F639:ABPerson” of application “Address Book”, person id “E4D07039-29ED-4A79-AD9F-A0CBA9E8DA02:ABPerson” of application “Address Book”, person id “BE0D07E5-A6A5-47D7-8E72-B72ED924A7A8:ABPerson” of application “Address Book”, person id “E067C14E-8BA3-481B-81AC-EBD4D3A5E339:ABPerson” of application “Address Book”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

となります。

電話番号と住所については、1つのpersonの下に複数持てるようになっているので、電話番号や住所を検索条件にする場合には、少々コーディングが必要になります。

あるいは、spotlight(do shell script経由でmdfindコマンドを使用)でアドレスデータを検索したほうが簡単かもしれません。

2009/03/17 アドレスブックで表示中のPersonに画像をTIFF変換して読み込み

選択した画像をTIFFに変換してファイルに書き込んだのちに変数に読み込み、アドレスブックで表示中のPersonの画像として設定するAppleScriptです。

スクリプト名:アドレスブックで表示中のPersonに画像をTIFF変換して読み込み
set aFile to choose file

set aType to retImageType(aFile) of me
if aType = "TIFF" then
  set sRes to aFile
else if aType is in {"JPEG", " PSD", "PNG", "PDF", "GIF"} then
  set sRes to convertToTIFF(aFile) of me
end if

エラー時の対応
if sRes = false then
  display dialog "Error in saving image"
  
return
end if

set aaa to path of sRes
set idata to read file aaa as TIFF picture

tell application "Address Book"
  set aPerson to selection
  
set aSel to first item of aPerson
  
if (exists image of aSel) then
    beep
  else
    set image of aSel to idata
  end if
  
save addressbook
end tell

指定画像を128×128のTIFFに変換する
on convertToTIFF(aFile)
  ファイルの親フォルダへのパス
  
tell application "Finder"
    set aFol to (folder of aFile) as alias
  end tell
  
set aFol to aFol as Unicode text
  
  
ファイル名から拡張子を外した文字列
  
tell application "Finder"
    set aName to name of aFile
  end tell
  
set aName to retFileNameWithoutExt(aName) of me
  
  
set aFullPath to aFol & aName & ".tiff"
  
  
tell application "Image Events"
    launch
    
activate
    
set this_image to open aFile
    
set {widthNum, heightNum} to dimensions of this_image
    
scale this_image to size 128
    
try
      set sRes to (save this_image as TIFF in file aFullPath)
    on error
      set sRes to false
    end try
  end tell
  
  
return sRes
end convertToTIFF

ファイル名から拡張子を外す
on retFileNameWithoutExt(fileNameStr)
  set fLen to length of fileNameStr
  
set revText to (reverse of (characters of fileNameStr)) as string 逆順テキストを作成
  
set anOffset to offset of "." in revText
  
set fRes to text 1 thru (fLen - anOffset) of fileNameStr
  
return fRes
end retFileNameWithoutExt

on retImageType(aFile)
  tell application "Image Events"
    launch
    
activate
    
set this_image to open aFile
    
set fRes to file type of this_image
    
close aFile
  end tell
  
return fRes as string
end retImageType

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/10/19 アドレスブックで選択中のPersonの情報を取得する

アドレスブックで、選択中のPersonの情報を取得します。AppleScriptにおいて、アプリケーションの画面上で選択中のオブジェクトの情報を取得する機能は、最も重要で欠かせないものです。

選択中のオブジェクトを取得するにあたり、3つほど考慮すべき重要なポイントがあります。

1つ目は、アプリケーションが複数のウィンドウを表示可能なタイプかどうかということです。エディタやワープロのように「書類」を1つのウィンドウで扱うものだけでなく、Mail.appのように複数のビューワーウィンドウをオープンできるものもあります。こうしたアプリケーションの場合、最前面のdocumentやviewerを求め、それらに対してselectionを取得することになります。

2つ目は、選択中のオブジェクトが複数同時に選択可能かどうか、ということです。1つのオブジェクトのみ選択されるアプリケーションであれば、selectionの情報をそのまま使えますが、複数選択が可能な場合には複数のオブジェクトに対応できるように処理を記述しておくことになります。

3つ目は、選択中のオブジェクトの種類です。selectionで取得されるオブジェクトの種類(=class)が一定の場合(アドレスブックなど)と、そうでない場合(InDesignなど)があります。

アプリケーションの開発者側がこうした状況をきちんと認識していないと、対応が中途半端でScriptingしづらくなり、「AppleScriptを正しく書いたつもりなのに、期待した結果が得られない」ことになったりもします。これが、AppleScriptの習得を困難にしているケースもあり、海外のScripterと情報を共有することがたいへん重要です。

スクリプト名:アドレスブックで選択中のPersonの情報を取得する
tell application "Address Book"
  set aPerson to selection
  
set aSel to item 1 of aPerson
  
tell aSel
    properties
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/10/19 アドレスブックで所有者の情報を取得する

アドレスブックで、所有者(ログイン中のユーザー)の情報を取得するサンプルです。AddressBookの登場当初、この機能がなくてずいぶんと苦労させられましたが……。

スクリプト名:アドレスブックで所有者の情報を取得する
tell application "Address Book"
  set myCard to my card
  
> person id "094F257D-ED10-4844-B9FD-59FD995D3A69:ABPerson"
  
  
tell myCard
    set fName to first name
    
set lName to last name
    
set yomiganaF to phonetic first name
    
set yomiganaL to phonetic last name
    
    
set nameText to lName & fName > 長野谷隆昌
    
set phoneticTect to yomiganaL & yomiganaF >ナガノヤタカアキ
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に