Archive for 2月, 2011

2011/02/27 指定のテキストをAppleScriptとしてコンパイルし、実行可能なアプレットとして出力する

指定のテキストをAppleScriptとしてosacompileコマンドでコンパイルし、実行可能なアプレット(ドロップレット)として指定パスに保存するAppleScriptです。

テキストから実行可能なアプリケーションを生成する場合には、AppleScriptエディタ(スクリプトエディタ)を外部からAppleScriptでコントロールするやり方をよく使ってきました。手あかがつくほど使った方法なので、信頼性も高く、あえて同じことを別のやり方でできるように準備しておく必要は(本来は)ありません。

しかし、Appleが将来的な方針を明らかにしない以上、何らかの方針転換を行った場合に備えておくことも必要です。たいていの(重要な)処理は複数のやり方で実現できるように、下調べをしてあります。その一環として、このサブルーチンを作ることにしました。

Mac OS X 10.6でosacompileコマンドに実行ファイル作成機能が付加されたため、これを使って指定のテキストからバイナリを作成できるようにしてみました。

休みの日にテレビを見ながら作っていたので、ひどく散漫なコードになってしまい、無駄な処理なども残っているかもしれません。ただ、期待どおりの動作は行うようなのでとりあえずこんなもので。

osacompileコマンドのアプレットの出力パス指定ではずいぶん手間どらされました。出力先をフルパスで指定してもうまく動作せず、cdコマンドとの合わせ技でなんとか。

スクリプト名:指定のテキストをAppleScriptとしてコンパイルし、実行可能なアプレットとして出力する
set asText to “on run
tell application \”Finder\”
beep
display dialog \”test\”
beep
end tell
end run

on open(aPath)

end

set asFile to choose file name
set asRes to makeASexecutable(asText, asFile) of me

if asRes is not equal to true then
  display dialog asRes
  
return
end if

–指定のテキストをAppleScriptとしてコンパイルし、実行可能なアプレットとして出力する
on makeASexecutable(aText, outPathAlias)
  
  
–出力先のaliasからファイル名のみ撮り出す
  
set aStr to outPathAlias as string
  
set fnRes to getLastLayerOfDirData(aStr) of me
  
  
–指定のファル名に拡張子が適切に付いていない場合には補う
  
if fnRes does not end with “.app” then
    set fnRes to fnRes & “.app”
  end if
  
  
–テンポラリフォルダ内のテキストファイルに書き出す
  
set aFileName to (do shell script “uuidgen”) & “.applescript”
  
set tmpAppName to (do shell script “uuidgen”) & “.app”
  
  
set aTempFol to path to temporary items folder from system domain
  
set aTempFolPosix to (POSIX path of aTempFol) & aFileName
  
  
set aTempPathText to (aTempFol as string) & aFileName
  
write_to_file(aText, aTempPathText, false) of me
  
  
–ファイルキャッシュをHDDにシンクロさせる
  
–do shell script “sync”–> 実行しなくても大丈夫だった
  
  
–osacompileコマンドでアプレットを生成
  
set sText to “cd “ & (quoted form of POSIX path of aTempFol) & ” && osacompile -s -x -o “ & fnRes & ” “ & aFileName
  
try
    –コンパイル時にアプリケーションの起動を待ったりする可能性があるので、待ち時間を1時間に設定
    
with timeout of 3600 seconds
      do shell script sText
    end timeout
  on error erMes
    return erMes
  end try
  
  
  
–テンポラリに書き込んだTextのAppleScriptを消す
  
try
    do shell script “rm -f “ & quoted form of aTempFolPosix
  end try
  
  
  
–生成したアプレットを指定のフォルダに移動する
  
set origAppPath to POSIX path of ((aTempFol as string) & fnRes)
  
set destPath to POSIX path of getOnlyFolder(aStr) of me & fnRes
  
  
try
    do shell script “mv -f “ & quoted form of origAppPath & ” “ & quoted form of destPath
  on error erMes
    return erMes
  end try
  
  
return true
  
