Archive for the 'ユーザー操作(user interact)' Category

2016/10/04 Finderの最前面のフォルダを取得して、choose folderの始点フォルダに指定する

Finderの最前面のWindowで表示しているフォルダ(target)を取得して、後続のchoose folderコマンドで表示するデフォルトフォルダに指定するAppleScriptです。

targwin1_resized.png
▲最前面のWindowの内容

targwin2_resized.png
▲最前面のWindowの対象フォルダ(target)を取得してchoose folder

こういうのは、技術的にすごいとかどーのとかいうことは全然なくて、「おもてなし度が向上する」ワザ。過剰にやりすぎると嫌われることもあるので、用法・容量を守って過剰に使いすぎない程度に使ってみるといいのでしょう。

既存のPDFに対して指定フォルダ内のJPEG画像を末尾に追加するAppleScriptを書いたときに、「指定フォルダ」が最前面にあるのになんでこれを毎回指定しないとダメなんだろうか、と思って作ってみたものです。

AppleScript名:Finderの最前面のフォルダを取得して、choose folderの始点フォルダに指定する
– Created 2016-10-04 by Takaaki Naganoya
– 2016 Piyomaru Software
–http://piyocast.com/as/archives/4244

set targAlias to retFrontFinderWindowsTargetIfExits(path to desktop) of me
set aFol to choose folder default location targAlias

on retFrontFinderWindowsTargetIfExits(aDefaultLocation)
  tell application “Finder”
    set wCount to count every window
    
if wCount 1 then
      tell front window
        set aTarg to target as alias
      end tell
      
return aTarg
    else
      return aDefaultLocation
    end if
  end tell
end retFrontFinderWindowsTargetIfExits

★Click Here to Open This Script 

2015/09/16 指定の画像をアイコン表示してdisplay dialog

外部の画像ファイルをアイコンに指定してダイアログ表示を行うAppleScriptです。

custom_icon_dialog.png

大昔から指定できることはわかっていたのですが、まったく必要がなくてやったことがなく・・・初めて指定してみました。

大きな画像を指定しても、ダイアログに表示できる大きさに自動でリサイズされます。

Animation Gifを指定するとアイコン表示エリアでアニメーションする、というのがちょっといい小ネタです。PDFも指定できますが、リンクをクリックできたりするかどうかは・・・。

AppleScript名:外部の画像をアイコン表示してdisplay dialog
set a to choose file of type {“public.image”}

display dialog “This is a simple test” with icon a

★Click Here to Open This Script 

Script Bundle内のContents/Resourcesフォルダ内に画像を入れて、アイコン名で指定するやり方もあり、こちらの方が(Xcode上で書くAppleScriptアプリケーションでも)みかけますが、通常のAppleScriptでやったことがなかったので試してみました。

resources.png

このテストのためにわざわざIconComposerでicnsリソースを作成してScriptバンドル内に入れて実験してみました。このScriptをアプリケーション形式(Applet)に保存して(同様に画像やICNSファイルを入れて)実行するとアイコン表示されます。

バンドル内のicnsファイルをアイコンとして表示できましたし、普通の画像も問題なく表示できました(Appletとして保存していれば)。

AppleScript名:バンドル内の画像を指定してdisplay dialog_app
set aPath to path to resource “bImg.icns”
display dialog “This is a simple test–1″ with icon aPath

set aPath to path to resource “aImg.png”
display dialog “This is a simple test–2″ with icon aPath

★Click Here to Open This Script 

2013/08/25 おもてなしのフォルダ/ファイル選択 v2

ユーザーが選択したフォルダ/ファイルを記憶して2回目移行の実行時にそれを利用する「おもてなしのフォルダ選択」「おもてなしのファイル選択」の、他の環境に渡したときのエラー対策版です。

スクリプト名:おもてなしのフォルダ選択 v2
property sDir1 : missing value
property sDir2 : missing value

if sDir1 = missing value then
  –初回実行時
  
set aFol to choose folder with prompt “処理対象のフォルダAを指定してください”
  
set sDir1 to aFol
else
  –2回目以降
  
