Archive for 11月, 2011

2011/11/30 OmniGraffleですべてのWindowを表示状態に

OmniGraffleの書類のWindowをすべてDockから引きずり出すAppleScriptです。

WindowがDockに格納した状態ではエラーになる処理がいくつか(Windowへのアクセスなど)見られたので、エラー回避のためにDockからWindowを引きずり出す処理を書いてみました。

スクリプト名:OmniGraffleですべてのWindowを表示状態に
exposeEveryWindow() of me

–OmniGraffleですべてのWindowを表示状態に
on exposeEveryWindow()
  tell application "OmniGraffle 5"
    tell (every window whose miniaturized is true)
      set miniaturized to false
    end tell
  end tell
end exposeEveryWindow

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

2011/11/30 OmniGraffleのAppleScriptがらみのバグ

OmniGraffleをいろいろ調べているうちに、AppleScriptがらみでいくつかバグを見つけてしまいました。

(1)documentのpropertiesを取得するとエラーに

OmniGraffleのAppleScript用語辞書には、以下のようにdocumentに「properties」という属性値があって、各属性をひとまとめにして取り出せる「はず」なのですが……
og30.jpg

実際にプログラムに書いて試してみるとエラーになります。

スクリプト名:OmniGraffleでdocumentのpropertiesを取得する
tell application “OmniGraffle 5″
  properties of front document
end tell

–> error “OmniGraffle 5 でエラーが起きました:AppleEvent のハンドラで誤りが起きました。” number -10000

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

(2)起動直後、何も書類をオープンしていない状態でdocumentを取得すると、stencilやtemplateが返ってくる

しかも、これらの書類を見分けるための属性値がないため、pathでも取得して切り分けるしかありません。こんな仕様、世界広しといってもこのOmniGraffleだけでしょう。これは、バグですね。

スクリプト名:OmniGraffleで起動直後にドキュメント情報を取得する
tell application “OmniGraffle 5″
  set dList to every document
end tell

–> {document “iOS UI iPhone.gstencil” of application “OmniGraffle 5″, document “48×48.gtemplate” of application “OmniGraffle 5″, document “Notes.gtemplate” of application “OmniGraffle 5″, document “Lines.gtemplate” of application “OmniGraffle 5″, document “仕様書(横型A3)” of application “OmniGraffle 5″, document “Circles.gtemplate” of application “OmniGraffle 5″, document “Blank.gtemplate” of application “OmniGraffle 5″, document “Chart2.gtemplate” of application “OmniGraffle 5″, document “Chart3.gtemplate” of application “OmniGraffle 5″, document “Chart1.gtemplate” of application “OmniGraffle 5″, document “Basic.gtemplate” of application “OmniGraffle 5″, document “Clouds.gtemplate” of application “OmniGraffle 5″, document “Chalkboard.gtemplate” of application “OmniGraffle 5″, document “機能定義書v4.graffle” of application “OmniGraffle 5″}

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

(3)WindowをDockにしまった状態で実行するとエラーになる命令がある

OmniGraffleに対してコントロールを行うAppleScriptを実行する場合には、すべてのWindowをDockから引き出さないとプログラムを正しく実行できない可能性があります。これについては、他のアプリケーションでも見かけたことがあるので、いちがいにOmniGraffle固有のバグとはいえないかもしれません。

(4)オブジェクトの位置を指定できるが、取得できない

グラフィックオブジェクトをプログラムから生成して、image offsetで座標を指定することはできるのですが、取得ができません。

(5)特定の属性値へのアクセスを行うのに、ネスティングだとエラーになるケースがある

「xxx of xxx of xxx……」と、属性値へのアクセスを1行に記述すると大丈夫なのに、tellブロックのネスティングで記述するとエラーになる例が(Windowのcanvasなど)いくつか見られます。

3日さわって、もうこのぐらい出てきているということは……

2011/11/29 OmniGraffleで画面設計図のCanvas名称をクリーニングする

OmniGraffleで、「画面設計図」をファイル名に含む書類の中のCanvas名をクリーニングするAppleScriptです。

クリーニングといっても、処理内容はかんたんなものです。改行文字などの制御文字が入っていないか、あるいはアルファベット/数字/一部の記号「以外の」文字が入っていないかをチェックし、入っていればCanvas名から削除します。

スクリプト名:OmniGraffleで画面設計図のCanvas名称をクリーニングする
tell application “OmniGraffle 5″
  set dList to every document whose name contains “画面設計図” –ここは、好きに変えてください
  
set aDoc to first item of dList
  
  
tell aDoc
    set cNameList to name of every canvas
  end tell
  
  
–各Cnavas名称でAlphabet & Numeric  の文字レンジを越えるものをチェック
  
set wrongList to {}
  
set wCount to 0
  
repeat with i in cNameList
    set j to contents of i
    
set aRes to checkAN(j) of me
    
if aRes = false then
      set the end of wrongList to j
      
set wCount to wCount + 1
    end if
  end repeat
  
  
if wCount > 0 then
    display dialog (wCount as string) & “箇所のCanvas名称にゴミが入っているので、クリーニングを行います” buttons {“OK”} default button 1
  else
    return
  end if
  

  
repeat with i in wrongList
    set j to contents of i
    
set rStr to correctAN(j) of me
    
    
set name of canvas j of aDoc to rStr
  end repeat
end tell

–与えられた文字列をAlphabet & Numericの範囲に強制する
on correctAN(aKeyword)
  set cList to characters of aKeyword
  
set newStr to “”
  
  
repeat with i in cList
    set j to contents of i
    
set aRes to checkAN(j) of me
    
if aRes = true then
      set newStr to newStr & j
    end if
  end repeat
  
  
return newStr
  
end correctAN

–与えられた文字列がAlphabet & Numericの範囲内にあるかどうかチェック
on checkAN(aKeyword)
  set anList to {“0″, “1″, “2″, “3″, “4″, “5″, “6″, “7″, “8″, “9″, “a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”, “.”, “_”, “-”, “+”, “=”}
  
set aKeyword to aKeyword as Unicode text
  
set aKeyword to aKeyword as string
  
set kList to characters of aKeyword
  
repeat with i in kList
    ignoring case
      if i is not in anList then
        return false
      end if
    end ignoring
  end repeat
  
return true
end checkAN

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