end makeASexecutable

–テキストで与えられたパスデータから、フォルダのみを返す
on getOnlyFolder(a)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {“:”}
  
set aList to text items of a
  
set bList to items 1 thru -2 of aList
  
set aText to bList as string
  
set AppleScript’s text item delimiters to curDelim
  
set aText to aText & “:”
  
return aText
end getOnlyFolder

–テキストで与えられたパスデータから、最終階層のテキストのみを返す
on getLastLayerOfDirData(aData)
  set aColon to “:” as Unicode text
  
copy aData to bData
  
if bData ends with “:” then
    set bData to text 1 thru -2 of bData
  end if
  
  
set aLen to length of bData
  
set rData to reverse of (characters of bData)
  
set rData to rData as string
  
set dPos to offset of aColon in rData
  
set resData to text (aLen - dPos + 2) thru -1 of bData
  
return resData
  
end getLastLayerOfDirData

–ファイルの追記ルーチン「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

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

2011/02/22 選択した項目を新規フォルダに移動

Finderで選択中の項目を新規フォルダに移動するAppleScriptです。

説明文を書いたり画面キャプチャを撮る時間のほうがプログラム作成の数十倍の時間がかかるという(困った)代物です。

まちがいなく「組み捨て」レベルで保存すらする価値がないものですが、そういうものでも必要な人がいるというリサーチを行い、試しに組んでみました。

まずは、Finder上でファイルを選択。

scrn1.jpg

この状態で本スクリプトを実行すると……フォルダの選択を求められます。

scrn2.jpg

フォルダ選択ダイアログには新規フォルダ作成のボタンがついているため、ここで新規作成ボタンを押すと選択中のフォルダの中に新規フォルダを作成できます。

scrn3.jpg

すると……新規フォルダの中にさきほど選択していたファイルが移動しているのが分かります。

scrn4.jpg

……あまり、何かが激しく便利になったり、作業効率が向上したりすることはないようですが…………

スクリプト名:選択した項目を新規フォルダに移動
set newFol to choose folder with prompt “移動先のフォルダを選択してください。”

tell application “Finder”
  set aList to selection as alias list
  
move aList to folder newFol
end tell

beep

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

2011/02/21 「m月d日」の文字列を「m/d」に変換して返す

「m月d日」のフォーマットの文字列を「m/d」に変換して返すAppleScriptです。

Mac OS X 10.6上で作成してあとから10.4.11上でも動くように対応したものです。まー、この手の簡単なテキスト整形サブルーチンは大量に生々しいものがゴロゴロしていますが、このぐらいのあたりさわりのないものしか出せないような気が、、、、

スクリプト名:「m月d日」の文字列を「m/d」に変換して返す
set aStr to "11月1日"
set aRes to retMonthSlashDateStr(aStr) of me
–> "11/1"

–「m月d日」の文字列を「m/d」に変換して返す
on retMonthSlashDateStr(aStr)
  set {mStr, dStr} to retMonthStrAndDateStr(aStr, {"月", "日"}, 2) of me
  
set resStr to mStr & "/" & dStr
  
return resStr
end retMonthSlashDateStr

–指定リストを指定デリミタでparseして日付文字列をリストにして、先頭から指定アイテムまで取り出して返す
–ただし、日付など「月」「日」が必ず存在しているという前提条件が成立するものだけが処理対象
on retMonthStrAndDateStr(aStr, delimiterList, lastItem)
  set osVer to system attribute "sys2"
  
  
if osVer 5 then
    –Mac OS X 10.5以上の場合
    
set curDelim to AppleScript’s text item delimiters
    
set AppleScript’s text item delimiters to delimiterList
    
set aList to text items of aStr
    
set AppleScript’s text item delimiters to curDelim
    
set bList to items 1 thru lastItem of aList
    
return bList
    
  else
    –Mac OS X 10.4以下の場合
    
set resList to {}
    
    
repeat with i in delimiterList
      set curDelim to AppleScript’s text item delimiters
      