try
    set aFol to choose folder with prompt “処理対象のフォルダAを指定してください” default location sDir1
  on error
    set aFol to choose folder with prompt “処理対象のフォルダAを指定してください”
    
set sDir1 to aFol
  end try
end if

if sDir2 = missing value then
  –初回実行時
  
set bFol to choose folder with prompt “出力対象のフォルダBを指定してください”
  
set sDir2 to bFol
else
  –2回目以降
  
try
    set bFol to choose folder with prompt “出力対象のフォルダBを指定してください” default location sDir2
  on error
    set bFol to choose folder with prompt “出力対象のフォルダBを指定してください”
    
set sDir2 to bFol
  end try
end if

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

スクリプト名:おもてなしのファイル選択 v2
property aFileF : missing value
property bFileF : missing value

if aFileF = missing value then
  –初回実行時
  
set aFile to choose file with prompt “ファイルAを選択してください。”
  
set aFileF to aFile
else
  –2回目以降
  
try
    set aFile to choose file with prompt “ファイルAを選択してください。” default location aFileF
  on error
    set aFile to choose file with prompt “ファイルAを選択してください。”
    
set aFileF to aFile
  end try
end if

if bFileF = missing value then
  –初回実行時
  
set bFile to choose file with prompt “ファイルBを選択してください。”
  
set bFileF to bFile
else
  –2回目以降
  
try
    set bFile to choose file with prompt “ファイルBを選択してください。” default location bFileF
  on error
    set bFile to choose file with prompt “ファイルBを選択してください。”
    
set bFileF to bFile
  end try
end if

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

2013/08/23 おもてなしのファイル選択

choose fileでdefault locationが使えることに気付かず、いままでchoose fileだけは別扱いしていましたが……choose fileでdefault locationの指定ができるので、使うと便利という話です。

もともと、choose folderについては複数のフォルダ選択を行うような場合に、それぞれのフォルダ選択で同じものを指定することが圧倒的に多いので、前回の選択フォルダをAppleScriptのプロパティに記憶しておいて、2回目以降はそれを使うという処理をよくやっていました。

選択するフォルダ数が増えてくると、フォルダ選択作業は拷問に近いものがあるので、このように「前回のフォルダを覚えてデフォルト位置にする」という処理は、あるのとないのとでは(使わされる側にとって)雲泥の差です。

スクリプト名:おもてなしのフォルダ選択
property sDir1 : missing value
property sDir2 : missing value

if sDir1 = missing value then
  –初回実行時
  
set aFol to choose folder with prompt “処理対象のフォルダAを指定してください”
  
set sDir1 to aFol
else
  –2回目以降
  
set aFol to choose folder with prompt “処理対象のフォルダAを指定してください” default location sDir1
end if

if sDir2 = missing value then
  –初回実行時
  
set bFol to choose folder with prompt “出力対象のフォルダBを指定してください”
  
set sDir2 to bFol
else
  –2回目以降
  
set bFol to choose folder with prompt “出力対象のフォルダBを指定してください” default location sDir2
end if

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

そして、ファイル選択でもdefault locationを(一度選択したファイルを)記憶しておいて、2回目以降はそれを使い回すようにできるわけです。

これを、「おもてなしのファイル選択」と呼んでいます。これまた、何回も実行する開発時のテストプログラムを自分で使うような場合には……あるのとないのとでは雲泥の差です。

ただ……納品時に「自分の環境でテストして、自分のローカルフォルダの情報が入ったままのアプレット」をそのまま相手に送ってしまうと、「これ、動かないけどどーなってんの?」という指摘を受けるので要注意です(実際に海外のクライアント向けにやってしまいました)。

プロパティに保存してあるaliasの情報を一度検証して、エラーを起こすようであればデフォルト値は指定しないという処理が必要かもしれません。

スクリプト名:おもてなしのファイル選択
property aFileF : missing value
property bFileF : missing value

if aFileF = missing value then
  –初回実行時
  
set aFile to choose file with prompt “ファイルAを選択してください。”
  
set aFileF to aFile
else
  –2回目以降
  
set aFile to choose file with prompt “ファイルAを選択してください。” default location aFileF
end if

