Archive for 5月, 2009

2009/05/28 Photoshop Elements 6のAS辞書はPhotoshop CS3と同じ

Photoshop Elements 6を買ってきて、AppleScript用語辞書を調べたところ……Photoshop CS3とまったく同じでした。Elementsにはアクション記録/実行用のインタフェース(メニューやパレット)はないものの、「do action」命令も存在している状態です。

do action v : play an action from the Actions Palette
do action text : the name of the action to play (note that the case of letters in the Action name is important and must match the case of the name in the Actions palette)
from text : the name of the action set containing the action being played (note that the case of letters in the Action Set name is important and must match the case of the name in the Actions palette)

ただ、そうはいってもアクションを指定しようがないので、実行はできないはずです。

Photoshop Elements 6用のScriptは、tellブロックのアプリケーション名をPhotoshop CS3に変更すれば、ほとんどの場合そのまま動きます。

2009/05/20 ファイル名の濁点/半濁点の分離エンコーディング回避処理

Mac OS X 10.4までは、Finder上の文字エンコーディングとAppleScriptの文字エンコーディングの方式が異なったため、ファイル名を取り出して文字を分解するような処理を行った場合に、濁点や半濁点が文字から分かれて取り出されたりして非常に不自由していました。

US Appleに文句を言うこと幾度、Mac OS X 10.5でスクリプトエディタ上のエラー箇所のハイライト表示が直ったのと同時に修正されました。内部処理がUnicodeベースに移行するまで直らなかったわけです。

ただし、すぐに対応方法が編み出され……一度stringにcastしてからunicode textに再度castすることで、濁点/半濁点が分離されなくなります。

あまり有名ではないようなので、あえて掲載しておきます。

スクリプト名:ファイル名の濁点、半濁点エンコーディング回避処理
set a to choose file
tell applicationFinder
  set aName to name of a
end tell

set aList to characters of aName

Mac OS X 10.4まで :
>  {”ヒ”, “゜”, “ク”, “チ”, “ャ”, ” “, “3″, “5″, “.”, “j”, “p”, “e”, “g”} ←おかしい

Mac OS X 10.5以降:
>  {”ピ”, “ク”, “チ”, “ャ”, ” “, “3″, “5″, “.”, “j”, “p”, “e”, “g”} ←正常

Mac OS X 10.4までの、濁点/半濁点のエンコーディング問題回避処理
互換性維持のため、10.5でもこのように書いている
set aName to aName as string
set aName to aName as Unicode text
set bList to characters of aName

> {”ピ”, “ク”, “チ”, “ャ”, ” “, “3″, “5″, “.”, “j”, “p”, “e”, “g”} ←回避処理のおかげで正常に

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

2009/05/20 contains/is inによる存在確認は、入れ子のリストに使えない

普通のフラットなリストの中に任意の項目が入っているかを調べるのに、「is in」「contains」はかなり便利に使っています。たとえば、コマンドで類義語をサポートするような場合にはたいへん有効です。

初心者にAppleScriptを教えていたときに、そういう話になって……「できるんじゃない?」と答えておいたら、実際にはできなかったという話です。

「フラットなリストに変換してから存在確認してみれば?」という話もなきにしもあらずですが、ループで回すなりフラットなリストに変換するなりお好きに回避してみてください。

個人的には、これができないことには不満です。→ 使えました 修正内容はこちら

スクリプト名:is inによる存在確認は、入れ子のリストに使えない
set aList to {{1, 2}, {2, 3}, {3, 1}}
set uList to {2, 3}
if uList contains aList then
  display dialog はいってるよ
else
  display dialog はいってないよ
end if

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

2009/05/20 リスト内のアイテムへの項目追加

入れ子になっているリスト内の指定アイテムに項目を追加するAppleScriptです。

{14.0, 37.0, 18.5, 59.0}

というリスト項目の末尾に、アイテムを追加し、

{14.0, 37.0, 18.5, 59.0, 100}

のように加工します。基礎的なものですが、「あれっ? こんな処理できたっけ?」という確認で書いたもの……のようです。

スクリプト名:リスト内のアイテムへの項目追加
set aList to {{14.0, 37.0, 18.5, 59.0}, {14.0, 19.0, 18.0, 37.0}, {14.0, 14.0, 18.5, 19.0}, {18.75, 14.0, 21.25, 59.0}, {21.5, 14.0, 26.5, 59.0}, {26.5, 14.0, 36.5, 59.0}}

set the end of item 1 of aList to 100
aList

> {{14.0, 37.0, 18.5, 59.0, 100}, {14.0, 19.0, 18.0, 37.0}, {14.0, 14.0, 18.5, 19.0}, {18.75, 14.0, 21.25, 59.0}, {21.5, 14.0, 26.5, 59.0}, {26.5, 14.0, 36.5, 59.0}}

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