2011/11/29 OmniGraffleで選択中の2つのグラフィックで、数字が大きいURLを持つものから小さいものにimageとURLをコピー

OmniGraffleで選択中のグラフィック間で、片方の画像の内容とURLをもう片方のグラフィックにコピーするAppleScriptです。

OmniGraffle上で個別のオブジェクトを識別するには、URLにユニークな文字列を入れておいてフィルター参照で抽出するというやりかたがオーソドックスなやり方のようです。

そもそもOmniGraffleではオブジェクトの座標値や大きさをAppleScript側から取得できないので、指定オブジェクトに一番近接する座標に存在するオブジェクトを取ってくる、というInDesignやIllustratorでは鉄板のやり方が使えません。

そのため、すでに存在しているグラフィックのサイズと位置を生かして別のグラフィックを配置するという操作も、かなり面倒です。画面から操作するのであれば、OmniGraffle書類上にグラフィックをドラッグ&ドロップして、もともと存在しているグラフィックの場所まで移動させ、サイズを調整するということになります。

単純作業であるうえにめんどくさいので、作業軽減のために最後の調整ステップを手作業で行わなくてすむようにしてみました。

画面上に、オリジナルの画像と新しい画像を配置し、それぞれにURLが(あらかじめ)指定してある状態で、オリジナルのURLのほうが小さい値になるように調整。たとえば、オリジナルのURLが「A10」で、新しい画像は「A300」だとすれば、「オリジナルのURLのほうが小さい値」であるといえます。

この状態で本AppleScriptを実行すると、新しい画像からimage属性を読み出して、オリジナルの画像オブジェクトに突っ込みます。これだけで、画像の内容のコピーが完了。あとは、URLもコピーしておきます。

説明すると長いですが、動作は割とシンプルなのでいろいろ試してみると分ると思います。個人的には、めちゃめちゃ役立っています。

スクリプト名:OmniGraffleで選択中の2つのグラフィックで、数字が大きいURLを持つものから小さいものにimageとURLをコピー

tell application “OmniGraffle 5″
  tell front window
    set aSel to selection
    
    
if length of aSel is not equal to 2 then
      display dialog “2つのグラフィックを選択してください”
      
return
    end if
    
    
set aList to {}
    
    
repeat with i in aSel
      set j to contents of i
      
set anItem to {j, url of j}
      
set the end of aList to anItem
    end repeat
    
    
–URLでソート
    
set bList to shellSortListAscending(aList, 2) of me
    
    
set Item1 to contents of first item of bList
    
set Item2 to contents of second item of bList
    
    
    
–URLが新しい(数字が大きい)ものから、古いものにイメージとURLをコピー
    
set aImage to image of (contents of first item of Item2) –取り出して
    
set image of (contents of first item of Item1) to aImage –イメージをコピー
    
    
set url of (contents of first item of Item1) to (contents of second item of Item2) –URLもコピー
    
  end tell
end tell

–シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

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

2011/11/29 OmniGraffleでcanvas名一覧を取得する

OmniGraffleで最前面の書類のCanvas(ページ)名称一覧を取得するAppleScriptです。

ここのところ、OmniGraffle相手に巨大なAppleScriptばかり作っていましたが、案外こんなシンプルなものが役立ったりしています。

スクリプト名:OmniGraffleでcanvas名一覧を取得する
tell application "OmniGraffle 5"
  tell front document
    set nList to name of every canvas
  end tell
end tell

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

2011/11/28 OmniGraffleで表示中のCanvasを切り替えてループし、各Canvasの表示倍率を設定する

OmniGraffleで、現在表示中のドキュメントのすべてのCanvasに一律で表示倍率を設定するAppleScriptです。

表示倍率は、1.0で100%、2.0で200%です。

スクリプト名:OmniGraffleで表示中のCanvasを切り替えてループし、各Canvasの表示倍率を設定する
set zoomNum to 1.5 –1で100%

tell application "OmniGraffle 5"
  set aDoc to document of front window
  
  
tell aDoc
    set cList to every canvas
  end tell
  
  
repeat with i in cList
    set j to contents of i
    
set canvas of front window to j –表示中のCanvasを切り替える
    
    
tell front window
      set zoom to zoomNum
    end tell
  end repeat
end tell

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

2011/11/28 OmniGraffleで表示中のCanvasを切り替えてループし、各Canvasの表示倍率を取得する

OmniGraffleで、現在表示中のドキュメントのすべてのCanvasの表示倍率を取得するAppleScriptです。

スクリプト名:OmniGraffleで表示中のCanvasを切り替えてループし、各Canvasの表示倍率を取得する
tell application “OmniGraffle 5″
  set aDoc to document of front window
  
  
tell aDoc
    set cList to every canvas
  end tell
  
  
set zList to {}
  
  
repeat with i in cList
    set j to contents of i
    
set canvas of front window to j –表示中のCanvasを切り替える
    
    
tell front window
      set the end of zList to zoom
    end tell
  end repeat
end tell

zList

–> {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.907243788242, 0.907243788242}

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

2011/11/28 OmniGraffleで指定ドキュメントのWindowを求める v2

OmniGraffleで指定ドキュメントのWindowへの参照を取得するAppleScriptです。

OmniGraffleでは、指定ドキュメント中の表示Canvasの切り換えは、Windowの下のcanvasを書き換えることで実現するのですが、その際に指定ドキュメントのWindowがどのWindowかを調べておく必要があります。

ドキュメントのWindowについては簡単に調査できるのですが、特定ドキュメントのWindowを調べる際にはOmniGraffle自体にそれを意識した機能が実装されていないため、ちょっとだけ苦労しました。

スクリプト名:OmniGraffleで指定ドキュメントのWindowを求める v2
set aDocName to “仕様書のつもり”
set wRes to retAWindowByDocumentName(aDocName) of me
–> window id 967 of application “OmniGraffle 5″

–指定ドキュメント名称を持つWindowを返す
on retAWindowByDocumentName(aDoc)
  set wResList to {}
  
  
tell application “OmniGraffle 5″
    –可視状態で指定名称のドキュメントのウィンドウを返す(AppleScript特有のフィルタ参照処理)
    
set wList to every window whose visible is true and name of document of it is equal to aDoc
    
set wLen to length of wList
    
    
if wLen = 1 then
      –取得されたWindow数が1の場合 (通常処理)
      
