Archive for 4月, 2008

2008/04/29 エイリアスをDockに追加する

Dockにエイリアスを追加するサブルーチンです。よくありがちな処理なので、このぐらいは命令を標準装備していてほしいものです。Mac OS X 10.5上では動作確認を行ってありませんが、多分動くでしょう。

スクリプト名:エイリアスをDockに追加する
set addApp to choose file with promptPlease choose an app to Dockdefault location path to applications folder
addAliasToDock(addApp) of me

エイリアスをDockに追加する
on addAliasToDock(anAlias)
  set addAppPath to (POSIX path of anAlias) as Unicode text
  
do shell scriptdefaults write com.apple.dock persistent-apps -array-add ‘tile-datafile-data_CFURLString” & addAppPath & “_CFURLStringType0
  
do shell scriptsh -c \”killall Dock\”
end addAliasToDock

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

2008/04/27 modemでダイヤルする2

最近のマシンにはモデムが標準装備されていないので、電話回線にダイヤルする処理は滅多に行いませんが……ダイヤルするサンプルです。すでに手元に検証できる環境がないため未検証ですが、参考までに。

スクリプト名:modemでダイヤルする2

set telephoneNo to "0312345678"
set x to do shell script "efax -d /dev/cu.modem -t " & telephoneNo

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

2008/04/27 modemでダイヤルする

最近のマシンにはモデムが標準装備されていないので、電話回線にダイヤルする処理は滅多に行いませんが……ダイヤルするサンプルです。すでに手元に検証できる環境がないため未検証ですが、参考までに。

スクリプト名:modemでダイヤルする
set telephoneNo to0312345678
using terms from applicationInternet Connect
  tell applicationInternet Connect
    connect to telephone number telephoneNo
  end tell
end using terms from

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

2008/04/23 rmコマンドで指定フォルダ内のファイルの強制削除

指定フォルダ内のファイルをすべて(フォルダもファイルも)削除するサブルーチンです。ファイルの削除はFinderに対してdeleteコマンドを発行して行わせることもできますが、ゴミ箱にファイルが追加されるうえに、システム環境設定で「ユーザーインタフェースのサウンドエフェクトを再生」がオンになっていれば、ファイル削除を行うたびに音が鳴るわけで、ひじょうにうっとおしいことこの上ないことになります。

スクリプト名:rmコマンドで指定フォルダ内のファイルの強制削除.scpt

set a to choose folder
deleteInsideFolder(a) of me

指定フォルダ内をすべて削除
on deleteInsideFolder(aFol)
  set aU to (POSIX path of aFol)
  
  –
本当にこれでいいのか? folder or directoryであることをチェックすべきでは?
  
if aU does not end with "/" then
    set aU to aU & "/"
  end if
  
set aU to (quoted form of aU) & "*" –quoted formをつけてしまうと、ワイルドカードが効かない
  
  
try
    do shell script "rm -rf " & aU
  end try
end deleteInsideFolder

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

2008/04/22 指定文字列の中に指定リストの各アイテムが含まれているかをチェック

指定の文字列が指定リストの内容のうちのいずれかが入っているかどうかを調べます。
(more…)

2008/04/22 SafariでオープンしているWindowをすべてクローズする

複数のウィンドウをオープンするアプリケーションを相手にScriptを書くときの基本中の基本、すべてのウィンドウをクローズする処理です。とりあえず、このサンプルはSafari用ですが、InDesignでもIllustratorでもPhotoshopでも、すべてのWindow(ドキュメント)をクローズするというのは必須の処理です。

スクリプト名:SafariでオープンしているWindowをすべてクローズする
closeSafariWindows() of me

SafariでオープンしているWindowをすべてクローズする
on closeSafariWindows()
  tell application "Safari"
    set docCount to count every document
    
if docCount is not equal to 0 then
      try
        close every document
      end try
    end if
  end tell
end closeSafariWindows

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

2008/04/22 Safariの選択部分をGoogle Earthで開く

Webサイト上にGoogle Earthの位置情報ファイルkmlの内容が貼付けられているような場合に、それを選択しておくと、kmlファイルに書き出してGoogle Earthでオープンするというサンプルです。

earth1jpeg.jpeg

earth2.jpeg

スクリプト名:Safariの選択部分をGoogle Earthで開く
tell applicationSafari
  set a to do JavaScriptunescape(getSelection())in document 1
end tell

set a to a as Unicode text
if a = “” then return

set dPAth to path to desktop
set tmpOut to (dPAth as string) & “temp.kml
write_to_file(a, tmpOut, false) of me
saveInEncoding(a, tmpOut, “UTF8“) of meUTF8