2009/05/20 指定の名前の色をInDesignのSwatch上で探してIDを返す

InDesign CS2で、指定の名前のスウォッチのIDを取得するAppleScriptです。

idcs2_10.jpg

▲スウォッチ

スクリプト名:指定の名前の色をInDesignのSwatch上で探してIDを返す
set cList to {"【コマ】", "【読み取りエリア】"}
set idList to {}

repeat with i in cList
  set idRes to retColorIDfromColorName(i as Unicode text) of me
  
if idRes = false then
    display dialog "指定の色はスウォッチ上に存在していません"
    
return
  end if
  
set the end of idList to idRes
end repeat
idList

指定の名前の色をInDesignのSwatch上で探してIDを返す
on retColorIDfromColorName(aName)
  tell application "Adobe InDesign CS2_J"
    tell document 1
      –スウォッチアイテムの名前と色を取得
      
set sCount to count every swatch
      
repeat with i from 1 to sCount
        tell swatch i
          set cName to name as Unicode text
          
set cColID to object reference
          –
set aP to properties
          –
log aP
          
if aName = cName then
            return cColID
          end if
        end tell
      end repeat
    end tell
  end tell
  –
指定の名前の色が見つからなかった場合
  
return false
end retColorIDfromColorName

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

2009/05/20 InDesign CS2の座標原点を左上に変更する

InDesign CS2で、スプレッド上の座標原点(zero point)を左上(左側ページの左上)に設定するAppleScriptです。

InDesign上で座標値を扱う場合には、{Y座標, X座標} という順でデータを扱うことになります。ここで{0,0}を指定していますが、この値のペアが {y,x}の順番であることに注意してください。

text frame(文字ボックス)の大きさ(geometric bounds)を取得すると、{y1, x1, y2, x2} という順番で値が返ってきます。

わざわざ、using terms fromでtellブロックを囲っているのは……いろいろと嫌な目に遭ったことへの対策でしょうか。Xcodeのプロジェクト(AppleScript Studio)に入れやすくするために入れているという説もありますが……はたして。

InDesign CS2はMac OS X 10.5上では正常に動作しないため、Mac OS X 10.4.xが対象です。

idcs2_0.jpg

▲見開き(spread)の左上に原点座標を設定する……

idcs2_1.jpg

▲InDesign CS2上で原点座標がてきとーな箇所に設定されている状態

idcs2_2.jpg

▲Script実行後の状態。原点(0,0)が左上に設定されていることがわかる

スクリプト名:InDesign CS2の座標原点を左上に変更する
changeOriginOfInDesign() of me

InDesign CS2の座標原点を左上に変更する
on changeOriginOfInDesign()
  using terms from applicationAdobe InDesign CS2_J
    tell applicationAdobe InDesign CS2_J
      tell document 1
        set zero point to {0, 0} –原点の移動
      end tell
    end tell
  end using terms from
end changeOriginOfInDesign

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

2009/05/09 Twitterrificで選択中の投稿をキーにして発言検索

Mac OS X用twitterクライアントのうちの1つ、Twitterrificを使って、選択中の発言を行った人(のアカウント名)をキーにしてWeb上で検索を行います。同アプリケーションはAppleScriptに対応しているため、他のアプリケーションと組み合わせていろいろ激しい処理ができそうです(発言時刻で統計処理してみるとか、形態素解析して使用キーワードをリストアップしてみるとか、マインドマップ上にマッピングしてみるとか)。

元ネタは、こちらに載っていたのですが……いろいろと危なっかしい記述(System Eventsでプロセス名称を指定していないとか)や、下手くそな記述(open locationをSafariへのtellブロック内で行っている……エラーが出るし、そもそもそんな必要はないのだが ーー;)があったので、修正したものです。

ただ、下手はともかくとしてたしかに役立つScriptです。

tw1.jpg

▲Twitterrific上で関連する発言を探したい人の発言を選択して……

tw2.jpg

▲このAppleScriptをスクリプトメニューから呼び出します

tw3.jpg

▲Webブラウザ上(Safariでもなんでも、OSでデフォルト指定されているもの)で関連する発言が検索されます

tw4.jpg

▲激しく便利……

スクリプト名:Twitterrificで選択中の投稿をキーにして発言検索
元ネタ:http://macmembrane.com/scripts-and-tricks-for-twitterrific/
おそろしく下手くそだったので、書き直した

tell application Twitterrific
  set theTweeter to screen name of selection
end tell

try
  tell application System Events
    tell process Twitterrific
      key code 53
    end tell
  end tell
end try

open location http://search.twitter.com/search?q= & @ & theTweeter

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

2009/05/09 IDで指定したアプリケーションの「最近使った項目」の設定を変更する

IDで指定したアプリケーションの「最近使った項目」の記憶する数を設定変更するAppleScriptです。

