Excel VBA から AppleScript を実行し、フォルダ内の全ファイル名を取得 AppleScript [01]

AppleScript[01](Png01)

AppleScript [01] Excel VBA を使用して AppleScriptTask コマンドを実行

 Excel2016 for Mac 以降 MacScript コマンドの代替となった AppleScriptTask コマンドの利用方法を解説。
・フォルダ内の(指定した拡張子を持つ)全ファイル名を取得
・フォルダ内の全ファイル名を取得
・指定ファイルのフルパスを取得
・(複数)指定ファイルのフルパスを取得

(注) AppleScript にて、フォルダ選択ダイアログ あるいは ファイル選択ダイアログ を利用します!

 2021/10/09 「Ver.3.2 Cocoa AppleScript (ASOC) 高速版」リリースしました! 
UTF-8 テキストファイル入出力機能も追加  → こちら 

 2021/09/16 「Ver.2.0 Vanilla AppleScript 最終版」リリースしました!    → こちら 

 2021/08/30 「フォルダ階層(子フォルダ)&クリップボード」対応しました!    → こちら 

 2021/08/20 「キャンセルボタン押下 あるいは 異常終了」時のエラー処理として(10秒表示して自動的に閉じる)ダイアログ表示を加えたため、 AppleScript コードを修正しました! 




 AppleScript [01] Excel VBA を使用して AppleScript を実行 

 まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。


 以下4つの操作方法がよく解らない方は、 Excel VBA 入門 [06] を参照して下さい。

(1) 「空のブック」Excelファイルを新規作成にて作成後、「名前を付けて保存…」にて、「Excel マクロ有効ブック(.xlsm)」ファイル形式を選び 任意の名前で保存。

(2) ( [マクロの記録] ボタンをクリックして)マクロの保存先に「作業中のブック」を指定後 [OK] ボタンをクリックし、「マクロの記録」を開始。  マクロ名は "test" にて! 

(3) 例えば「A3」セルを選択後、( [記録終了] ボタンをクリックして)「マクロの記録」を終了

(4) [マクロ] ボタンをクリックして 先ほど作成した "test" マクロを選択後 [編集] ボタンをクリックし、 VBEウィンドウ を開く。

 Excel2016 for Mac 以降 MacScript 代替の AppleScriptTask コマンド利用方法を解説 

Sub test()
' 【拡張子指定】  指定ディレクトリ内の「全ファイルのパス」を取得する AppleScript を実行
'       ( フォルダやファイル名に 漢字が含まれても 問題無し )
'  注.  list(0)     「ディレクトリの(POSIX)パス」を格納
'       list(1〜n)  「ファイル名(拡張子なし)」を格納

    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    Dim list() As String '          「パスorファイル名」格納用として、「文字列の配列」を定義
    
    ' AppleScriptを実行 (  最後のパラメータが AppleScript に渡される文字列で、
    '                       今回は「(対象ファイルを)拡張子」にて指定  )
    scriptParam = LCase("scpt")
    scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderExt", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10)    区切り文字に LF を利用
        Call DispArray(list)
    End If

    Erase list '配列の初期化

End Sub

Sub DispArray(list As Variant)
    Dim i As Long
    For i = LBound(list) To UBound(list) '配列の全要素を取得
        If list(i) <> "" Then  ' 一番最後は 空文字列となるため
            Debug.Print ("File[" & Format(i, "00") & "]=  " & list(i)) '1行ずつ、Debug.Print 表示
        End If
    Next
End Sub

Sub test2()
' 指定ディレクトリ内の「全ファイルのパス」を取得する AppleScript を実行
'       ( フォルダやファイル名に 漢字が含まれても 問題無し )
'  注.  list(0)     「ディレクトリの(POSIX)パス」を格納
'       list(1〜n)  「ファイル名(拡張子あり)」を格納

    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    Dim list() As String '          「パスorファイル名」格納用として、「文字列の配列」を定義
    
    ' AppleScriptを実行 (  最後のパラメータが AppleScript に渡される文字列で、
    '                       今回は「初期表示ディレクトリ」をパス指定  )
    scriptParam = "/Users/wito/" '
    scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolder", scriptParam)
    
    If scriptResult <> "" Then  '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10)    区切り文字に LF を利用
        Call DispArray(list)
    End If

    Erase list '配列の初期化

End Sub