do shell scriptsync

tell applicationGoogle Earth
  activate
  
open file tmpOut
end tell

指定の文字エンコーディングでファイル書き出し
on saveInEncoding(aText, aPath, aEncoding)
  
  
set a to aText as Unicode text
  
  
set aTmp to path to temporary items
  
  
set outFile to (aTmp as string) & “temporary_utf16be_text_fromAS.txt
  
write_to_file(a, outFile, false) of me
  
  
do shell scriptsync
  
  
set outPPath to quoted form of POSIX path of (outFile as alias)
  
set cnvPPath to quoted form of POSIX path of aPath
  
  
try
    do shell scripticonv -f UTF-16BE -t ” & aEncoding & “ ” & outPPath & “ > ” & cnvPPath
    –
do shell script “iconv -f UTF-16LE -t ” & aEncoding & ” ” & outPPath & ” > ” & cnvPPath
  end try
  
  
do shell scriptsync
  
  
try
    do shell scriptrm -f ” & outPPath
  end try
  
end saveInEncoding

ファイルの追記ルーチン「write_to_file」
追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file

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

2008/04/22 Safariの選択部分のテキストを取得する

Safariの再前面のウィンドウで選択中のテキストを取得するサンプルです。アプリケーション上で選択中のテキストを取得して処理するというのは、AppleScript対応アプリケーションに期待したい機能です。ただ、アプリケーション開発者の無理解などによりそれが実装されていないケースもあります。

まさにSafariがそれに該当するもので……本来ならお手上げ状態なのですが、SafariがJavaScriptを実行できるためにウラワザ的に選択部分を取得できる、というお話です。

スクリプト名:Safariの選択部分のテキストを取得する(新)
tell applicationSafari
  set a to do JavaScriptunescape(getSelection())in document 1
end tell

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

2008/04/22 Safariの最新のダウンロード状況を取得する

Safariのダウンロードリストを監視して最新のダウンロード状況を取得します。途方もなく大きなアーカイブをダウンロードするとか、アクセスが集まりすぎてダウンロードに時間がかかるような場合に、職場のマシンでダウンロードさせつつ(とっとと)帰宅したい。そんなときに、Safariのダウンロード状況を定期的に確認しつつ……完了したらメールで知らせてマシンをスリープさせる……という即席システムを作って運用しました。

dl_statjpeg.jpeg

スクリプト名:Safariの最新のダウンロード状況を取得する
getLatestDLstat() of me

Safariの最新のダウンロード状況を取得する
on getLatestDLstat()
  –activate application “Safari”
  
tell applicationSystem Events
    tell processSafari
      – insert GUI Scripting statements here
      
set wList to name of every window
      
ifダウンロードis not in wList then return “”
      
      
tell list 1 of scroll area 1 of windowダウンロード
        set lastG to last group
      end tell
      
      
tell lastG
        set sCount to count every static text
        
set dispTxt to “”
        
repeat with i from 1 to sCount
          set aVal to value of static text i
          
set dispTxt to dispTxt & aVal & return
        end repeat
      end tell
    end tell
  end tell
  
return dispTxt
end getLatestDLstat

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

2008/04/22 Safariでタイムアウト時間を指定してURLを開く

Safariで指定のURLをオープンするサンプルです。オープンした後にページのローディングが完了するまで待ちますが、指定時間以内に完了しなかったらエラーとします。よくある処理です。

スクリプト名:SafariでURLをローディング
set aURL tohttp://www.piyocast.com/as/
set aURL to “”

tell applicationSafari
  set d to count every window
  
if d = 0 then
    make new window
    
tell document 1
      set URL to aURL
    end tell
  else
    if aURL is not equal to “” then
      tell document 1
        set URL to aURL
      end tell
    end if
  end if
  
  
page_loaded(10) of me
  
  
set a to do JavaScriptdocument.titlein document 1
end tell

on page_loaded(timeout_value)
  delay 2
  
repeat with i from 1 to the timeout_value
    tell applicationSafari
      if (do JavaScriptdocument.readyStatein document 1) iscompletethen
        return true
      else if i is the timeout_value then
        return false
      else
        delay 1
      end if
    end tell
  end repeat
  
return false
end page_loaded

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

2008/04/17 JPEG画像の破損チェック

JPEG画像が破損していないかどうか、チェックを行うサブルーチンです。Web上のさまざまな情報をダウンロードして処理するような場合、それが破損していないかどうかチェックを行うことが重要です。