システム環境設定の「アピアランス」に「最近使った項目の数」という設定項目があり、これまでにオープンした書類の数などを変更できますが、これはあくまでAppleメニューからオープンできる「最近使った項目」に対する変更であり、個別のアプリケーションの「最近使った項目」の表示数を変更するものではありません。

def2.jpg
▲システム環境設定>アピアランス

def3.jpg
▲「最近使った項目」の設定

def11.jpg
▲アップルメニューの「最近使った項目」のみ設定の影響を受ける

そこで、本スクリプトを実行し、対象のアプリケーションを一度終了させて再度立ち上げると……

def4.jpg

「最近使った項目」の記憶数が変更されます。実行後、ヒストリの記録数が変更されるだけであり、過去にオープンしたファイルが「最近使った項目」から見えるようになるといったことはないようです。

def5.jpg

また、Mail.appのように「ファイル」メニューに「最近使った項目」が存在していないものについては、実行しても意味がありません。

def6.jpg

どこかのオンラインソフトが提供していそうな機能ですが、AppleScriptで記述するとこの程度。なお、実行前に指定IDのアプリケーションが存在しているかどうかのチェックも行っています。

スクリプト名:IDで指定したアプリケーションの「最近使った項目」の設定を変更する
expandOpenRecentNum(”com.apple.ScriptEditor2“, 100) of me

IDで指定したアプリケーションの「最近使った項目」の設定を変更する
on expandOpenRecentNum(anAppID, limitNum)
  アプリケーションの存在確認をanAppIDを元に行う
  
tell application Finder
    set app_Exist_check to exists (application file id anAppID)
  end tell
  
if app_Exist_check = false then return false
  
  
「最近使った項目」の設定を変更する
  
set sText to defaults write & anAppID & & NSRecentDocumentsLimit & limitNum as string
  
try
    do shell script sText
  on error
    return false
  end try
  
  
return true
end expandOpenRecentNum

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

2009/05/05 テキストエディットでリッチテキストのファイルをプレーンテキストに

テキストエディットでオープンしているリッチテキスト書類をプレーンテキストに変換するAppleScriptです。

texte1.jpg

save as textで保存形式を指定して別名で保存すると、プレーンテキストに変換されます。

スクリプト名:テキストエディットでリッチテキストのファイルをプレーンテキストに
set anAlias to choose file name
tell application "TextEdit"
  tell document 1
    save as text in anAlias
  end tell
end tell

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

2009/05/02 Safariの最前面のウィンドウ内のタブを順々に表示

Safariで、最前面のウィンドウに複数のタブが含まれている状態で……ウィンドウ内のタブを順々に表示するAppleScriptです。2秒のウエイトを入れていますが、それ自体にはとくに意味はありません。

タブの切り替えはさほど難しくない操作ですが、そこにたどり着くまでの道筋が分らないと、トンチンカンで遠回りなScript(GUI Scriptingとか、キーストロークを強制操作するScriptとか)を書く羽目になります。

まず、Safariのウィンドウに対してtellブロックを書き、その中に「properties」と書いてすべての属性情報を確認してみましょう。

スクリプト名:Safariでウィンドウのすべての属性情報を確認
tell application Safari
  tell window 1
    properties
  end tell
end tell
> {zoomed:false, closeable:true, resizable:true, miniaturized:false, document:document “AS Hole(AppleScriptの穴) Create New Post ― WordPress” of application “Safari”, bounds:{37, 23, 894, 975}, titled:true, floating:false, miniaturizable:true, zoomable:true, modal:false, class:window, name:”AS Hole(AppleScriptの穴) Create New Post ― WordPress”, id:69191, index:1, visible:true, current tab:tab 1 of window id 69191 of application “Safari”}

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

実行すると、取得したウィンドウの属性情報の中に「current tab」というものがあることに気付きます。この属性がread onlyでなければ、書き換えてカレントタブを変更できることが期待されます。ただし、単なる数字を入れるのではなくtabオブジェクトを指定する必要があることにも注意すべきです。

その結果をふまえて、Safariの最前面のウィンドウ(window 1)内のタブを数え、current tabを順々に変更していけば何の問題もなくウィンドウ内のタブを切り替えられます。

safari01.jpg

safari02.jpg

ここで紹介したScriptはSafari 3.0以降に対してのみ有効です。実際にはMac OS X 10.5+Safari 3.0以降ということになろうかと。10.4上でも動いたらラッキーぐらいの感じでしょうか。動作確認はSafari 4.0Betaで行いました(ASの辞書内容はSafari 3.0と4.0で変わっていません)。

スクリプト名:Safariの最前面のウィンドウ内のタブを順々に表示
tell application Safari
  activate
  
tell window 1
    set tCount to count every tab
    
repeat with i from 1 to tCount
      set current tab to tab i
      
delay 2
    end repeat
  end tell
end tell

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