Sub test3()
'ファイル選択ダイアログで、フルパスを取得(複数ファイル指定不可)
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    Dim list() As String '          「フルパス」格納用として、「文字列の配列」を定義
    
    ' AppleScriptを実行 (  最後のパラメータが AppleScript に渡される文字列で、
    '                       今回は「初期表示ディレクトリ」をパス指定  )
    scriptParam = "/Users/wito/"
    scriptResult = AppleScriptTask("filePath.scpt", "getFilePath", scriptParam)
    
    If scriptResult <> "" Then    '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10)    区切り文字に LF を利用
        Call DispArray(list)
    End If

    Erase list '配列の初期化
End Sub

Sub test4()
'ファイル選択ダイアログで、フルパスを取得(複数ファイル指定可能)
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    Dim list() As String '          「フルパス」格納用として、「文字列の配列」を定義
    
    ' AppleScriptを実行 (  最後のパラメータが AppleScript に渡される文字列で、
    '                       今回は「初期表示ディレクトリ」をパス指定  )
    scriptParam = "/Users/wito/"
    scriptResult = AppleScriptTask("filePath.scpt", "getMultiFilePath", scriptParam)
    
    If scriptResult <> "" Then    '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10)    区切り文字に LF を利用
        Call DispArray(list)
    End If

    Erase list '配列の初期化
End Sub

 [VBE ウィンドウ]-[コード ウィンドウ]内の Sub test() 以下を「上記のVBEコード」で置換します。

 コピペ あるいは 入力 ミスチェックのため、以下画面のように VBAProject のコンパイル を行い 「VBAコードの文法チェック」が可能です。

vba2019_primer[08] 06_png


[アプリケーション] - [ユーティリティ] 内の "スクリプトエディタ.app" を起動し、ダイアログ左下に表示される [新規書類]ボタン をクリック。
「名称未設定」ウィンドウ内に、以下の AppleScript 全コードを貼り付け。

 なお AppleScript では、--以降 改行するまでがコメント になります。


 AppleScript "filePath.scpt" をダウンロード可能にしました。   Download Here 
 ( ダウンロードしてダブルクリックすると、 "スクリプトエディタ.app" を起動! )

 上記リンクを右クリックして「リンク先のファイルをダウンロード」等を選択してダウンロード可能。
"Google Chrome" ブラウザの場合、上記リンクを右クリックして「名前を付けてリンク先を保存」を選択してダウンロード )
 (注) [ Unicode(UTF-8) 、改行コードは LF ] ファイル置き場として、筆者の旧ブログを利用