スクリプト名:JPEG画像ファイルの破損チェック
set aFile to choose file of type ("public.jpeg")
set aRes to VerifyCompleteJPEG(aFile) of me
> 破損しているとfalse、破損していなければtrue

JPEG画像ファイルの破損チェック
JPEGファイル末尾のJPEGマーカーが存在するかどうかを確認
on VerifyCompleteJPEG(f)
  set f to f as alias
  
try
    set s to read f from -2 for 2
    
if s = (ASCII character 255) & (ASCII character 217) then
      return true
    else
      return false
    end if
  on error
    return false
  end try
end VerifyCompleteJPEG

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

2008/04/15 GUI Scriptingの確認

GUI Scripting(Apple的にはUI Element Scriptingなんだけど、長いので誰もそう呼ばない)のオン/オフ検出は、System Eventsに問い合わせると分ります。

スクリプト名:GUI Scriptingの確認
tell applicationSystem Events
  set aRes to UI elements enabled
end tell
> trueだとオン、falseだとオフ

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

2008/04/13 URL選択ダイアログをオープン

choose URLコマンドでローカルネットワーク上にあるWeb/FTP/Telnet/File/News/Directory/Mediaサーバーおよびリモートアプリケーションを選択します。最近のネットワークプリンタは、Web経由でステータスを見られるようになっているようで、EPSONのプリンタPM-T960の情報をWebブラウザで見ることができました。

リモートアプリケーションについて、最近はリモートのAppleEventを受信できないようにしているアプリケーションもあり(FileMaker Proなど)すべてのアプリケーションをLAN経由でリモート制御できるわけではありませんが、リモートAppleEventはひじょうに有用性の高い機能です。

url1.jpg

url3.jpg

url2.jpg

スクリプト名:URL選択ダイアログをオープン
set aURL to choose URL
open location aURL

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

2008/04/13 URL Access ScriptingでDL

URL Access Scriptingで指定URLのファイルをローカルのHDD上にダウンロードするサンプルです。AppleScriptでファイルのダウンロードを行う場合には、URL Access Scriptingで行うか、shell commandのcurlを用いるのが一般的です。

# Mac OS X 10.7では、URL Access Scriptingが廃止になったので、本Scriptはそのままでは動きません

ほかに、ユーザー認証を行う必要のある場所にファイルが存在している場合には、Safariをコントロールしてダウンロードしたりもします。同期処理を行いたい場合にはURL Access Scriptingを、非同期で多数のファイルを処理する場合にはcurlを使ったりしていますが、このあたりは個人的な「趣味」の問題でしょう。Mac OS 9の時代にはURL Access Scriptingの信頼性はいまひとつでしたが、Mac OS Xの時代になってからは、連続して稼働してもとくに問題は見られません。

スクリプト名:URL Access ScriptingでDL
パスをstringでcastしたあとにunicodeにcastしているのはMac OS X 10.4までの仕様。10.5では必要ない
set aPath to (path to desktop folder from user domain as text)
set dPath to aPath & “test.icsas Unicode text

try
  with timeout of 30 seconds
    tell applicationURL Access Scripting
      activate
      
set aURL tohttp://homepage.mac.com/ical/.calendars/Japanese32Holidays.ics
      
download aURL to file dPath with progress
    end tell
  end timeout
on error
  display dialogDownload Error
end try

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

2008/04/12 選択中のメッセージの実ファイルが存在する場所を取得するv3

Mail.appで選択中のメッセージの実ファイルが存在するパスを取得します。MLから拾ってきたものをベースにサブルーチン化したものです。

スクリプト名:選択中のメッセージの実ファイルが存在する場所を取得するv3
Phillip Akerによる投稿を元にサブルーチン化
(*

philip@vcn.bc.ca
Subject: Re: Get .emlx file for Mail message?
Date: 2006年9月24日 18:49:39:JST
*)

set mRes to retSelectedMessagePath() of me

Mail.appで選択中のメッセージの実ファイルが存在するパスを取得する
on retSelectedMessagePath()
  set lpath to POSIX path of (path to library folder from user domain)
  
set res to {}
  
tell applicationMail
    set sels to (get selection)
    
if (sels = {}) or ((count of sels) is not equal to 1) then
      return false
    end if
    
    
repeat with i from 1 to count of sels
      set p to.mbox/Messages/
      
set m to mailbox of item i of sels
      
set mid to id of item i of sels
      
tell m
        set n to name
        
if (its account exists) then
          tell its account
            if (account type is not pop) then set p to.imapmbox/Messages/
            
set end of res to account directory & “/” & n & p & mid & “.emlx
          end tell
        else
          set c to its container
          
set p to n & p
          