return contents of first item of wList
      
    else if wLen > 1 then
      –取得されたWindow数が1以上の場合 (リカバリできなくもないエラー処理)  
      
return contents of first item of wList
      
    else
      –完全にエラー
      
return false
      
    end if
    
  end tell
end retAWindowByDocumentName

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

2011/11/28 与えられたリスト中のfalseの項目番号をリストで返す

true/falseの入ったリストを処理して、falseが入っていたアイテム番号をリストで返すAppleScriptです。

スクリプト名:与えられたリスト中のfalseの項目番号をリストで返す
set aaList to {true, true, true, false, true, false}
set aRes to retFalseItemNoFromList(aaList) of me
–> {4, 6}

–与えられたリスト中のfalseの項目番号をリストで返す
on retFalseItemNoFromList(aList)
  set aCount to 1
  
set eResList to {}
  
  
repeat with i in aList
    set j to contents of i
    
    
if j is not equal to true then
      set the end of eResList to aCount
    end if
    
    
set aCount to aCount + 1
  end repeat
  
  
return eResList
end retFalseItemNoFromList

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

2011/11/28 指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する v2

OmniGraffleで、指定の書類中に指定したCanvasが存在しているかをチェックするAppleScriptの高速処理版です。

AppleScriptの処理速度を向上させる場合には、アプリケーションとの通信回数を最低限に抑えることが一番有効です。この場合には、OmniGraffleに指定書類中のCanvasの存在確認を行うさい、アプリケーションに逐一確認してもらうのではなく、Cnavasの名称をすべて取得して、取得したデータを相手に処理を行うことで処理速度を向上させています。

さすがにCanvasが3枚ぐらいでは速度差は分らないところですが、これが10倍とか100倍になってくると段違いの高速処理を体感できます。

スクリプト名:指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する v2

set urlList to {"A101", "A102", "A103", "A104"}
set aDocNameStr to "画面設計図"

set aRes to getExistenceOfEachCanvasName(urlList, aDocNameStr) of me
–> {true, true, true, false}

–指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する v2
on getExistenceOfEachCanvasName(urlList, aDocNameStr)
  set eList to {}
  
  
tell application "OmniGraffle 5"
    tell document aDocNameStr
      set cList to name of every canvas –最初にCanvas名称リストを一気に取得してアプリケーションとの通信頻度を下げる
    end tell
  end tell
  
  
–以下、ただのリスト内の存在確認演算(速い)
  
repeat with i in urlList
    set aURL to contents of i
    
set aExist to (aURL is in cList)
    
    
set the end of eList to aExist
  end repeat
  
  
return eList
  
end getExistenceOfEachCanvasName

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

2011/11/28 指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する

OmniGraffleで、指定の書類中に指定したCanvasが存在しているかをチェックするAppleScriptです。

指定名称のドキュメントの中に、リストで指定したCanvas(ページ)が存在しているかをチェックします。

たとえば、「A101」「A102」「A103」の各Cnavasを持つ書類「画面設計図」があったとして、

og20.jpg

この書類に対して、リスト{”A101″, “A102″, “A103″, “A104″}で確認を行うと、「A104」だけは存在していません。本AppleScriptでこの書類に対して処理を行うと、存在しているCanvasはtrue、存在していないCanvasについてはfalseを返します。

仕様書内のURLつきオブジェクトの情報を取得して、それが「画面設計図」(それぞれの画面図を1ページ(Canvas)ごとに入れて管理しておくOmniGraffle書類)に存在しているかどうかチェックを行うために作成しました。

スクリプト名:指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する

set urlList to {“A101″, “A102″, “A103″, “A104″}
set aDocNameStr to “画面設計図”

set aRes to getExistenceOfEachCanvasName(urlList, aDocNameStr) of me
–> {true, true, true, false}

–指定名称のOmniGraffle書類中に、urlListで示した名称のCanvasが存在するかを取得する
on getExistenceOfEachCanvasName(urlList, aDocNameStr)
  tell application “OmniGraffle 5″
    tell document aDocNameStr
      set eList to {}
      
      
repeat with i in urlList
        set aURL to contents of i
        
set aExist to exists canvas aURL
        
        
set the end of eList to aExist
      end repeat
      
    end tell
  end tell
  
  
return eList
end getExistenceOfEachCanvasName

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

2011/11/28 OmniGraffleで指定文字を名前に含むドキュメントをオープンしているかチェック

OmniGraffleで、指定文字を名前に含む書類をオープンしているかをチェックするAppleScriptです。

複数の書類を対象にして処理を行うさい、処理対象となる書類については、ファイル名すべてを指定しておく場合もありますが……一部のキーワードだけ含んでいればそれでよしとする場合もあります。そうした、処理の柔軟性を持たせるために作成したAppleScriptです。

スクリプト名:OmniGraffleで指定文字を名前に含むドキュメントをオープンしているかチェック
set dRes to getExistenceOf2Docs("画面設計図", {"仕様書", "機能設計"}) of me
–> {document "画面設計図" of application "OmniGraffle 5", document "仕様書のつもり" of application "OmniGraffle 5"}

–OmniGraffleで指定文字を名前に含むドキュメントをオープンしているかチェック
–とくにエラーチェックなどは行っていないレベルの部品
on getExistenceOf2Docs(aName, bNameList)
  –bNameListの要素数が2であることを前提として処理。それ以外は考慮しない
  
set bName to contents of first item of bNameList
  
set cName to contents of second item of bNameList
  
  
tell application "OmniGraffle 5"
    set d1List to every document whose name begins with aName –画面設計図
    
set d2List to every document whose name contains bName or name of it contains cName –仕様書か機能定義書
    
    
if ((length of d1List) = 1) and ((length of d2List) = 1) then
      return {first item of d1List, first item of d2List}
    else
      return {false, false} –オープンしていない場合
    end if
  end tell
end getExistenceOf2Docs

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

2011/11/28 OmniGraffleで指定書類からURLつきの画像の情報を集める

OmniGraffleで、指定書類からURLつき画像の情報を集めるAppleScriptです。

基本的に、OmniGraffleで現在の書類からURLつきの画像の情報を集めるScriptに修正を行ったもので、「現在の最前面にオープンしている書類」ではなく名称でドキュメント名を指定して処理を行えるようにしたものです。