-- 選択ディレクトリの(POSIX)パス名+「(拡張子なしの)全ファイル名」を取得(パラメータ:ファイル拡張子)
on getFileListOfFolderExt(fileExtension) -- AppleScriptは、文字列比較で大文字と小文字の文字を区別しません
	set promptStr to "フォルダを選択してください!" -- フォルダ選択時のプロンプト文字列
	set LF to (ASCII character (10)) -- 区切り文字に LF を利用
	set isFirst to true --最初かどうか?
	try
		activate --アプリケーションを前面に移動する命令
		set theAlias to (choose folder with prompt promptStr) --選択フォルダの「エイリアス値」が返る
		tell application "Finder"
			set aliasList to (every file of theAlias) -- 指定フォルダ内の ファイル List を取得
			repeat with f in aliasList
				set fExt to (f's name extension as text) --「拡張子のみ」を取得
				if (fExt = fileExtension) then -- 指定拡張子を持つファイルのみを対象!
					if (isFirst) then
						set fDirHFS to (f's folder as text) --		(フォルダ)HFSパス
						set thePaths to (POSIX path of fDirHFS) --(フォルダ)POSIXパス
					end if
					-- set fName to (f's name as text) --	「ファイル名+拡張子」を取得
					--「ファイル名(拡張子なし)」を取得 123.scpt -> items 1 thru -6
					set fName to ((f's name as text)'s items 1 thru -((fExt's length) + 2) as text)
					set thePaths to (thePaths & LF & fName)
					set isFirst to false
				end if
			end repeat
		end tell
	on error
		set thePaths to "" -- 「(文字列の)返り値」を初期化
		display dialog "★ AppleScriptTask (getFileListOfFolderExt) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
	end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
	return thePaths -- display dialog thePaths as string
end getFileListOfFolderExt



-- 選択ディレクトリの(POSIX)パス名+「(拡張子ありの)全ファイル名」を取得(パラメータ:初期表示フォルダ)
on getFileListOfFolder(defaultLocation) --	拡張子を指定しないため、フォルダ内の全ファイルを返す
	set promptStr to "フォルダを選択してください!" --フォルダ選択時のプロンプト文字列
	set LF to (ASCII character (10)) --	区切り文字に LF を利用
	set isFirst to true --最初かどうか?
	try
		activate --アプリケーションを前面に移動する命令
		--	選択フォルダの「エイリアス値」が返される
		set theAlias to (choose folder with prompt promptStr default location defaultLocation)
		
		tell application "Finder"
			set aliasList to (every file of theAlias) --	指定フォルダ内の ファイル List を取得
			
			repeat with f in aliasList
				if (isFirst) then
					set fDirHFS to (f's folder as text) --		(フォルダ)HFSパス
					set thePaths to (POSIX path of fDirHFS) --(フォルダ)POSIXパス
					set isFirst to false
				end if
				set fName to (f's name as text) --「ファイル名+拡張子」を取得
				--「ファイル名(拡張子なし)」を取得 123.scpt -> items 1 thru -6
				-- set fName to ((f's name as text)'s items 1 thru -((fExt's length) + 2) as text)
				set thePaths to (thePaths & LF & fName)
			end repeat
		end tell
	on error
		set thePaths to "" --「(文字列の)返り値」を初期化
		display dialog "★ AppleScriptTask (getFileListOfFolder) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
	end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
	return thePaths -- display dialog thePaths as string
end getFileListOfFolder



-- 選択したファイルのパスを取得する(複数ファイルの選択不可)(パラメータ:初期表示フォルダ)
on getFilePath(defaultLocation)
	
	set promptStr to "ファイルの選択(複数ファイルの選択不可)" --	フォルダ選択時のプロンプト文字列
	set LF to (ASCII character (10)) --	区切り文字に LF を利用
	
	try
		activate --アプリケーションを前面に移動する命令
		
		-- 選択したファイルの「エイリアス値」が返される
		set f to (choose file with prompt promptStr default location defaultLocation)
		
		tell application "Finder"
			set fDirHFS to (f's folder as text) --	(フォルダ)HFSパス
			set fDir to (POSIX path of fDirHFS) --(フォルダ) POSIXパス
			set fNameExt to (f's name as text) --	拡張子付きファイル名
		end tell
		
		set thePath to (fDir & LF & fNameExt)
		
	on error
		set thePath to "" --「(文字列の)返り値」を初期化
		display dialog "★ AppleScriptTask (getFilePath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
	end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
	
	return thePath -- display dialog thePath as text
	
end getFilePath



-- 選択した(複数)ファイルのパスを取得する(複数ファイルの選択可能)(パラメータ:初期表示フォルダ)
on getMultiFilePath(defaultLocation)
	set multiFile to true
	set promptStr to "ファイルの選択(複数ファイルの選択可能)" --	フォルダ選択時のプロンプト文字列
	set LF to (ASCII character (10)) --	区切り文字に LF を利用
	set isFirst to true --最初かどうか?
	try
		activate --アプリケーションを前面に移動する命令
		--「選択したファイルのエイリアス値」の List が返される
		set aliasList to (choose file with prompt promptStr default location defaultLocation multiple selections allowed multiFile)
		tell application "Finder"
			repeat with f in aliasList
				set fDirHFS to (f's folder as text) --		(フォルダ)HFSパス
				set fDir to (POSIX path of fDirHFS) --	(フォルダ)POSIXパス
				set fNameExt to (f's name as text) --		拡張子付きファイル名
				
				if (isFirst) then
					set thePaths to (fDir & LF & fNameExt)
					set isFirst to false
				else
					set thePaths to (thePaths & LF & fNameExt)
				end if
			end repeat
		end tell
	on error
		set thePaths to "" --「(文字列の)返り値」を初期化
		display dialog "★ AppleScriptTask (getMultiFilePath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
	end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
	
	return thePaths -- display dialog thePaths as string
end getMultiFilePath


AppleScript[01] Png01

 コピペ あるいは 入力 ミスチェックのため、上記画面のように スクリプト の コンパイル を行い 「AppleScriptの文法チェック」が可能です。

AppleScript[01] Png02

 上記画面のように ファイル の 保存 を行い、デスクトップ に "filePath.scpt" の名前で保存。(次画面を参照)

AppleScript[01] Png03

 「filePath.scpt」ウィンドウ内をスクロールすると、以下形式の「スクリプト ハンドラー(VBAの関数のようなもの)」が4つあるはずです。

 on myapplescripthandler(paramString)
   (スクリプト ハンドラーの中身のコード)
 end myapplescripthandler

 ・getFileListOfFolderExt(fileExtension)
 ・getFileListOfFolder(defaultLocation)
 ・getFilePath(defaultLocation)
 ・getMultiFilePath(defaultLocation)

 上記 太字部分が VBA から呼び出すときに指定する「ハンドラー」名。
 AppleScript コードを変更しても、先程行った「コンパイル」後に「保存」を行えば即反映!

"スクリプトエディタ.app" は [command]+[Q] 等で終了してください。

AppleScript[01] Png04

上記画面のように "Finder" 上で [shift]+[command]+[G] 押下して、

 ~/ライブラリ/Application Scripts/com.microsoft.Excel/ フォルダに移動。

 Excel 以外にも [Application Scripts]フォルダ内には com.microsoft.Word , com.microsoft.Powerpoint など「MS-Officeアプリ 毎の AppleScript を格納する専用フォルダ」が用意されている。
(Office for Mac 2016 以降の標準インストールで専用フォルダが作られるはずだが、無い場合は 命名規則に則りフォルダを作成後に格納)

AppleScript[01] Png05

 先程デスクトップに保存した "filePath.scpt" ファイルを com.microsoft.Excel フォルダ内にコピー。
Officeアプリ毎 正しいフォルダに AppleScript ファイルを格納しないと、各OfficeのVBAコードから呼び出しできないとのこと。 デスクトップ上の同ファイルはバックアップ用としてどこかに保存しておくことをオススメするが、削除しても構わない。

AppleScript[01] Png06

AppleScript[01] Png07

 フォルダ内の(指定した拡張子を持つ)全ファイル名を取得 

AppleScript[01] Png08

 フォルダ選択ダイアログを表示し全ファイル名を返すAppleScriptを実装。 testプロシージャがテスト用のVBAコード。 Excel2016 for Mac 以降 MacScript コマンドの代替となった AppleScriptTask コマンドの利用方法を以下で解説。

scriptParam = LCase("scpt") にて、対象ファイルを拡張子にて制限
  scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolderExt", scriptParam)

 ・第1引数は AppleScriptファイル名 で、 .applescript 拡張子は省略可(.scpt 拡張機能も利用可能)。
 ・第2引数は AppleScriptハンドラー名 で、 AppleScriptファイル内の「指定ハンドラー」を呼び出し
 ・第3引数は AppleScriptハンドラー に渡されるパラメータ(文字列)
 ・AppleScriptTask実行結果は、文字列で返される

 実行結果に「文字列の配列」が利用できないか試したが、 AppleScript 側は文字列とかの List を返せるが VBA側でエラーが出てNG。
AppleScript で共有フォルダ内にテキストファイルを書き出して VBA でテキストファイルを読み出すのが面倒だったので、文字列を「区切り文字」で区切って複数の結果を格納するよう実装。
Mac上で改行したように表示される LF = vbLf = Chr(10) を「区切り文字」として使用。 VBAでは Split関数 を利用して「文字列の配列」にパース。
list(0) には 指定フォルダ(ディレクトリ)の(POSIX)フルパスを格納し、list(1) 〜 list(n) には 「拡張子を除いたファイル名」を格納。
ダイアログでキャンセルボタンを押した場合やエラー時は、実行結果文字列に 空文字列 "" が返される。

AppleScript[01] Png09

 「イミディエイト ウィンドウ」にて call test() [return] と入力し test() プロシージャを実行すると、上記 フォルダ選択ダイアログ を表示。

AppleScript[01] Png10

 上記画面のように「イミディエイト ウィンドウ」に実行結果を表示。 フォルダ名やファイル名に日本語が含まれても正常に動作することを確認済み。

AppleScript[01] Png11


 フォルダ内の全ファイル名を取得 

AppleScript[01] Png12

 フォルダ選択ダイアログを表示し全ファイル名を返すAppleScriptを実装。 test2プロシージャがテスト用のVBAコード。

  scriptParam = "/Users/wito/" 初期表示フォルダを指定。 フォルダ(ディレクトリ)を表すパスは末尾に / が必要。
  scriptResult = AppleScriptTask("filePath.scpt", "getFileListOfFolder", scriptParam)

 ・第1引数は AppleScriptファイル名 で、 .applescript 拡張子は省略可(.scpt 拡張機能も利用可能)。
 ・第2引数は AppleScriptハンドラー名 で、 AppleScriptファイル内の「指定ハンドラー」を呼び出し
 ・第3引数は AppleScriptハンドラー に渡されるパラメータ(文字列)
 ・AppleScriptTask実行結果は、文字列で返される

 拡張子で制限しないため、指定フォルダ内の全ファイル名を拡張子付きで格納。
list(0) には 指定フォルダ(ディレクトリ)の(POSIX)フルパスを格納し、list(1) 〜 list(n) には 「拡張子を含めたファイル名」を格納。
ダイアログでキャンセルボタンを押した場合やエラー時は、実行結果文字列に 空文字列 "" が返される。

 「イミディエイト ウィンドウ」にて call test2() [return] と入力し test2() プロシージャを実行すると、前回と同じ フォルダ選択ダイアログ を表示。

AppleScript[01] Png13


 指定ファイルのフルパスを取得 

AppleScript[01] Png14

 ファイル選択ダイアログを表示し、フルパスを返すAppleScriptを実装。 test3プロシージャがテスト用のVBAコード。

  scriptParam = "/Users/wito/" 初期表示フォルダを指定。 フォルダ(ディレクトリ)を表すパスは末尾に / が必要。
  scriptResult = AppleScriptTask("filePath.scpt", "getFilePath", scriptParam)

 ・第1引数は AppleScriptファイル名 で、 .applescript 拡張子は省略可(.scpt 拡張機能も利用可能)。
 ・第2引数は AppleScriptハンドラー名 で、 AppleScriptファイル内の「指定ハンドラー」を呼び出し
 ・第3引数は AppleScriptハンドラー に渡されるパラメータ(文字列)
 ・AppleScriptTask実行結果は、文字列で返される

 list(0) には 指定ファイルのフォルダ(ディレクトリ)の(POSIX)フルパスを格納し、list(1) には 「拡張子を含めたファイル名」を格納。
ダイアログでキャンセルボタンを押した場合やエラー時は、実行結果文字列に 空文字列 "" が返される。

 「イミディエイト ウィンドウ」にて call test3() [return] と入力し test3() プロシージャを実行すると、 ファイル選択ダイアログ を表示。

AppleScript[01] Png18


 (複数)指定ファイルのフルパスを取得 

AppleScript[01] Png16

 (複数選択可能な)ファイル選択ダイアログを表示し、ファイル毎にフルパスを返すAppleScriptを実装。 test4プロシージャがテスト用のVBAコード。

  scriptParam = "/Users/wito/" 初期表示フォルダを指定。 フォルダ(ディレクトリ)を表すパスは末尾に / が必要。
  scriptResult = AppleScriptTask("filePath.scpt", "getMultiFilePath", scriptParam)

 ・第1引数は AppleScriptファイル名 で、 .applescript 拡張子は省略可(.scpt 拡張機能も利用可能)。
 ・第2引数は AppleScriptハンドラー名 で、 AppleScriptファイル内の「指定ハンドラー」を呼び出し
 ・第3引数は AppleScriptハンドラー に渡されるパラメータ(文字列)
 ・AppleScriptTask実行結果は、文字列で返される

 list(0) には 指定ファイルのフォルダ(ディレクトリ)の(POSIX)フルパスを格納し、list(1) 〜 list(n) には 「拡張子を含めたファイル名」を格納。
ダイアログでキャンセルボタンを押した場合やエラー時は、実行結果文字列に 空文字列 "" が返される。

 「イミディエイト ウィンドウ」にて call test4() [return] と入力し test4() プロシージャを実行すると、 ファイル選択ダイアログ を表示。

AppleScript[01] Png19


 [command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。


 1日2時間くらい1週間 AppleScript を勉強した成果として、今回の記事を書きました。 下記「ザリガニが見ていた...。」サイトで「拡張子を除いたファイル名」の取得方法を教えて頂き、感謝致します。 フォルダ名やファイル名に日本語が含まれていても最初から問題なく動作して、感激!
 AppleScript に関しては超初心者のため、コードが簡潔でなく かつ 実行速度無視 で申し訳ないです。 テストは結構しましたが、不具合があればコメント等で教えて頂けると嬉しいです。
 次はいつになるかわかりませんが、必要があれば AppleScript また書きますね。 "Finder"操作など Mac のOS周りの操作は何でもできそうですし...









Macブログ ランキング アイコン
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル
For follow LINE Reader Group!Subscribe to this blog on Feedly!

Next Post Previous Post
1 Comments
  • アタル
    アタル 2021年11月5日 23:02

    -- Copyright 2021- ataruchi. [ https://twitter.com/ataruchi ] with (Only Vanilla AppleScript)
    -- 「スクリプトエディタ.app」に以下の AppleScript を貼り付け後 [command]+[R] にて実行すると、
    --指定フォルダ内に含まれる全ファイル名のフルパスを取得して、クリップボードに格納します!
    --予め、6行めの extList に抽出ファイルの拡張子を設定すること


    ------------------------------------------------------------
    property LF : ASCII character (10) -- vbLf [MACosX~ を含むUnix系の改行コード] for Unix
    property CR : ASCII character (13) -- vbCr [~macOS9 の改行コード] for (OLD Mac)
    property CRLF : CR & LF -- vbCrLf [MS Windows系の改行コード] for Win10, Win7

    set the clipboard to {} --クリップボードの初期化
    set extList to {"xlsm", "xlsx", "pdf", "rtf", "txt"} --抽出ファイルの拡張子を設定後に、実行
    getPathListOfChildFoldersMultiExt(extList)



    on getPathListOfChildFoldersMultiExt(extList)
    try
    activate --ウィンドウの前面に表示!
    set theFolder to (choose folder) --選択フォルダのエイリアス値が返る

    --フォルダ階層(子フォルダ)対応のため、再帰ハンドラを呼び出し
    set stringList to {} -- 文字列リストを初期化
    foldersHierarchies(theFolder, extList, stringList) --Listは、参照(ポインタ)渡し

    if stringList = {} then
    activate
    display alert "エラー発生か、対象ファイルなし" as critical buttons {"OK"}
    return ""
    else
    set countFiles to ((count stringList) as string)
    end if

    set returnText to "" -- ハンドラ-の戻り値を初期化
    --Use {LF} for TextEditor
    set returnText to getTextWithDelimiters(stringList, {CRLF}) --Use for Excel's paste
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    set stringList to {} -- 文字列リストを初期化

    activate
    display alert ("抽出ファイル件数= " & countFiles) as informational buttons {"OK"}
    return returnText

    on error --エラー時の処理
    set stringList to {} -- 文字列リストを初期化
    activate
    display alert "エラー発生!" as critical buttons {"OK"}
    return ""
    end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
    end getPathListOfChildFoldersMultiExt



    on foldersHierarchies(parentDir, extList, stringList) --再帰 呼び出し ハンドラー
    try
    tell application "Finder"
    --フォルダ内のファイルListを取得(「フィルタ参照」にて、指定拡張子のみ抽出)
    set fileList to (every file of parentDir whose (name extension is in extList))

    repeat with f in fileList --全ファイルを繰り返し、処理
    set fPath to (POSIX path of (f as string)) --HFSパス経由でフルパスを取得
    set (end of stringList) to fPath --POSIXフルパスを追加
    end repeat -- stringList は参照渡しのため、変更(要素の追加)可能!

    set childDirList to (every folder of parentDir) --子フォルダのListを取得
    repeat with childDir in childDirList
    ----フォルダ階層(子フォルダ)対応のため、再帰 呼び出し
    my foldersHierarchies(childDir, extList, stringList)
    end repeat
    end tell -- application "Finder"

    on error --エラー時の処理
    set stringList to {} --文字列リストを初期化
    end try
    end foldersHierarchies



    --文字列リストを任意のデリミタ(通常は改行コード)付きで、テキストに変換
    on getTextWithDelimiters(stringList, withDelimiters)
    try
    set returnText to "" --ハンドラーの戻り値を初期化

    set currentDelimiters to (AppleScript's text item delimiters) --デフォルトのデリミタを保存
    set (AppleScript's text item delimiters) to withDelimiters --デリミタを変更

    set returnText to (stringList as string) --デリミタ付きテキストに変換 Not as text!

    set (AppleScript's text item delimiters) to currentDelimiters --デフォルトのデリミタに戻す

    return returnText

    on error --エラー時の処理
    set (AppleScript's text item delimiters) to currentDelimiters --デフォルトのデリミタに戻す
    set stringList to {} -- 文字列リストを初期化
    return ""
    end try
    end getTextWithDelimiters
    ------------------------------------------------------------

Add Comment
comment url