set AppleScript’s text item delimiters to i –10.4ではデリミタをリストで指定できないので1つずつ指定
      
set aList to text items of aStr
      
set AppleScript’s text item delimiters to curDelim
      
      
set the end of resList to item 1 of aList
      
      
try
        set aStr to contents of (item 2 of aList) –ここ、あんまりよくないな〜。実害はないけど、美しくない
      end try
      
    end repeat
    
    
return resList
  end if
  
end retMonthStrAndDateStr

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

2011/02/16 TextViewの内容を取得する

AppleScriptObjCでTextViewからテキストを取得するサンプルです。

→ ダウンロード

2011/02/11 システム環境設定で指定のpaneを表示する

システム環境設定(System Preferences.app)で指定のpaneを表示するAppleScriptです。

まず、どのpaneを表示するかを決める前に、AppleScriptからどのようなpaneが、どのように見えるのかを確認しておかなければなりません。IDや名称などはOSのバージョンが上がると変更になることもあるからです(あとは、AppleがOSのアップデータで新たにバグを作って、それに影響を受けるとか)。

まずは、最低でもAppleScriptエディタ(Mac OS X 10.5まではスクリプトエディタ)で、システム環境設定のAppleScript用語辞書ぐらいは調べておく必要があります。

AppleScriptエディタにシステム環境設定のアイコンをドラッグ&ドロップすると、システム環境設定の用語内容を確認できます。

pref2.jpg

paneを変更するのであれば、当然「pane」にどのようにアクセスできるかは知っておかなくてはなりません。

pref3.jpg

id、localized name、nameあたりを調べてみましょう。

スクリプト名:システム環境設定ですべてのpaneのIDを取得する
tell application “System Preferences”
  set pList to id of every pane
end tell

–> {”com.avatron.AirDisplayPrefPanel”, “com.apple.preferences.Bluetooth”, “com.apple.preference.digihub.discs”, “com.divx.divxprefs”, “com.apple.preference.dock”, “com.apple.preference.expose”, “net.telestream.wmv.prefpane”, “com.growl.prefpanel”, “com.google.MacFUSE”, “com.apple.preference.internet”, “org.perian.PerianPane”, “com.ecamm.printopia”, “com.spanningsync.prefPane”, “com.apple.preference.spotlight”, “com.apple.prefs.backup”, “com.apple.preferences.users”, “com.apple.preference.general”, “com.apple.preference.keyboard”, “com.apple.preference.sound”, “com.apple.preference.speech”, “com.apple.preference.security”, “com.apple.preferences.softwareupdate”, “com.apple.preference.displays”, “com.apple.preference.desktopscreeneffect”, “com.apple.preference.trackpad”, “com.apple.preference.network”, “com.apple.preference.printfax”, “com.apple.preferences.parentalcontrols”, “com.apple.preference.mouse”, “com.apple.preference.universalaccess”, “com.apple.preference.startupdisk”, “com.apple.preferences.sharing”, “com.apple.Localization”, “com.apple.preference.energysaver”, “com.apple.preference.datetime”}

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

スクリプト名:システム環境設定ですべてのpaneのlocalized nameを取得する
tell application “System Preferences”
  set pList to localized name of every pane
end tell

–> {”Air Display”, “Bluetooth”, “CD と DVD”, “DivX”, “Dock”, “Exposé と Spaces”, “Flip4Mac WMV”, “Growl”, “MacFUSE”, “MobileMe”, “Perian”, “Printopia”, “Spanning Sync”, “Spotlight”, “Time Machine”, “アカウント”, “アピアランス”, “キーボード”, “サウンド”, “スピーチ”, “セキュリティ”, “ソフトウェア・アップデート”, “ディスプレイ”, “デスクトップとスクリーンセーバ”, “トラックパッド”, “ネットワーク”, “プリントとファクス”, “ペアレンタルコントロール”, “マウス”, “ユニバーサルアクセス”, “起動ディスク”, “共有”, “言語とテキスト”, “省エネルギー”, “日付と時刻”}

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