AppleScriptで最前面のドキュメントに対して操作を行うケースは多いですが、複数の書類をオープンして処理を行う場合には、最前面に切り替えていられない場合もあるので、このように柔軟にアクセスできるようテストを行っておく必要があります。

スクリプト名:OmniGraffleで指定書類からURLつきの画像の情報を集める
set gRes to getCanvasNoAndURLFromEachSolid("仕様書のつもり") of me

–> {{1, graphic id 3 of canvas id 1 of document "仕様書のつもり" of application "OmniGraffle 5", "A101"}, {2, graphic id 3 of canvas id 2 of document "仕様書のつもり" of application "OmniGraffle 5", "A102"}, {3, graphic id 3 of canvas id 3 of document "仕様書のつもり" of application "OmniGraffle 5", "A103"}}

–指定名称の書類から、URLつきの画像(Solid)の情報を集める
on getCanvasNoAndURLFromEachSolid(aDocNameStr)
  tell application "OmniGraffle 5"
    tell document aDocNameStr
      set cCount to count every canvas
      
      
set urlList to {}
      
      
repeat with i from 1 to cCount by 1
        tell canvas i
          set s1List to {}
          
set sList to every solid
          
          
repeat with ii in sList
            
            
set jj to contents of ii
            
set uDat to url of jj
            
            
try
              
              
if uDat is not equal to missing value then
                set s1List to {i, jj, uDat}
                
set the end of urlList to s1List
              end if
              
            end try
            
          end repeat
          
        end tell
      end repeat
      
    end tell
    
    
return urlList
    
  end tell
  
end getCanvasNoAndURLFromEachSolid

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

2011/11/28 OmniGraffleで現在の書類からURLつきの画像の情報を集める

OmniGraffleで現在の書類からURLつきの画像の情報を集めるAppleScriptです。

OmniGraffleで、書類上に配置されたオブジェクトをAppleScript側から特定するには、Labelが付いていたりGUI側からいろいろと付加情報が付けられるとベストです。一番有名なのは、InDesignの各オブジェクトに付けられるScript Label。これなしでは、各オブジェクトの特定はできません(で、そういう致命的に大事なものがメジャーバージョンアップ時に使用不能の状態でリリースされるのはなぜ?>アドビ)

OmniGraffleでは、かなりAppleScriptを考慮した機能が実装されており、グラフィックオブジェクトに対して、クリックした時に実行するAppleScriptを割り付けておけたり、オープンするURLを指定しておけたりできるようになっています。ここでは、URLにオブジェクト識別のためのデータを入れておくことにします。

og1.jpg

オブジェクトに対するURL自体は、オブジェクトを選択した状態でインスペクタの「プロパティ」>「アクション」を呼び出すと、記入および確認を行えます。

og2.jpg

そうして、各オブジェクトにURLを入れておいたものを、AppleScriptから検出してデータを取り出すのが本AppleScriptです。

OmniGraffle書類の中の各オブジェクトに任意のURLを設定しておいて本AppleScriptを実行すると、書類の各Canvas(ページ)を調べ、Canvas番号、URLつきのオブジェクトの情報、URLをセットにして返します。

スクリプト名:OmniGraffleで現在の書類からURLつきの画像の情報を集める
tell application "OmniGraffle 5"
  tell front document
    set cCount to count every canvas
    
    
set urlList to {}
    
    
repeat with i from 1 to cCount by 1
      tell canvas i
        set s1List to {}
        
        
set sList to every solid
        
        
repeat with ii in sList
          
          
set jj to contents of ii
          
set uDat to url of jj
          
try
            if uDat is not equal to missing value then
              set s1List to {i, jj, uDat}
              
set the end of urlList to s1List
            end if
          end try
        end repeat
      end tell
    end repeat
  end tell
  
  
return urlList
  
–> {{1, graphic id 4 of canvas id 1 of document "仕様書のつもり" of application "OmniGraffle 5", "A101"}, {1, graphic id 3 of canvas id 1 of document "仕様書のつもり" of application "OmniGraffle 5", "A101"}, {2, graphic id 3 of canvas id 2 of document "仕様書のつもり" of application "OmniGraffle 5", "A102"}, {3, graphic id 5 of canvas id 3 of document "仕様書のつもり" of application "OmniGraffle 5", "A103"}}
end tell

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

2011/11/27 最前面のドキュメント中のすべてのcanvas上のgroupをPNG画像として書き出す

OmniGraffle 5で、最前面のドキュメント中のすべてのcanvas上のgroupをPNG画像として書き出すAppleScriptです。

仕様書と画面図を別々のOmniGraffle書類として管理し、画面図のOmniGraffle書類から個別に画像書き出しを行い、仕様書のOmniGraffle書類にインポートを行おうとして、その前準備のために作成したものです。

graf10.jpg

OmniGraffle書類の中に、それぞれのCanvas(ページ)に名前を付けておいて、各Canvas上に画面図をグループ化して作っておきます。この状態で本AppleScriptを実行すると、指定フォルダ中に各Canvasの名前がついたPNG画像を書き出します。

graf11.jpg

OmniGraffle書類上のオブジェクトのサイズや拡大/縮小倍率を取得できないようなので、インポート時に倍率を指定するか、書き出し時に倍率を指定する必要がありそうです。

スクリプト名:最前面のドキュメント中のすべてのcanvas上のgroupをPNG画像として書き出す
set outFol to choose folder with prompt “書き出し先のフォルダを指定”
set outFolStr to POSIX path of outFol

tell application “OmniGraffle 5″
  tell front document
    set cList to every canvas
    
set nList to name of every canvas
  end tell
  
  
–書き出し対象のドキュメントを特定する
  
set curDoc to document of front window
  
  
–ドキュメント内のすべてのCanvas(ページ)
  
repeat with i in nList
    set j to contents of i
    
set outFullPath to outFolStr & j
    
    
saveAGroupInAcanvas(outFullPath, j, curDoc) of me
    
  end repeat
end tell

–指定ドキュメント中の指定のcanvas上のgroupを指定のパス上にPNG形式で書き出す
on saveAGroupInAcanvas(outFilePOSIXpath, aCanvasName, aDoc)
  tell application “OmniGraffle 5″
    –書き出しオプションを指定する
    
tell current export settings
      set area type to selected graphics
      
set draws background to false
      
set export scale to 1
      
set include border to false
      
set resolution to 1.0
    end tell
    
    