if bFileF = missing value then
  –初回実行時
  
set bFile to choose file with prompt “ファイルBを選択してください。”
  
set bFileF to bFile
else
  –2回目以降
  
set bFile to choose file with prompt “ファイルBを選択してください。” default location bFileF
end if

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

2013/04/13 0〜255の8ビットの値から構成されるRGB値のリストの色をプレビューする

{r,g,b}のリストで表現したRGBデータのリストの色をchoose colorでプレビューするAppleScriptです。

色データの内容を視覚的に把握したいときに便利です。本ダイアログ表示中に[ESC]キーを押したり、キャンセルボタンをクリックすると終了してしまうのが難点ですが……

スクリプト名:0〜255の8ビットの値から構成されるRGB値のリストの色をプレビューする

set aRGB to {76, 40, 255}
set aRes to col8bitRGBPreview(aRGB) of me

set bRGB to {0, 0, 225}
set aRes to col8bitRGBPreview(bRGB) of me

–0〜255の8ビットの値から構成されるRGB値のリスト {r,g,b} の色をchoose colorでプレビューする
on col8bitRGBPreview(rgbColList)
  set aLen to length of rgbColList
  
  
if aLen is not equal to 3 then return false
  
  
set {r, g, b} to rgbColList
  
  
set asR to r * 256
  
set asG to g * 256
  
set asB to b * 256
  
  
set prevCol to {asR, asG, asB}
  
  
choose color default color prevCol
  
  
return true
  
end col8bitRGBPreview

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

2010/02/10 フォルダの選択(内容確認つき)v2

ちょっと気の利いた複数folder選択」を発展させ、選択したフォルダの一覧を確認表示するようにしたAppleScriptです。

最大の見どころは、フォルダパスを一覧表示するさいに、どのパスかを示す文字の長さをそろえて、フォルダパスの内容確認を行いやすくした「umekusaKit」です。

dialog1.jpg

これで、選択した複数パスの一覧を表示し、処理前に確認するように書いておけば、ささいなミスもなくなるに違いありません。

ちなみに、この一覧表示で「Cancel」ボタンをクリックすると……

dialog2.jpg

のように、処理を中断します。

どうも、プログラムを見直してみると……もっと汎用的なサブルーチンに仕立てて、もっと簡単に利用できるようにできそうな気がします。まだ、手直しできる余地が大きそうですが、使用頻度はあまり高くなさそうなので……このままかもしれません。

スクリプト名:フォルダの選択(内容確認つき)v2
property aFol : missing value
property bFol : missing value
property cFol : missing value

set a1Mes to “コマの書類の親フォルダ”
set b1Mes to “ページアップ先のフォルダ”
set c1Mes to “ページ台紙が入っているフォルダ”

set a2Mes to “(komaFolderServerPath)を選択”
set b2Mes to “(pageUpOutputTargetPath)を選択”
set c2Mes to “(pageDaishiFolder)を選択”

if aFol = missing value then
  set aFol to choose folder with prompt (a1Mes & a2Mes)
else
  set aFol to choose folder default location aFol with prompt (a1Mes & a2Mes)
end if

if bFol = missing value then
  set bFol to choose folder with prompt (b1Mes & b2Mes)
else
  set bFol to choose folder default location bFol with prompt (b1Mes & b2Mes)
end if

if cFol = missing value then
  set cFol to choose folder with prompt (c1Mes & c2Mes)
else
  set cFol to choose folder default location cFol with prompt (c1Mes & c2Mes)
end if

–設定内容の確認表示
set aaList to {a1Mes, b1Mes, c1Mes}
set {r1, r2, r3} to makeSameString(aaList, “ ”) of umekusaKit –ウメクサ文字には全角スペースを指定

set aList to {r1 & “ = ” & aFol as string, r2 & “ = ” & bFol as string, r3 & “ = ” & cFol as string}
set defaultItem to contents of item 1 of aList

–最終確認
set aRes to choose from list aList with prompt “この設定でよいですか?” default items defaultItem with title “指定内容の最終確認”
if aRes = false then
  display dialog “処理を中止します” buttons {“OK”} default button 1 with icon 1 with title “処理中止”
  