スクリプト名:システム環境設定ですべてのpaneのnameを取得する
tell application “System Preferences”
  set pList to name of every pane
end tell

–>
(*
{”Air Display”, “Bluetooth”, “CD と DVD”, “DivX”, “Dock”, “Expos
é
Spaces”, “Flip4Mac
WMV”, “Growl”, “MacFUSE”, “MobileMe”, “Perian”, “Printopia”, “Spanning
Sync”, “Spotlight”, “Time Machine”, “アカウント”, “アピアランス”, “キーボード”, “サウンド”, “スピーチ”, “セキュリティ”, “ソフトウェア
アップデート”, “ディスプレイ”, “デスクトップと
スクリーンセーバ”, “トラックパッド”, “ネットワーク”, “プリントと
ファクス”, “ペアレンタル
コントロール”, “マウス”, “ユニバーサル
アクセス”, “起動ディスク”, “共有”, “言語とテキスト”, “省エネルギー”, “日付と時刻”}
*)

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

と、こんな感じです。

……nameのあたりに微妙にバグっぽい実装が見られます。

Apple純正のpreferences paneがおそらく英語名称が返ってくるであろうnameでlocalized nameを返してきています。日本語ローカライズした担当が「しなくていいところまで日本語ローカライズ化」したためと思われます。おそらく、置換コマンドか何かで機械的に置き換えたんでしょう。この仕事をした担当者は相当使えない人間です。

Appleのどの担当者がどういうヘマをやらかすか認識した上で、「paneの指定にnameは使わないほうがよさそうだ。どうせ後でしれっと直すかもしれない」と考えます。

localized nameだと、英語やフランス語など別の言語環境で実行したときに動かなくなるので、ここは消去法で無難に「ID」で指定しておいたほうがよさそうです。

では、ひととおりのpaneのidをリストアップして、希望のpaneを表示状態にできるかどうか確認してみましょう。

スクリプト名:システム環境設定で指定のpaneを表示する
tell application “System Preferences”
  activate
  
  
set pList to id of every pane
  
set pRes to choose from list pList
  
  
set pItem to first item of pRes
  
  
set current pane to pane pItem
  
end tell

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

pref.jpg

選択したpaneを表示できたでしょうか? どうせAppleのやることなので、連中はすべての機能をチェックなどしていません。とりあえずすべてのpaneが選択できるか確認しておく必要があります。

そこまで調べて、最後に希望のpaneのIDを指定して表示状態にできるというわけです。

スクリプト名:システム環境設定で「日付と時刻」paneを表示状態にする
tell application “System Preferences”
  activate
  
set current pane to pane “com.apple.preference.datetime”
end tell

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

一見、何も工夫も努力もしていないかのように見える3行ぐらいのコードのために、そのぐらいの調査はしています。

アマチュアレベルで、自分の場所でいまのバージョンのOS上だけで動くコードならこのレベルでよいのですが、コードを配布して多くのユーザーに使ってほしいと考えた場合には、希望のpaneの名称を文字列で持っておいて、localized nameの一覧とその文字列を照合し、合致したらそのpaneのIDを取得して表示……というところまでやっておく必要があるでしょう。

システム環境設定のAppleScript用語辞書を見ていたら、paneの下のところにあるtype difinitionで……

pref4.jpg

こんなものを見つけました。作業途中に付けておいたのかもしれませんが、AppleScript用語辞書をエンジニア同士の文通欄にしてほしくないものです。「????」なんて、インターンの学生が分からなくて付けておいたメモぐらいにしか見えないのですが……つくづくAppleのチェックはザルだと思うものです。

2011/02/08 選択したファイルをQuickLook

選択したファイルをQuickLookで拡大表示するAppleScriptです。

The MacTipper Blogで紹介されていました。

ql1.jpg

最初、System Events経由でスペースキーのキーコードを送ってみたりしていたのですが、うまくいかず……検索してみたらThe MacTipper Blogを見つけた次第。