–表示中のCanvasの切り換え
    
set canvas of front window to canvas aCanvasName of aDoc
    
    
–書き出し対象のGroupの特定と選択
    
tell front window
      set gList to every group
      
set aGroup to first item of gList
      
set selection to {aGroup}
    end tell
    
    
–書き出し
    
save aDoc as “PNG” in POSIX file outFilePOSIXpath –POSIX fileで指定しなければならないのがかったるい
    
  end tell
end saveAGroupInAcanvas

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

2011/11/27 OmniOutlinerで現在選択中のグラフィックを指定フォルダにPNG形式で書き出し

OmniGraffleで、オープン中のドキュメントのうち、現在選択中のグラフィックを指定フォルダにPNG形式で書き出すAppleScriptです。

そもそものはじまりは、iPhoneアプリの仕様書をKeynoteで作っていたことにあります。使い慣れたKeynoteで仕様書を作るのは、たしかに簡単でよいのですが、画面の設計を変えた場合には、その内容をすべての関連資料に反映する必要があります。

そんな場合には、KeynoteをAppleScriptからコントロールして……という話になるのが普通ですが、残念ながらKeynoteのAppleScript対応度はいまひとつで、こうしたデータの更新をすべて自動処理で行えるほどの機能は備えていません。

そこで、代替ソフトとして検討したのが、PowerPointとOmniGraffle。

PowerPointは、たしかに大規模なAppleScript用語辞書を備えていて、「一見使えそう」な雰囲気はあるのですが、実際に試してみると……画面のカスタマイズとか、インタフェース作成、プレゼン再生などの機能「だけに」特化していて、データの動的差し替えを行うのに十分な機能を持っていませんでした(たいへんに残念)。

そして、最後の砦OmniGraffleをダメ元で検証。

OmniGraffleは、PowerPC G4の時代にいろいろ試していたものの、ソフトウェア自体のあまりの重さに使用をやめていた、という個人的な経緯があります。重すぎて常用できない、と当時は判断していました。

時はどんぶらこと流れて、MacBook Pro 2010 Core i7 2.66GHzのモデルでは、昔あれほど重かったOmniGraffleが紙のような軽さです。久しぶりにOmniGraffleのAppleScript対応機能について調べてみました。

調査の結果、OmniGraffleについては使い物になりそうだと判断。そのテストの一環としてこのScriptを組んでみた次第です。

graf1.jpg

書類上の特定のページ(Canvas)上の特定のグラフィックを選択。

graf2.jpg

選択状態になっています。

ここで、本Scriptを実行すると、書き出し先のフォルダを聞いてくるので、適当に選択すると、指定のファイル名(本AppleScript単なる実験用なのでファイル名固定)で選択したグラフィックがPNG形式で書き出されます。

graf3.jpg

仕様書で使用する画面図の部分を使用書から独立したOmniGraffle書類の上に作成しておき、それぞれの画面図を識別できるようにCanvasに名前を付けておき、それぞれを自動でPNG画像として書き出し、仕様書側のOmniGraffle書類の上にある画面図にさしかえる、という処理を検討しており……本AppleScriptを書けたので、ほぼできたも同然です。

しかし……OmniGroupのアプリケーションのAppleScript対応機能にはクセが多く、とくにファイル書き出し時のパス指定をPOSIX fileで指定しなければならないなど、「OmniGroupなまり」を知っておかなければ、相当に試行錯誤させられるところです。

いろいろOmniGraffleのAppleScript記述について攻略していけば、最新の画面図を仕様書に反映させるどころか、画面図中に用意した画面内の各ボタンのグラフィックなどを自動でPNG画像(iOSアプリのデフォルト画像ファイル形式はPNG)で書き出すなど、仕様から実際の素材の生成までできそうな感じで、ひじょうに期待が持てます。

いざとなれば、XcodeまでAppleScriptからコントロールして、プロジェクト中の画像を自動でさしかえ、アプリケーションをビルドしてiPhoneシミュレーター上に起動するなどの自動化もできそうです。せめて、もうちょっとXcodeのAppleScript対応機能が使い物になれば、さらにいろいろなことができるはずなのに……。

スクリプト名:OmniGraffleで現在選択中のグラフィックを指定フォルダにPNG形式で書き出し
set outFol to choose folder with prompt “書き出し先のフォルダを指定”
set outFolStr to POSIX path of outFol

tell application “OmniGraffle 5″
  –selection(選択アイテム)が存在しない場合には終了
  
tell front window –最前面のウィンドウ
    set aSel to selection
    
    
if aSel is equal to {} then
      return
    end if
  end tell
  
  
–書き出しオプションを指定する
  
tell current export settings
    set area type to selected graphics
    
set draws background to false
    
set export scale to 1
    
set include border to false
    
set resolution to 1.0
  end tell
  
  
–書き出し対象のドキュメントを特定する
  
set curDoc to document of front window
  
  
–書き出し
  
save curDoc as “PNG” in POSIX file (outFolStr & “testFile3″) –POSIX fileで指定しなければならないのがかったるい
  
end tell

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

2011/11/20 Xcode 4.2.1、iTunes 10.5.1登場。AS用語辞書に変更なし

Xcodeのバージョン4.2.1、およびiTunesのバージョン10.5.1が登場しています。
ともにAppleScript用語辞書の内容に変更はありません。

2011/11/10 XcodeのAppleScript用語辞書の変遷

XcodeのAppleScriptによる自動化は、割とニーズがあると思ってときおり調べているのですが……肝心のAppleのXcode開発チームがトンチンカンな対応をしているので、正直まだ手応えがありません。

その、悩み多きXcodeのAppleScript対応の歴史をひもとくと……

Xcode 2.5〜3.2.3

Xcodeの最初のバージョン。Project Builder 2.4の続きのバージョン番号を振られて2.5になった。

この間、ずっと用語辞書に変更なし。用語が大量に定義されてはいるものの、ほとんどAppleScript Studioの予約語。Xcode自体の自動化はほとんどできないも同然だった。

唯一、Plugin Suiteを使ってAppleScriptによるXcodeプラグインを作成し、Xcode自身のメニュー構成をAppleScriptから変更して「使わないメニュー項目を整理するプラグイン」や「AppleScript Studio入力補助プラグイン」などが作れる状態。プロジェクト全体に対して何らかの操作を加えるという機能は提供されていなかった(自前でプロジェクト内のファイルを調べるぐらい)。