return
end if

–このあとにメインの処理が入る

–文字リストをchoose from listで表示させる際に長さを揃えるために作った
script umekusaKit
  –最大の長さの文字列に合わせて、ウメクサ文字を後ろに追加する
  
–fillCharは1文字であることを期待している
  
–全角文字と半角文字が「混在しない」ことを期待している。あるいは、半角文字の文字長が一緒とか
  
on makeSameString(aList, fillChar)
    –リスト中の文字列長の最大値を求める
    
set lenList to {}
    
repeat with i in aList
      set the end of lenList to length of (contents of i)
    end repeat
    
set maxLen to item (maximumItemNoFromList(lenList) of me) of lenList
    
    
–最大長に合わせて各項目の末尾にfillCharを追加する
    
set retList to {}
    
repeat with i in aList
      set newStr to contents of i
      
set aLen to length of i
      
repeat with ii from 1 to (maxLen - aLen)
        set newStr to newStr & fillChar
      end repeat
      
set the end of retList to newStr
    end repeat
    
    
return retList
  end makeSameString
  
  
–最大値の項目番号を取得する
  
on maximumItemNoFromList(nList)
    script o
      property nl : nList
      
property itemNo : 1
    end script
    
    
set max to item 1 of o’s nl
    
repeat with i from 2 to (count nList)
      set n to item i of o’s nl
      
if n > max then
        set max to n
        
set o’s itemNo to i
      end if
    end repeat
    
return o’s itemNo
  end maximumItemNoFromList
end script

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

2010/01/30 ちょっと気の利いた複数folder選択

仕事用にかなり凝ったAppleScriptのプログラムを作成したような場合には、処理対象のデータを自由に指定できるよう、処理先をchoose folderやchoose fileで指定することがあります。プログラム内にパスを固定で記述するよりも自由度が高く、ユーザーフレンドリーな処理になります。

ただ……1つのAppleScript中でいくつもフォルダを選択する必要があったりすると、そのたびにフォルダ選択ダイアログで処理対象のフォルダを指定しなければなりません。しかも、Folder Aを選択したあとでFolder Bを選択しようとすると、Folder Aの場所からスタートしなくてはなりません。

これはけっこう面倒です。

dialog1.jpeg

dialog2.jpeg

そこで、choose folderで一度フォルダを選択したら、propertyの値に保持しておいて、各フォルダ選択ダイアログで個別に記録。二度目からはそれぞれ前回指定したフォルダを勝手に指定するよう、些細な改善を行ってみました。

その結果、大幅な操作性の改善を行うことができ、いくつフォルダ選択ダイアログが出てきても、うっとおしくなくなりました(たいていにおいて、前回と同じ場所を指定することのほうが多く、目視で確認してリターンキーを押していくだけ)。

スクリプト名:ちょっと気の利いた複数folder選択
property folderA : missing value
property folderB : missing value

if folderA is not equal to missing value then
  –前回の選択内容を使用
  
set folderA to choose folder default location folderA with prompt “folder Aを選択”
else
  –はじめて実行する場合など
  
set folderA to choose folder with prompt “folder Aを選択”
end if

if folderB is not equal to missing value then
  –前回の選択内容を使用
  
set folderB to choose folder default location folderB with prompt “folder Bを選択”
else
  –はじめて実行する場合など
  
set folderB to choose folder with prompt “folder Bを選択”
end if

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

2010/01/17 リストから選択してアイテム番号を返す〜複数選択対応

choose from listで複数選択を行いつつ、選択した項目がそれぞれリストの何アイテム目かの情報を返すAppleScriptです。

以前に、複数選択ではないバージョンは作ってあったのですが、Omni Outlinerから選択部分を取得するAppleScriptを作成する際に、即興で作ったものです。

スクリプト名:リストから選択してアイテム番号を返す〜複数選択対応
set aList to {“red”, “blue”, “green”, “white”}
set aMes to “項目を選択してください(Command-クリックで複数選択可能)”
set aRes to retMultipleItemFromListByItemNo(aList, aMes) of me