スクリプト名:選択したファイルをQuickLook
【コメント】 The MacTipper Blogより
http://www.mactipper.com/2009/03/quicklook-and-applescript.html
set a to choose file
quicklook(a) of me

on quicklook(the_file)
  set the_path to quoted form of (POSIX path of the_file) as string
  
do shell script (“qlmanage -p “ & the_path)
end quicklook

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

2011/02/06 指定のAutomator Workflowのファイルを実行する v3

指定のAutomator Workflow(Automator書類)を実行するAppleScriptです。

Mac OS X 10.5の途中のアップデートからAutomator RunnerやAutomator Launcherを通じてAppleScriptからAutomator Workflowを起動することができなくなってしまいました。セキュリティ向上のために取った策が裏目に出たと言われています。

一度、ヘルプビューワーのURLプロトコルがセキュリティホールになったことがあり、その直後からURLプロトコルが徹底的に塞がれて、URLプロトコル経由でアプリケーションのコントロールを行うと、実行が途中で止められたりしました。そのぐらいの時期にAutomator WorkflowのASからの実行がおかしくなった記憶があります。

AppleScriptからAutomatorのWorkflowを呼び出すケースはそれほどありませんが、まったくないわけでもありません(Excel書類にAutomator WorkflowやAppleScriptを埋め込んで実行したりしました。あとよく使うのはPDFの連結)。そこで、Mac OS X 10.6上でAutomator Workflowを呼び出す実験を行い、再利用できるようにルーチンにまとめておきました。

スクリプト名:指定のAutomator Workflowのファイルを実行する v3
set aWorkflow to choose file
set aRes to executeAutomatorWorkflow(aWorkflow) of me

–指定のAutomator Workflowのファイルを実行する
on executeAutomatorWorkflow(aWorkflow)
  set aShell to “/usr/bin/automator “ & (quoted form of POSIX path of aWorkflow)
  
with timeout of 3600 seconds
    try
      set aRes to (do shell script aShell)
    on error errorMes
      return errorMes
    end try
  end timeout
  
  
return aRes
end executeAutomatorWorkflow

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

2011/02/06 指定年のすべての日付をdateオブジェクトで取得する

指定年のすべての日付をdateオブジェクトで取得するAppleScriptです。

こういう基礎的なプログラムは、誰が組んでもあんまり差が出ないので、あえてゼロから組む必要性がなく……こうした基礎的な部品を組み合わせてどれだけ高度な処理を組み上げられるか、というところに頭を使いたいところです。

スクリプト名:指定年のすべての日付をdateオブジェクトで取得する
set thisYear to 2020
set dList to {}

repeat with i from 1 to 12
  set mLen to getMlen(thisYear, i) of me
  
repeat with ii from 1 to mLen
    set dStr to (thisYear as string) & "/" & (i as string) & "/" & (ii as string)
    
set the end of dList to date dStr
  end repeat
end repeat

dList

–指定月の長さを得る(日数)
on getMlen(aYear, aMonth)
  
  
set aDat to (aYear as text) & "/" & (aMonth as text) & "/1"
  
if aMonth is not equal to 12 then
    set eDat to ((aYear as text) & "/" & (aMonth + 1) as text) & "/1"
  else
    set eDat to ((aYear + 1) as text) & "/" & (1 as text) & "/1"
  end if
  
  
–set sDat to date aDat
  
set eDat to date eDat
  
set eDat to eDat - 1
  
  
set mLen to day of eDat
  
return mLen
  
end getMlen

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

2011/02/04 2行に別れているデータを1行分にまとめる

2行に別れているデータを1行分にまとめるAppleScriptです。

Excel上の選択範囲からデータを取得し、その内容が2行でワンセットになっているような場合に、2行目に存在しているデータについては1行目のアイテムにリストとして統合するものです。