repeat while c exists
            set p to c’s name & “/” & p
            
set c to c’s container
          end repeat
          
set end of res to lpath & “Mail/Mailboxes/” & p & mid & “.emlx
        end if
      end tell
    end repeat
  end tell
  
set aRes to item 1 of res
  
set fPath to POSIX file aRes
  
return fPath
end retSelectedMessagePath

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

2008/04/12 添付ファイルのダウンロード先を求める

Mail.appの添付ファイルのダウンロード先フォルダを取得します。

スクリプト名:添付ファイルのダウンロード先を求める
download_path() of me

on download_path()
  set p to (path to preferences folder from user domain ?
    as Unicode text) & “com.apple.mail.plist
  tell applicationSystem Eventsto set f to value of ?
    property list itemMailDownloadsPathof property list file p & “/
  if f does not start with~then return f
  
set h to POSIX path of (path to home folder)
  
if (count f) < 3 then return h
  
h & f’s text 3 thru -1
end download_path

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

2008/04/12 Mail.appで選択中のメッセージから迷惑メールフラグの状態を取得する

Mail.appで選択中のメッセージから迷惑メールフラグの状態を取得するサンプルです。メッセージは複数選択されている場合もあるため、それに対応しておく必要があります。

スクリプト名:Mail.appで選択中のメッセージから迷惑メールフラグの状態を取得する
tell applicationMail
  set a to selection
  
set b to item 1 of a
  
tell b
    set c to junk mail status
  end tell
end tell

> false

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

2008/04/12 Mail.appで現在選択されているメールボックスの情報を取得する

Mail.appで現在選択中のメールボックスの情報を取得します。メッセージは選択されている場合と選択されていない場合があり、それぞれの状況を考慮しておく必要がありますが、メールボックスについては必ずどれかが選択されています。

mail5.jpg

スクリプト名:Mail.appで現在選択されているメールボックスの情報を取得する
tell applicationMail
  tell message viewer 1
    set mbList to selected mailboxes
  end tell
end tell

> {mailbox “ML/Apple US/ASに関係のあるもの/Apple Help” of application “Mail”}

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

2008/04/12 Mail.appでメッセージビューワーの情報を取得する

Mail.appでメッセージ表示用ビューワーウィンドウの情報を取得します。Mail.appは複数のビューワーウィンドウを同時に表示できるため、AppleScript側でもそれを考慮しておく必要があります。

mail3.jpg

mail4.jpg

スクリプト名:Mail.appでメッセージビューワーの情報を取得する
tell applicationMail
  count every message viewer
  
set aProp to properties of message viewer 1
end tell

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

2008/04/12 Mail.appで新着メールの確認インタバルを変更する

Mail.appで新着メールの確認間隔(単位:分)を取得/変更するサンプルです。

スクリプト名:Mail.appで新着メールの確認インタバルを変更する
tell applicationMail
  set a to fetch interval取得
  
set fetch interval to 5設定
end tell

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

2008/04/12 Mail.appで新着メールを確認する

Mail.appで新着メールを確認します。

スクリプト名:Mail.appで新着メールを確認する
tell applicationMail
  check for new mail
end tell

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

2008/04/12 Mail.appでAccountの情報を取得する

Mail.appでメールアカウントの情報を取得するサンプルです。Mail.app上には複数のアカウントが登録されている可能性があるため、それに対応しておく必要があります。

スクリプト名:Mail.appでAccountの情報を取得する
tell applicationMail
  set a to every account
  
set anAccount to item 1 of a
  
tell anAccount
    set b to properties
  end tell
end tell

> {move deleted messages to trash:false, account type:pop, email addresses:{”maro@XXXXXX.jp”}, empty trash on quit:true, file path:”/Users/maro/Library/Mail/POP-maro@XXX.XXX.XXX.XXX”, authentication:none, empty junk messages frequency:0, delayed message deletion interval:7, enabled:true, class:pop account, password:”Account passwords can only be set, not read.”, big message warning size:-1, full name:”Takaaki Naganoya”, uses ssl:false, empty sent messages on quit:false, name:”xxxx.jp”, port:110, empty trash frequency:0, empty junk messages on quit:true, delete mail on server:missing value, user name:”maro”, smtp server:smtp server “xxxxxxx.xxx.xx.jp” of application “Mail”, empty sent messages frequency:-1, include when getting new mail:true, server name:”XXX.XXX.XXX.XXX”, delete messages when moved from inbox:false}

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

2008/04/12 Mail.appで選択したメッセージの所属するメールボックスを得る