–リストから選択してアイテム番号を返す(複数項目選択対応)
on retMultipleItemFromListByItemNo(aList, aMes)
  set aRes to choose from list aList with prompt aMes with multiple selections allowed
  
if aRes = false then return 0
  
  
set hitList to {}
  
repeat with i1 in aRes
    set aRes to contents of i1
    
set hitNum to 1
    
repeat with i in aList
      set j to contents of i
      
if j is equal to aRes then
        exit repeat
      end if
      
set hitNum to hitNum + 1
    end repeat
    
set the end of hitList to hitNum
  end repeat
  
return hitList
end retMultipleItemFromListByItemNo

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

2008/05/08 リストの中に指定のタグ付きテキスト要素によるトリミングを行う。結果はリストで返す

リスト形式で存在しているデータで、実はその中にInfo.plistのような構造のタグ付きテキストが入っているような場合の処理で作成したサブルーチンです。

つまり……AppleScriptで作ったアプリケーションがタグ付きテキスト形式でデータを保存していて、その保存先がテキストファイルではないために、取得するとリストで返ってくるようなケースに対応するためのものです。

リストをまるごとテキストに変換して、テキストとして処理してもよかったのですが……リストのまま扱えると便利なケースが多いので、リストのまま処理してみた次第です。応用範囲がなさそうでいて、その実、便利に使えています。

スクリプト名:リストの中に指定のタグ付きテキスト要素によるトリミングを行う。結果はリストで返す
set aList to {"<index>", "script1", "script2", "script3", "<a>", "test script G1", "</a>", "</index>"}

set {startTagText, endTagText} to {"<a>", "</a>"}
set sList to trimListItemByTaggedText(aList, startTagText, endTagText) of me
if sList = false then
  display dialog "Error Message"
end if
sList
> {"test script G1"}

リストの中に指定のタグ付きテキスト要素によるトリミングを行う。結果はリストで返す
on trimListItemByTaggedText(aList, startTagText, endTagText)
  –そもそも、指定のタグ付きテキストが、開始/終了テキストともに与えられたリストの中に入っていなかった場合、処理終了
  
if startTagText is not in aList or endTagText is not in aList then return false
  
  –
  
set sPos to retItemNoInList(aList, startTagText) of me
  
set ePos to retItemNoInList(aList, endTagText) of me
  
  –
startTagTextとendTagTextの間に何も存在しなかった場合はエラー
  
if sPos + 1 = ePos then return false
  
  –
結果を取り出す
  
set resList to items (sPos + 1) thru (ePos - 1) of aList
  
return resList
end trimListItemByTaggedText

指定項目のリスト中におけるシリアルサーチ
on retItemNoInList(aList, a)
  set aCount to 1
  
set hitF to false
  
repeat with i in aList
    if a = contents of i then
      set hitF to true
      
exit repeat
    end if
    
set aCount to aCount + 1
  end repeat
  
  
if hitF = true then
    return aCount
  else
    return false
  end if
end retItemNoInList

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

2008/03/09 chooseFromListでアイテム番号を返す

リストに入れておいたアイテムを一覧表示させて選択する「choose from item」、選択肢として与える内容はリストなので、選択した後に何番目のアイテムが選択されたかを知りたい場合が多いわけですが、返ってくるのは選択された項目の内容そのもの………。というわけで、リストの何番目の項目が選択されたのかを求めるサブルーチンを作成。これも、かなり使用頻度の高いものです。

スクリプト名:chooseFromListでアイテム番号を返す
set aList to {”あか“, “あお“, “きいろ“}
set aMes to以下の中から選択してください。
set a to retNumberFromChooseFromList(aList, aMes) of me
a

リストからの選択ダイアログで、選択したアイテムのアイテムナンバーを返す
on retNumberFromChooseFromList(aList, aMes)
  set aRes to choose from list aList with prompt aMes
  
if aRes = false then return false
  
set aRes to (contents of aRes) as string
  
set itemCount to 1
  
repeat with i in aList
    set j to contents of i
    
if j is equal to aRes then
      return itemCount
    end if
    
set itemCount to itemCount + 1
  end repeat
end retNumberFromChooseFromList

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