たとえば、

   {{”4″, “56″, “52″}, {”", “64″, “61″}}

というデータがあったとして、これを本AppleScriptで処理すると……

  {{”4″, {”56″, “64″}, {”52″, “61″}}}

という結果が得られます。

スクリプト名:2行に別れているデータを1行分にまとめる
set aList to {{"4", "56", "52"}, {"", "64", "61"}}
set aLen to length of aList

set gList to {}


repeat with i from 1 to aLen by 2
  set line1List to contents of item i of aList
  
set line2List to contents of item (i + 1) of aList
  
  
–1データセット分を処理する
  
set aaLen to length of line1List
  
  
set aaList to {}
  
repeat with ii from 1 to aaLen
    set line1item to contents of item ii of line1List
    
set line2item to contents of item ii of line2List
    
    
if line2item is not equal to "" then
      set the end of aaList to {line1item, line2item}
    else
      set the end of aaList to line1item
    end if
    
  end repeat
  
  
set the end of gList to aaList
  
end repeat

gList
–> {{"4", {"56", "64"}, {"52", "61"}}}

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

2011/02/04 Illustratorで円を描く

Illustrator CS3で円を描くAppleScriptです。

調べてもなかなか見つからなかったのですが、円を示す単語がovalではなくellipseだとはなかなか気づきませんでした。InDesignだとovalです。

また、Illustratorは座標系やオブジェクトのboundsの座標情報の並びが他と違うこと、内部の座標情報が基本的にpointなことなどに注意を払う必要があります。ドキュメントの原点は左下。オブジェクトのboundsを求めると返ってくる座標の並びが {x1,y2,x2,y1} となっている変わり種です(InDesignも{y1,x1,y2,x2}なので変ですが)。

ai1.jpg

スクリプト名:Illustratorで円を描く
setOrigin() of me

–指定座標、指定boundsで
tell application “Adobe Illustrator”
  tell document 1
    set aPath to (make new ellipse with properties {bounds:{0, 100, 100, 0}, filled:false, stroke color:{class:CMYK color info, cyan:0.0, magenta:100.0, yellow:100.0, black:0.0}, stroked:true, stroke width:0.566951990128, clipping:false})
  end tell
end tell

–原点設定
on setOrigin()
  tell application “Adobe Illustrator”
    tell document 1
      set ruler origin to {0, 0}
      
set page origin to {0, 0}
    end tell
  end tell
end setOrigin

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

2011/02/04 Photoshopでオープンしている画像から、選択部分のサイズをもとに画像分割を行う

Photoshop CS3でオープンしている画像のうち、選択したエリアを1つの単位として、画像を順次分割して保存するAppleScriptです。

image_segment.jpg

Photoshop CS3で作成しましたが、Photoshop CS4/CS5やPhotoshop Elementsでも同様に稼働することが期待されます(tellブロックのアプリケーション名を書き換えるだけ)。

「分割」といっていますが、コピー&ペーストで新規画像を作成するため、分割前のオリジナル画像を破壊することはありません。

Photoshop形式の画像を作成するとか、EPS書き出しをするとか、厳密なカラーマッチングを行いたいとか、そういう用途であればPhotoshopをAppleScriptからコントロールすることに意義はありますが、この程度の「画像の細分化」だけならコマンドライン系のツールを使ったほうがいいような気もします。

Photoshopを使ったのは、とりあえず身近なところに転がっているのと、画像中の指定矩形をコピー&ペーストする機能があるからで……単純かつ機械的な画像処理が目的なら、別のアプリケーションを使ってもよいでしょう。

スクリプト名:Photoshopでオープンしている画像から、選択部分のサイズをもとに画像分割を行う
set outFol to choose folder with prompt “出力先のフォルダを選択”

tell application “Adobe Photoshop CS3″
  if (count every document) = 0 then
    display dialog “画像をオープンして、切り取り最小部分を選択した状態で実行してください。” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
tell document 1
    –選択部分のサイズを取得
    
try
      set {sx1, sy1, sx2, sy2} to bounds of selection
    on error
      –選択部分が存在していなかった場合  
      
display dialog “画像をオープンして、切り取り最小部分を選択した状態で実行してください。” buttons {“OK”} default button 1 with icon 1
      
return
    end try
    
set sWidth to sx2 - sx1
    
set sHeight to sy2 - sy1
    
    
–画像全体のサイズ
    
set widNum to width
    
set heiNum to height
    
    
–画像全体における選択部分の分割個数を収録
    
set selNumX to widNum / sWidth
    
set selNumX to round selNumX rounding as taught in school
    
set selNumX to selNumX as integer
    
    
set selNumY to heiNum / sHeight
    
set selNumY to round selNumY rounding as taught in school
    
set selNumY to selNumY as integer
  end tell
end tell

set outCount to 1

repeat with y from 0 to (selNumY - 1)
  repeat with X from 0 to (selNumX - 1)
    set cX1 to (X * sWidth)
    
set cX2 to ((X + 1) * sWidth)
    
    
set cY1 to (y * sHeight)
    
set cY2 to ((y + 1) * sHeight)
    
    
    
set aName to outCount as string
    
    
–指定エリアを新規保存
    
savePolygonToNewFile(cX1, cY1, cX2, cY2, outFol, aName) of me
    
    
set outCount to outCount + 1
  end repeat
end repeat

–Photoshopで指定座標の内容をコピーして新規ファイルで保存
on savePolygonToNewFile(x1, y1, x2, y2, aFol, aName)
  
  
makePhotoshopSelectionRegion(x1, y1, x2, y2) of me
  
  
tell application “Adobe Photoshop CS3″
    activate
    
copy
    
set newDoc to make new document with properties {height:(y2 - y1), width:(x2 - x1)}
    
tell newDoc
      paste
    end tell
  end tell
  
  
set newFilePath to (aFol as string) & aName & “.jpg”
  
  
tell application “Adobe Photoshop CS3″
    set myOptions to {class:JPEG save options, embed color profile:true, format options:progressive, quality:12, scans:3}
    
save newDoc in file newFilePath as JPEG with options myOptions appending lowercase extension with copying
    
close newDoc saving no
  end tell
  
end savePolygonToNewFile

–Photoshop上で指定矩形を選択する
on makePhotoshopSelectionRegion(x1, y1, x2, y2)
  tell application “Adobe Photoshop CS3″
    tell current document
      select region {{x1, y1}, {x2, y1}, {x2, y2}, {x1, y2}} combination type replaced
    end tell
  end tell
end makePhotoshopSelectionRegion

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

2011/02/04 フォルダ内の画像ファイルを順次Numbersのセルに貼り付ける

指定フォルダ内に入っている画像を順次Numbersのドキュメントに貼り付けるAppleScriptです。

指定フォルダ内の画像をPhotoshopで順次オープンして、Numbersのドキュメントに貼り付けます。

Numbersには画像を貼り込むような命令は用意されていないので、GUI Scripting経由でペーストを行います。

スクリプト名:フォルダ内の画像ファイルを順次Numbersのセルに貼り付ける
property aRange : “B”

set aFol to choose folder with prompt “Numbersに貼り付ける画像が入っているフォルダを選択してください”

tell application “Finder”
  set aList to (every file of aFol) as alias list
end tell

set aLen to length of aList

tell application “Numbers”
  tell document 1
    tell sheet 1
      tell table 1
        set row count to aLen + 5
      end tell
    end tell
  end tell
end tell

set aCounter to 2

repeat with i in aList
  tell application “Adobe Photoshop CS3″
    activate
    
open i
    
set d1Doc to (a reference to current document)
    
    
tell d1Doc
      select all
      
copy
    end tell
    
    
tell document 1
      close saving no
    end tell
    
  end tell
  
  
  
set aRangeStr to aRange & (aCounter as string) & “:” & aRange & (aCounter as string)
  
  
tell application “Numbers”
    tell document 1
      tell sheet 1
        tell table 1
          set selection range to range aRangeStr
        end tell
      end tell
    end tell
  end tell
  
  
activate application “Numbers”
  
tell application “System Events”
    tell process “Numbers”
      keystroke “v” using {command down}
    end tell
  end tell
  
  
  
set aCounter to aCounter + 1
  
end repeat

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