Xcode 3.2.4

AppleScript Studioの予約語が大量に入っている状態だが、変化が生じる。AppleScriptでXcodeのプラグインを作れる「Plugin Suites」をいきなりバッサリ廃止(一番使い物になった部分を廃止してどうする?)

Appleの担当者が用語辞書に手を加えはじめる。ただし、試行錯誤が随所に見受けられる。ものすごく悩みながらやっている雰囲気。

Xcode 4.0.1

AppleScript Studioの予約語をバッサリ削除。Xcode上のAppleScript開発環境をAppleScriptObjCに移行させ、Xcode自体にAppleScript Studioの予約語をのせておく必要性がなくなったため。

Xcode 4.1

「To Be Removed Suites」「Tier2 Suites」など相変わらず暫定版の香りがする。

Xcode 4.2

「To Be Removed Suites」を削除。「Tier2 Suites」を整理。

しかし、あいかわらず「ユーザーが何をするか」を考慮しないで設計しているので、Scripterから見ても「使い物にならない」雰囲気がたっぷりです。

Xcode 4.xではマイナーバージョンが上がっただけでScriptの互換性がなくなるし、XcodeのAppleScript用語は迷走に迷走を重ね、より「ダメな方向」に進む可能性が。

もう、Xcodeの担当者が○○なことは十分に分ったので、○○さ加減を全世界に宣伝しなくてけっこうです。実用性のある用語を備えるようにしてほしいです。

XcodeをASからこづき回すのは「何のため」なのかをもう一度問い直していただきたい。たとえば……

・大量のプロジェクトのビルド設定を変更して、個別にクリーニングしてビルド、生成した実行ファイルをアーカイブしてSFTPでアップロード

・FileMaker ProのDBからLocalized.stringsファイルを生成。内容を置き換える

・現在編集中のソースファイルの選択部分を取得して、何らかの処理をScriptで加えたあとに選択部分に返す

・すでに存在しているプロジェクトにCode Signingを行い、Sandbox設定を行ったのちにビルド。ビルド時にエラーが出ないかどうかコンソールに出力する

・現在オープン中のプロジェクトが、何のテンプレートを元に作成されたのかを取得(プロジェクトの種別判定)

・プロジェクトの設定へのアクセス、プロジェクト内の各ファイルへのアクセス

・編集中の(テキストベースの)書類に対する操作

……と、ざっとXcodeの自動化処理なんてだいたいこのぐらいができればよさそうなもの。それなのに、ブレークポイントをこづき回してみたり奇怪なオブジェクト階層を作ってみたりと、おおよそ生産的でない仕事を繰り広げている状況です。

2011/11/10 Photoshop CS3でオープン中の画像の中央のドットの色を取得して確認する

Photoshop CS3でオープン中の画像の中央のドットの色を取得して、choose color命令で表示します。

col1.jpg

色のプレビューを行うのに、HTMLでも作ってSafariでオープンさせようかなどと考えていたのですが、冗談半分でchoose colorコマンドにdefault colorを指定してみたら構文確認をパスして……思ったとおりの動作をして驚きました。

Photoshop CS3だけでなく、後継バージョンでも、Photoshop Elementsでも実行できるものと思われます。

col2.jpg

メモ:choose colorコマンドで色のプレビューが行える

スクリプト名:Photoshop CS3でオープン中の画像の中央のドットの色を取得する
tell application “Adobe Photoshop CS3″
  –注意:ドキュメントをあらかじめオープンしておくこと
  
tell current document
    
    
set hNum to height –高さ
    
set wNum to width –幅
    
    
set x1 to 0
    
set y1 to 0
    
set x2 to wNum
    
set y2 to hNum
    
    
set xCenter to x1 + (x2 - x1) / 2
    
set yCenter to y1 + (y2 - y1) / 2
    
    
–Color Samplerを作成して指定座標の色情報を取得する
    
set aSampler to make new color sampler with properties {class:color sampler, position:{xCenter, yCenter}}
    
set colValues to color sampler color of aSampler
    
–> {class:RGB color, red:177.996108949416, green:24.0, blue:34.0}
    
delete aSampler –samplerをとっとと削除する
    
    
set rVal to (red of colValues) * 256
    
set gVal to (green of colValues) * 256
    
set bVal to (blue of colValues) * 256
    
    
–choose colorを使って、指定した色のプレビューを行う
    
choose color default color {rVal, gVal, bVal}
    
  end tell
end tell

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

2011/11/09 Excel 2011で表示中のワークブック内のすべてのシートの表示状態を変更する v2

Excel 2011で、表示中の書類(ワークブック)内のすべてのシートの表示状態を変更するAppleScriptです。

Windowsユーザーから受け取ったExcel書類を開くと、なぜか高確率で表示倍率が100%以下になっており、しかも表示形式がページ区切りになっていたりで、ドットの細かいMacBook Pro 17インチあたりでオープンすると、かなり見づらいです。さらに、それをすべて手作業で変更するのはけっこう手間がかかります。

そこで、全ワークシートの表示倍率を100%に、表示形式を通常表示に切り換えるAppleScriptを作った次第です。

スクリプト名:Excel 2011で表示中のワークブック内のすべてのシートの表示状態を変更する v2

–最前面の(ドキュメントの)Windowの表示状態になっているシート名を取得
tell application “Microsoft Excel”
  tell window 1
    set curSheetNum to entry_index of active sheet –あとでこのシートの表示状態に戻す
  end tell
end tell

tell application “Microsoft Excel”
  –最前面のドキュメント中の各シート名を取得
  
tell active workbook
    set sList to count every worksheet
  end tell
  
  
–ループで各シートに指定
  
repeat with i from 1 to sList
    
    
–表示対象のワークシートを切り換え
    
tell workbook 1
      activate object worksheet i –★★ 表示切り換え用の変な命令
    end tell
    
    
–表示倍率などを設定
    
tell window 1
      set view to normal view –レイアウト表示を通常表示に
      
set zoom to 100 –表示ズーム倍率設定
    end tell
    
  end repeat
  
end tell

–最前面の(ドキュメントの)Windowの表示状態になっているシート名を取得
tell application “Microsoft Excel”
  tell workbook 1
    activate object worksheet curSheetNum –初期表示状態に戻す
  end tell