Mail.app上で選択しているメールが入っているメールボックスを求めます。画面図の状態になっている場合に、得られる結果は

  mailbox “ML/Apple US/ASに関係のあるもの/AppleScript Users” of application “Mail”

となります。

mail2.jpg

スクリプト名:Mail.appで選択したメッセージの所属するメールボックスを得る
tell applicationMail
  set a to selection
  
set b to item 1 of a
  
set aMailBox to mailbox of b
end tell

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

2008/04/12 Mail.appでメールボックスのcontainerを求める

Mail.appで選択中のメールボックス「を含むもの」(container)を取得します。この画面図の例では、mailbox “ML/Apple US/ASに関係のあるもの” of application “Mail”が返ってきます。

mail1.jpg

スクリプト名:Mail.appでメールボックスのcontainerを求める
tell applicationMail
  set a to selection
  
set b to item 1 of a
  
set aMailBox to mailbox of b
  
set aCon to container of aMailBox
  
end tell

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

2008/04/12 Systranで翻訳

Systranを利用して、簡単な日本語の単語を英訳します。

スクリプト名:Systranで翻訳.scpt
set a to translateToEnglish("ひよこ")
a
> "Chick"

on translateToEnglish(aParam)
  set resultxml to do shell script "curl ‘http://w4.systranlinks.com/trans’ –data ‘id=sherlock&charset=utf-8&api=1&lp=ja_en&text=" & aParam & ""
  
set aRes to paragraph 4 of resultxml
end translateToEnglish

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

2008/04/11 TextEditでドキュメントから全属性を取得する

Apple純正なのにやたらとAppleScriptから操作しづらく、「悪しき実装例」「AppleのAppleScript対応が一番へたくそ」「サードパーティにScript対応を薦めているのに自分たちの体たらくはなんなんだ?」と名指しで全世界のScripterに非難されているTextEditを操作して、ドキュメントから全属性を取得するサンプルです。本来、カラー、フォント、サイズ、テキストは別々に取得されていますが、扱いやすいようにまとめています。

textedit2.jpg

スクリプト名:TextEditでドキュメントから全属性を取得する
tell applicationTextEdit
  tell text of document 1
    set colorList to color of every attribute run
    
set fontList to font of every attribute run
    
set sizeList to size of every attribute run
    
set textList to characters of every attribute run
    
    
set itemCount to length of colorList
    
    
set contList to {}
    
repeat with i from 1 to itemCount
      set aRec to {textData:(item i of textList) as string, colorData:item i of colorList, fontData:item i of fontList, sizeData:item i of sizeList}
      
set the end of contList to aRec
    end repeat
  end tell
end tell

contList

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

2008/04/11 TextEditでWordごとにColorを取得

TextEditで、本文をWord単位で文字色を調べます。Word単位といっても日本語に対しては文字種類の変わり目を便宜上Wordと呼んでいるだけです。Microsoft Word v.Xのように形態素解析して本当に文法的なWordを返してくれたりすることはありません。

textedit1.jpg

スクリプト名:TextEditでWordごとにColorを取得
tell applicationTextEdit
  tell text of document 1
    repeat with i from 1 to (count words)
      set aCol to color of word i
      
log aCol
    end repeat
  end tell
end tell

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

2008/04/11 CD Burnフォルダを作成

CDへの書き込みを行うためのフォルダをデスクトップに作成します。こんなアイコンがついているフォルダです。

cdburn_folder.jpg

スクリプト名:CD Burnフォルダを作成
do shell scriptmkdir -p ~/Desktop/Burning.fpbf

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

2008/04/11 入れ子のリストをTAB区切りのテキストとして書き出し

{{item11,item12},{item21,item22},{item31,item32}} ……のような入れ子になっているリストをTAB区切りのテキストに書き出すサブルーチンです。
(more…)

2008/04/11 日本語入りテキストのURLエンコーディング

日本語入りテキストをURLエンコーディングするサブルーチンです。サンプルとして、Script EditorのURL LinkのURL(エンコーディングされたテキスト)を作成し、それをオープンします。Script Editorで新規書類が作成され、スクリプトの本文が入ります。ちょうど、このようにして本サイトのScript Linkの部分を生成しています。

スクリプト名:日本語入りテキストのURLエンコーディング.scpt
set foo to encodeURL(”display dialog \”You’re welcome!\” buttons {\”あほんだら\”} giving up after 3“)
open locationapplescript://com.apple.scripteditor?action=new&script=” & foo

on encodeURL(str)
  return do shell script (”python -c \”import sys, urllib; print urllib.quote(sys.argv[1]) \” as Unicode text) & quoted form of str
end encodeURL

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