end tell

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

2011/11/09 Time Machineの最新と次回のバックアップ時刻を取得する(Sparse Image用)

By xanadu62

Time Machineの最新バックアップ時刻と次回のバックアップ時刻予定をシステム環境設定を開かずに表示するAppleScriptです。Time Machineに使用している、可変容量のディスクイメージ(Sparse Image)をマウントしているドライブ名を入力すると、それぞれの最新バックアップ時刻と次回のバックアップ時刻予定を表示します。

time2.jpg

HDD名は最初の1回入力するだけでプロパティに保持するので、毎回入力の必要はありません。
今のところ、次回のバックアップ時刻はシステム環境設定が表示する時刻より1分ほど遅れますが、実用上は問題ないのではないかと思います(原因も不明)。
複数のSparse Imageに対応し、若干のバグフィックスも追加しました。

このスクリプトはTime Machineの定期バックアップが行われている場合にのみ有効です。(最新バックアップ時刻にインターバルを加算して次回のバックアップ予定を算出しているため)次回のバックアップ予定を直接取得する手段が見つからないため、このような中途半端な仕様になっています。

スクリプト名:Time Machine BackUp Status_Sparsebundle
【コメント】 Time Machineの最新バックアップ時刻と次回のバックアップ時刻を取得するAppleScript。スパースバンドルイメージをバックアップ先にしているケース用。

Ver.0.12 (2011.10.27)
1.複数のバックアップイメージが見つかった場合に対応。
2.エラーが発生する範囲がバックアップファイルのリスト(ls)コマンド以外にもあったので、処理範囲を広げた。
Ver.0.1(2011.10.24) 初版。

–Time Machineに使っているHDD名を記憶するプロパティ
property TmHddName : “”

on run
  
  
–Time Machineに使っている外付けHDDを取得
  
activate
  
  
if TmHddName is “” then
    
    
display dialog “Time Machineに使っている外付けHDDを接続して、名称を入力してください。” default answer “USB HD 1″ buttons {“やめます”, “入力しました”} default button 2
    
    
set dlogReturned to result
    
  end if
  
  
  
if button returned of the dlogReturned is not “やめます” then
    
    
–Computer Nameをsystem_profilerから取得
    
set ComputerName to do shell script “system_profiler SPSoftwareDataType | grep ‘Computer Name’ | cut -d ‘:’ -f2 | cut -d ‘ ‘ -f2″
    
    
–Time Machineに使っている外付けHDD名をdlogReturnedから取得
    
set TmHddName to text returned of the dlogReturned
    
    
–エラー処理
    
set errFlag to false
    
    
try
      
      
–Time Machineに使っているスパースバンドルイメージ名を取得
      
set TmImgName to do shell script “cd /Volumes/” & quoted form of TmHddName & “; ls | grep ’sparsebundle’”
      
      
set CurrentASTID to AppleScript’s text item delimiters
      
      
set AppleScript’s text item delimiters to return
      
      
set TMImgNameList to every text item of TmImgName
      
      
set AppleScript’s text item delimiters to CurrentASTID
      
      
if length of TMImgNameList is not 1 then
        
        
–set TmImgName to TmImgName
        
        
–else
        
        
choose from list TMImgNameList with prompt “複数のバックアップイメージがあります。一つを選択してください” OK button name “選択” cancel button name “やめる” without empty selection allowed
        
        
set theResult to result
        
        
if theResult is not false then
          
          
set TmImgName to theResult
          
        else
          
          
display dialog “バックアップイメージが選択されなかったので処理を中止します” buttons {“分かりました”} default button 1
          
          
quit of me
          
        end if
        
      end if
      
      
–Time Machineに使っているスパースバンドルイメージをマウントし、マウントされたイメージ名を取得
      
set TmImgAttachedName to do shell script “cd /Volumes/” & quoted form of TmHddName & “; hdiutil attach “ & TmImgName & ” | grep ‘Apple_HFS’ | cut -d ‘/’ -f5″
      
      
–Time Machineに使っているスパースバンドルイメージのパス設定
      
set TMBackUpPath to “/Volumes/” & quoted form of TmImgAttachedName & “/Backups.backupdb/” & quoted form of ComputerName & “/Latest”
      
      
      
do shell script “ls “ & TMBackUpPath
      
    on error
      
      
display dialog “指定されたHDDが見つからないか、HDD上にTime Machineのバックアップがありません。” buttons {“しまった!”} default button 1 giving up after 3
      
      
set TmHddName to “”
      
      
set errFlag to true
      
    end try
    
    
if not errFlag then
      
      
–最新バックアップ時刻の取得
      
set LatestBackUpTimeString to do shell script “ls -lT “ & TMBackUpPath & ” | cut -d ‘ ‘ -f9-13″
      
      
set LatestBackUpTime to EJDate(LatestBackUpTimeString)
      
      
      
–バックアップインターバルの取得と次回のバックアップ時刻生成
      
set StartIntarval to ((do shell script “defaults read /System/Library/LaunchDaemons/com.apple.backupd-auto StartInterval”) as number)
      
      
set NextBackUpTime to LatestBackUpTime + StartIntarval
      
      
–結果の表示
      
activate
      
display dialog (“Time Machineのバックアップ状況は以下の通りです。” & return & return & “最新のバックアップ” & return & LatestBackUpTime as string) & return & return & “次回のバックアップ予定” & return & NextBackUpTime as string buttons {“分かりました”} default button 1
      
      
–Time Machineに使っているスパースバンドルイメージを取り出す
      
do shell script “diskutil eject /Volumes/” & quoted form of TmImgAttachedName
      
      
    end if
    
  end if
  
end run

on EJDate(EDate)
  
  
set TempDlim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to ” “
  
  
set M to text item 1 of EDate
  
  
–日付が一桁の場合と、そうでない場合の分岐処理
  
–一桁の場合、EDateで区切り文字であるスペースが一個増える。つまり、何もない文字が取得されるので、それで分岐を行う。
  
if text item 2 of EDate is “” then
    
    
set D to text item 3 of EDate
    
set T to text item 4 of EDate
    
set Y to text item 5 of EDate
    
  else
    
    
set D to text item 2 of EDate
    
set T to text item 3 of EDate
    
set Y to text item 4 of EDate
    
  end if
  
  
  
set AppleScript’s text item delimiters to TempDlim
  
  
set EMList to {“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”}
  
  
set JMNum to 1
  
  
repeat with aEM in EMList
    if aEM as text is M then exit repeat
    
set JMNum to JMNum + 1
  end repeat
  
  
return date (Y & “.” & JMNum & “.” & D & “.” & T)
  
end EJDate

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

2011/11/09 Time Machineの最新と次回のバックアップ時刻を取得する(HDD、NAS用)

By xanadu62

Time Machineの最新バックアップ時刻と次回のバックアップ時刻予定をシステム環境設定を開かずに表示するAppleScriptです。

Time Machineに使用している外付けHDD(ローカル接続)またはTime Capsule(以下TC)やNASなどのネットワーク接続しているHDD名を入力すると、それぞれの最新バックアップ時刻と次回のバックアップ時刻予定を表示します。

time1.jpg

HDD名は最初の1回入力するだけでプロパティに保持するので、毎回入力の必要はありません。
今のところ、次回のバックアップ時刻はシステム環境設定が表示する時刻より1分ほど遅れますが、実用上は問題ないのではないかと思います(原因も不明)。
TCやNAS用は、TCやNASに複数のMacのバックアップがある場合には対応していません(やろうと思えばchoose from listでできますが……)。
これらのスクリプトはTime Machineの定期バックアップが行われている場合にのみ有効です。(最新バックアップ時刻にインターバルを加算して次回のバックアップ予定を算出しているため)次回のバックアップ予定を直接取得する手段が見つからないため、このような中途半端な仕様になっています。

スクリプト名:Time Machine BackUp Status
【コメント】 Time Machineの最新バックアップ時刻と次回のバックアップ時刻を取得するAppleScript。ローカルボリュームを直接バックアップ先にしているケース用。

Ver 0.12 (2011.10.23)
1.Time Machineに使っている外付けHDD名をダイアログで入力可能にした。
2.HDD名はpropertyに保持し、毎回入力する必要はなくした。
3.バックアップをスパースバンドルディスクイメージにしたので、その対応処理。
Ver 0.11(2011.10.22) 
1.コンピュータ名を自動取得
2.日付取得部分の微調整(日付が1桁の場合の対応)
3.エラー処理実装
Ver.0.1(2011.10.21) 初版。とりあえず目的は果たしたレベル。

–Time Machineに使っているHDD名を記憶するプロパティ
property TmHddName : “”

on run
  
  
–Time Machineに使っている外付けHDDを取得
  
activate
  
  
if TmHddName is “” then
    
    
display dialog “Time Machineに使っている外付けHDDを接続して、名称を入力してください。” default answer “” buttons {“やめます”, “入力しました”} default button 2
    
    
set dlogReturned to result
    
  end if
  
  
  
if button returned of the dlogReturned is not “やめます” then
    
    
–Computer Nameをsystem_profilerから取得
    
set ComputerName to do shell script “system_profiler SPSoftwareDataType | grep ‘Computer Name’ | cut -d ‘:’ -f2 | cut -d ‘ ‘ -f2″
    
    
–Time Machineに使っている外付けHDD名をdlogReturnedから取得
    
set TmHddName to text returned of the dlogReturned
    
    
–Time Machineに使っている外付けHDDのパス設定
    
set TMBackUpPath to “/Volumes/” & quoted form of TmHddName & “/Backups.backupdb/” & quoted form of ComputerName & “/Latest”
    
    
–エラー処理
    
set errFlag to false
    
    
try
      
      
do shell script “ls “ & TMBackUpPath
      
      
    on error
      
      
display dialog “指定されたHDDが見つからないか、HDD上にTime Machineのバックアップがありません。” buttons {“しまった!”} default button 1 giving up after 3
      
      
set TmHddName to “”
      
      
set errFlag to true
      
    end try
    
    
if not errFlag then
      
      
      
–最新バックアップ時刻の取得
      
set LatestBackUpTimeString to do shell script “ls -lT “ & TMBackUpPath & ” | cut -d ‘ ‘ -f9-13″
      
      
set LatestBackUpTime to EJDate(LatestBackUpTimeString)
      
      
–バックアップインターバルの取得と次回のバックアップ時刻生成
      
set StartIntarval to ((do shell script “defaults read /System/Library/LaunchDaemons/com.apple.backupd-auto StartInterval”) as number)
      
      
set NextBackUpTime to LatestBackUpTime + StartIntarval
      
      
–結果の表示
      
activate
      
display dialog (“Time Machineのバックアップ状況は以下の通りです。” & return & return & “最新のバックアップ” & return & LatestBackUpTime as string) & return & return & “次回のバックアップ予定” & return & NextBackUpTime as string buttons {“分かりました”} default button 1
      
    end if
    
  end if
  
end run

on EJDate(EDate)
  
  
set TempDlim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to ” “
  
  
set M to text item 1 of EDate
  
  
–日付が一桁の場合と、そうでない場合の分岐処理
  
–一桁の場合、EDateで区切り文字であるスペースが一個増える。つまり、何もない文字が取得されるので、それで分岐を行う。
  
if text item 2 of EDate is “” then
    
    
set D to text item 3 of EDate
    
set T to text item 4 of EDate
    
set Y to text item 5 of EDate
    
  else
    
    
set D to text item 2 of EDate
    
set T to text item 3 of EDate
    
set Y to text item 4 of EDate
    
  end if
  
  
  
set AppleScript’s text item delimiters to TempDlim
  
  
set EMList to {“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”}
  
  
set JMNum to 1
  
  
repeat with aEM in EMList
    if aEM as text is M then exit repeat
    
set JMNum to JMNum + 1
  end repeat
  
  
return date (Y & “.” & JMNum & “.” & D & “.” & T)
  
end EJDate

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

2011/11/02 投稿も受け付けています

本Blogは、Googleで検索するとやたらとヒットするものの、「知る人ぞ知る」という程度の存在です。

この場末のBlog(名前からして)に自分のAppleScriptを掲載してほしい、というきわめて奇特なお申し出には、とくにお断りはしておりません。

掲載するからには、当然私が動作確認を行い、実行できることを確認したうえで掲載いたします。高価だったり更新頻度が頻繁なソフトウェアや周辺機器をコントロール対象としているAppleScriptは、私が動作確認できない可能性が高く掲載できません。その点はご了承ください。