Cocoa AppleScript ファイルから UTI 取得 Open/Saveダイアログの改良 AppleScript [06]

鉛筆アイコン  🔄   💬 3

AppleScriptTask

t f B! P L
AppleScript[06](CatchImage)

AppleScript [06] Cocoa AppleScript 第2版 ファイルから UTI 取得、Open/Save ファイルダイアログの改良!
 Macの OpenFile 選択用ダイアログは 拡張子ではなく厳密には UTI指定 ( 4 UTIまで動作確認済み)のため、 xlsx や xlsm など拡張子指定が無効な時あり →常にUTI指定すれば問題なし!
 ファイルから UTI (Uniform Type Identifier) 取得は簡単なので、調査用の Vanilla AS ハンドラーを追加して、VBAから呼び出し可能に!
 VBAの SaveFileName 用ダイアログも Macでは 拡張子指定できないため、指定拡張子以外を選んだ場合は再度ダイアログを表示する等 Open/Save ファイルダイアログを 改良!

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

 2021/09/26   Ver. 3.1「Cocoa AppleScript 第2版」に改良!
→ AppleScript は "filePath.scpt" ファイル内のコード全て「差し替え」、VBAコードは「追加(一部は差し替え)」となります。(インターフェースの追加と、コメントやサンプルコードの修正)


 2021/11/07   "UniformTypeIdentifiers" 新フレームワークの利用方法が判明!
→ macOS11[Big Sur]以降限定となるが、use framework "UniformTypeIdentifiers" の UTType クラスにて...
 コメント(3つめ)に、Cocoa AppleScript (ASOC) 拡張子 or MIME から UTI を取得するサンプルコードを掲載。




 【AppleScriptの差し替え】 AppleScript [06] Cocoa AppleScript 第2版 ファイルから UTI 取得、Open/Save ファイルダイアログの改良! 

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


 VBA の AppleScriptTask コマンド パラメータの注意点 

  ファイルパスと区別するため フォルダパス指定には 末尾に必ず / を付加 してください! フォルダフルパス なら 先頭と末尾が必ず / となります。
 OneDriveiCloudDropboxBox 等のサービスをブラウザ利用でなくフォルダにリンクしている場合も(リンク)パスが判れば指定可能ですが、https:// が先頭に付いたり ネットワーク経由のアクセスのためとんでも無く時間がかかりますので ローカルPC(Mac本体内の高速なSSDやHDDドライブ)上のフォルダパスを指定してください。


 第2版 Cocoa AppleScript コードの全置換(一部はVanilla AS記述) 

(1)  以前に  作成したExcelファイルをマクロを有効にして開き、続いて VBEウィンドウ を開く。

(2) ~/ライブラリ/Application Scripts/com.microsoft.Excel/ フォルダ内に保存した filePath.scpt をダブルクリック等で("スクリプトエディタ"アプリにて)開き、 ファイル内の全AppleScriptコードを以下のコードで置換し、 コンパイル後に ファイルを保存 したら "スクリプトエディタ"アプリは終了してください。

 上記の操作方法がよく解らない方は、  以前の投稿  をお読みください。

 VBA、AppleScript 両方のコードに コメントをたくさん記述しておいたので、宜しければ ご覧ください!

 2021/09/26   Ver. 3.1「Cocoa AppleScript 第2版」に改良!
→ AppleScript は "filePath.scpt" ファイル内のコード全て「差し替え」、VBAコードは「追加(一部は差し替え)」となります。(インターフェースの追加と、コメントやサンプルコードの修正)

 全置換となるため 以下の全AppleScriptコードを コピー&ペースト(貼り付け)後、 コンパイル後に ファイルを保存 してください。 VBAコード に関しては「次章」に記載します。

 書くのを忘れていましたが、 AppleScript 40行目の「 property HIDDEN_FILES : true 」の true を fasle に置換して コンパイル後に ファイルを保存 すると、フォルダ階層(子フォルダ)に対応したパスやファイル名を返す AppleScriptTask の場合、 隠しファイルも表示 されるようになります。 確認後は、 true に戻すことをオススメします!


--filePath.scpt Ver.3.1  Copyright 2021- ataruchi. [ https://twitter.com/ataruchi ]
--   AppleScript を学んで1.5ヶ月の作者が実装したため、問題があれば教えて頂けると助かります。
--   著作権は放棄していませんが、ご自由に 利用・改造して頂いて構いません
--   なお 不都合等ありましても、作者は 何の補償も致しかねます。 ご注意ください!
--    1行めの「スクリプトの著作権表示部分」を削除することはできません。
--    また、改造したことが分かるよう 改造者へのリンクを表示するようにしてください。
--2021/08/26 Ver.1.0 全ハンドラーにて、実行結果テキストを クリップボードにも 保存(Excel対応)
--2021/08/31 Ver.1.1 「フィルタ参照による指定拡張子の抽出」版に変更
--2021/09/08 Ver.2.0 Vanilla AppleScript 最終版 → 文字列連結を止め、「文字列リストに要素(1行分の文字列)を追加」版に書き替え
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応 初版 ("NSFileManager","NSMutableArray" 利用の実装)
--    「2度のソート等を含めた実装でも、Vanilla AS "Finder" 利用の実装と比べて 10倍は高速!」
--  Cocoa AppleScript ハンドラーの基本部分は、Piyomaru Software さん 以下記事の「独自実装」版となります!
--  http://piyocast.com/as/archives/1660    "Finder" と同等のソート(並び)順で取得できるよう改良+機能追加。
--  (Cocoa AppleScript の書き方を示して頂いた)著者の Takaaki Naganoya さんに感謝いたします。
--2021/09/26 Ver.3.1 Cocoa AppleScript 対応 第2版 (利便性のため、以下5ハンドラーを追加) getFolderPath()
--      getMultiFolderPath() checkFilePath() checkDirPath()  getUtiByChooseFile()

use AppleScript version "2.4" --  macOS10.10 [Yosemite] ~
use scripting additions --    use OSAX
use framework "Foundation" --  use AppleScriptObjC (ASOC) == Cocoa AppleScript

--NSObjectを最上位とする以下NSオブジェクトは Cocoa 用のオブジェクトで、Objective-C で実装されている!
property |NSURL| : a reference to current application's |NSURL| --SubDir内を除外したDir内の列挙時に利用
property NSString : a reference to current application's NSString --dirPath, fileName, ext 取得可
property NSPredicate : a reference to current application's NSPredicate --正規表現 Esc処理に一部問題あり
property NSEnumerator : a reference to current application's NSEnumerator --列挙用
property NSFileManager : a reference to current application's NSFileManager --"Finder" の代替Obj
property NSMutableArray : a reference to current application's NSMutableArray --変更可能な Array
property NSDirectoryEnumerationSkipsSubdirectoryDescendants : a reference to current application's NSDirectoryEnumerationSkipsSubdirectoryDescendants --Skip SubDir's (File or Dir)
property NSDirectoryEnumerationSkipsPackageDescendants : a reference to current application's NSDirectoryEnumerationSkipsPackageDescendants --Skip Package. ex) "Microsoft Excel.app"
property NSDirectoryEnumerationSkipsHiddenFiles : a reference to current application's NSDirectoryEnumerationSkipsHiddenFiles --Skip HiddenFiles for Enumeration

-- (global) 定数の宣言
property LF : ASCII character (10) -- vbLf [macOS10~ を含むUnix系の改行コード] for Unix
property CR : ASCII character (13) -- vbCr [~Macintosh System9 の改行コード] for (OLD Mac)
property CRLF : CR & LF -- vbCrLf [MS Windows系の改行コード] for Win10, Win7
--  Excel対応のクリップボードに 区切り文字 vbCrLf を利用する理由
--  Excelでは「セル内の改行コードとしてvbLf」が用いられているため、
--  「改行コードとしてvbCrLf」を挟まないと [command]+[V]失敗!
property HIDDEN_FILES : true --「隠しファイル&フォルダ」無効(除外する) false 有効(除外しない)



--for Debug
test()

on test()
  -- Test AppleScript Handler example --
  set the clipboard to {} --クリップボードの初期化
  --set paramStr to "★プロンプト文字列 Test★" & LF & (POSIX path of (path to home folder)) & LF & "css" & LF & "html" & LF & "txt" & LF & "scpt" & LF & "xml" & LF & "png"
  --ファイル名に対し、正規表現で抽出:「末尾が .css 又は .js で、light の文字列を含む」
  set paramStr to "" & LF & "" & LF & "(.*light.*\\.(css|js)+$)"
  getFileListOfChildFoldersByRegExp(paramStr)
end test



--文字列リストを任意のデリミタ(通常は改行コード)付きで、テキストに変換
on getTextWithDelimiters(stringList, withDelimiters)
  
  set returnText to "" --ハンドラーの戻り値を初期化
  
  try
    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!
    
    (*
    -- http://www.script-factory.net/monologue/FastDataOperation/index.xhtml
    --全要素へ高速なアクセスを行う方法(テキスト処理への応用: paragraphs要素を利用して、
    script list_wrapper --スクリプトオブジェクトのpropertyのリストにアクセス)
      property paragList : paragraphs of returnText
    end script
    repeat with parag in paragList of list_wrapper
      --display dialog (get contents of parag)
    end repeat
    *)
    
    set (AppleScript's text item delimiters) to currentDelimiters --デフォルトのデリミタに戻す
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to currentDelimiters --デフォルトのデリミタに戻す
    display dialog "★ getTextWithDelimiters ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try
  
  return returnText --display dialog returnText
  
end getTextWithDelimiters



--("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加
-- 実行結果  [NSMutableArray] (子フォルダを含む)ファイルのフルパス
on retSortedArrayLikeFinderWithSortKey(theFolder)
  try
    --PreSort & 先頭にSortKey6桁追加後、計2回ソートして Finder利用時のソート順を獲得
    set myFM to NSFileManager's defaultManager() --Use for myFM's ~
    set preArray to NSMutableArray's array() --PreSort前用A => removeAll
    set psArray to NSMutableArray's array() --PreSort後用B => removeAll 失敗
    set theArray to NSMutableArray's array() --先頭に、SortKey6桁追加 => removeAll
    set childArray to NSMutableArray's array() --子(+親)フォルダのフルパスを「逆順Descending」格納
    set sArray to NSMutableArray's array() --Sorted anArray  => removeAll 失敗
    
    
    --[0] パラメータのチェック(フォルダが有効かどうか?)
    set isDir to false --フォルダ?
    set validPath to false --(File or Folder)パスが有効か?
    --(reference) isDir ポインタ(参照)渡しで、値が返る
    set {validPath, isDir} to (myFM's fileExistsAtPath:theFolder isDirectory:(reference))
    if (validPath as boolean) then
      set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
    else
      error --パスが無効な場合
    end if
    if (not isDir) then --(not DirPath) == FilePath
      set tmpNSString to NSString's stringWithString:theFolder --NSString_obj を生成
      set theFolder to ((tmpNSString's stringByDeletingLastPathComponent() as string) & "/")
    end if
    
    
    --[1] サブフォルダを含む「ファイルorフォルダのフルパス」を取得 (並び順不定)
    childArray's addObject:theFolder --まず、親フォルダのフルパスを追加(要素番号 0 )
    set thePath to NSString's stringWithString:theFolder --NSString オブジェクトを生成
    set dirEnum to myFM's enumeratorAtPath:thePath --子(Sub)Dir内も含めて(File/Folder)が列挙される
    
    --  NSFileManager's enumeratorAtPath  ->  preArray
    repeat --列挙子利用で、指定ディレクトリ内の全パスを取得  子(サブ)フォルダ対応で再帰取得 
      set pathObj to (dirEnum's nextObject()) --NSEnumerator next(並び順不定=>PreSort必要)
      if (pathObj = missing value) then exit repeat --再帰の終了条件(=NULL =nil)
      set aFullPath to thePath's stringByAppendingPathComponent:pathObj --Dirパス時あり
      preArray's addObject:(aFullPath) --ファイルorフォルダのフルパスを、要素として追加
    end repeat
    
    
    --[2] (並び順不定)のため、「ファイルorフォルダのフルパス」でソート (PreSort)
    --  preArray  ->  psArray  (少なくとも、ファイル名に関してはソート有効)
    --PreSort like "Finder"  preArray  =>  psArray  by "localizedStandardCompare:"
    --  from sortedArrayUsingSelector:"localizedCaseInsensitiveCompare:"
    set psArray to preArray's sortedArrayUsingSelector:"localizedStandardCompare:"
    
    preArray's removeAllObjects() --preArray 全要素削除
    
    
    --[3] 次STEPの[4]で「ファイルパスのフォルダ部分のみ」でソートできるよう、先頭にSortKey6桁追加
    --  psArray  ->  theArray  ①フォルダフルパスはchildArrayの先頭に挿入のみで、theArray除外
    --   ②「隠しファイル&フォルダ」対応←当ファイル先頭部分の HIDDEN_FILES で除外/対象を指定
    set isDir to true --フォルダ?
    set validPath to false --(File or Folder)パスが有効か?
    
    --指定ディレクトリのファイルのみを抽出   (再帰的 子(サブ)フォルダ対応)
    repeat with pathObj in psArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      --display dialog (pathObj as string) --for Debug
      set aFullPath to pathObj --NSString オブジェクト
      --(reference) isDir ポインタ(参照)渡しで値が返る
      set {validPath, isDir} to (myFM's fileExistsAtPath:aFullPath isDirectory:(reference))
      if (validPath as boolean) then
        set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
      else
        error --パスが無効な場合
      end if
      
      if isDir then --パスが Dir を示す場合(子フォルダ)
        if HIDDEN_FILES then --隠しファイル&フォルダ無効(除外時)
          -- .(ピリオド) で始まる「隠しフォルダ」を除外する
          if (aFullPath as string) does not contain "/." then -- /. が含まれないか?
            (childArray's insertObject:((aFullPath as string) & "/") atIndex:0)
            --Arrayの先頭要素として追加(先頭に挿入)--逆順に処理した方が早く見つかる
            --子フォルダのフルパスを追加(要素番号 0 )--for sortKey 降順(Descending)格納
          end if
        else --隠しファイル&フォルダ有効(除外しない)
          (childArray's insertObject:((aFullPath as string) & "/") atIndex:0)
          --Arrayの先頭要素として追加(先頭に挿入)--逆順に処理した方が早く見つかる
          --子フォルダのフルパスを追加(要素番号 0 )--for sortKey 降順(Descending)格納
        end if
        
        
      else --パスが File を示す場合 [注] 6桁数字 -> 約100万サブ・フォルダまで正しくソート可
        set newDirPath to (aFullPath's stringByDeletingLastPathComponent() as string) & "/"
        set sortKey to ""
        set sortKeyNum to (childArray's |count|()) --逆順で検索した方が早く見つかる
        repeat with pathObj in childArray --childArray は 降順(Descending)格納
          if ((pathObj as string) = newDirPath) then
            --数値の書式化(前Zero挿入した6桁数字) 6桁数字なら、5文字の"0"を連結
            set sortKey to (text -6 thru -1 of ("00000" & sortKeyNum))
            exit repeat
          end if
          set sortKeyNum to (sortKeyNum - 1) as integer --逆順に処理した方が早く見つかる
        end repeat
        if (sortKeyNum < 1) then --if (sortKeyNum = 0)
          set sortKey to "000000" --隠しファイル&フォルダ無効(除外時)対応
        end if
        
        --ファイルパスの先頭に、sortKey 6桁数字 を追加
        set sortStr to (sortKey & (aFullPath as string))
        set sortPath to (NSString's stringWithString:sortStr) --NSString 生成
        if HIDDEN_FILES then --隠しファイル無効(除外する)
          -- .(ピリオド) で始まる「隠しファイル&フォルダ」を除外する
          if sortKeyNum > 0 then
            if (sortPath as string) does not contain "/." then -- /. が含まれないか?
              (theArray's addObject:sortPath) --ファイルフルパスを、要素として追加
            end if
          end if
        else --「隠しファイル&フォルダ有効」(除外しない)
          if sortKeyNum > 0 then
            (theArray's addObject:sortPath) --ファイルフルパスを、要素として追加
          end if
        end if
        
        
      end if
    end repeat
    
    
    --psArray's removeAllObjects() --psArray 全要素削除    実行時エラーで、削除できず
    --return childArray as list --for Debug
    --return theArray as list --for Debug
    childArray's removeAllObjects() --childArray 全要素削除
    
    
    --[4] 「先頭のSortKey6桁」を利用し、「ファイルパスのフォルダ部分のみ」でソート
    --  theArray  ->  sArray  「ファイルフルパス」ソートのみだと、同一フォルダが複数回出現する可能性
    --Sort like "Finder"  theArray  =>  sArray  by "localizedStandardCompare:"
    --  from sortedArrayUsingSelector:"localizedCaseInsensitiveCompare:"
    -- sortKey6桁を追加してSORTしないと、同一フォルダ内のファイルパスが一塊にならない
    set sArray to theArray's sortedArrayUsingSelector:"localizedStandardCompare:"
    
    theArray's removeAllObjects() --theArray 全要素削除
    
    
    return sArray --as list --先頭に「SortKey6桁」を付加した NSMutableArray を return
    
  on error
    display dialog "★ retSortedArrayLikeFinderWithSortKey ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return sArray --as list
  end try
  
end retSortedArrayLikeFinderWithSortKey



--親フォルダ内のファイルのみを抽出するため、ソート1回のみ(SortKey6桁を付加する必要なし)
-- 実行結果[NSMutableArray] (子フォルダを含まない)ファイルのフルパス
on retSortedArrayNotRecursive(theFolder)
  try
    set myFM to NSFileManager's defaultManager() --Use for myFM's ~
    
    --PreSort & 先頭にSortKey6桁追加後、計2回ソートにて Finder利用時のソート順を獲得
    set preArray to NSMutableArray's array() --Sort前用Array => removeAll
    set sArray to NSMutableArray's array() --Sorted preArray  => removeAll 失敗
    set thePath to NSString's stringWithString:theFolder --NSString オブジェクトを生成
    --set dirEnum to myFM's enumeratorAtPath:thePath --子(Sub)Dir内も含めて(File/Folder)が列挙される
    
    
    --[1] サブフォルダを含めない「ファイルorフォルダのフルパス」を取得 (並び順不定)
    --  NSFileManager's enumeratorAtURL  ->  preArray ( |NSURL|は POSIX path も対象)
    set isDir to false --フォルダ?
    set validPath to false --(File or Folder)パスが有効か?
    
    --(reference) isDir ポインタ(参照)渡しで、値が返る
    set {validPath, isDir} to (myFM's fileExistsAtPath:theFolder isDirectory:(reference))
    if (validPath as boolean) then
      set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
    else
      error --パスが無効な場合
    end if
    if (not isDir) then --(not DirPath) == FilePath
      set tmpNSString to NSString's stringWithString:theFolder --NSString_obj を生成
      set theFolder to (tmpNSString's stringByDeletingLastPathComponent() as string) & "/"
    end if
    
    
    set theURL to |NSURL|'s fileURLWithPath:theFolder --POSIX path => |NSURL|
    --Skip SubDir's (files or folders)! 子フォルダ(内のファイル/フォルダ)を無視する
    set theOptions to (NSDirectoryEnumerationSkipsSubdirectoryDescendants as integer)
    if HIDDEN_FILES then --SkipsHiddenFiles + SkipsPackage
      set theOptions to (theOptions + (NSDirectoryEnumerationSkipsHiddenFiles as integer) + (NSDirectoryEnumerationSkipsPackageDescendants as integer))
    end if
    
    --set urlArray to myFM's contentsOfDirectoryAtURL:theURL includingPropertiesForKeys:{} options:theOptions |error|:(missing value) --theOptionsを満たす Array を生成
    set dirEnumerator to myFM's enumeratorAtURL:theURL includingPropertiesForKeys:{} options:theOptions errorHandler:(missing value) --theOptionsを満たす[列挙子]を作成
    repeat
      set fileURL to (dirEnumerator's nextObject()) --列挙 next
      if fileURL = missing value then exit repeat --列挙 終了条件
      
      set isDir to false --フォルダ?
      set validPath to false --(File or Folder)パスが有効か?
      set fileUrlPath to POSIX path of (fileURL as string)
      --(reference) isDir ポインタ(参照)渡しで、値が返る
      set {validPath, isDir} to (myFM's fileExistsAtPath:fileUrlPath isDirectory:(reference))
      if (validPath as boolean) then
        set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
      else
        error --列挙のため、(file or dir) 必ず存在するはず
      end if
      
      if isDir then --パスが Dir を示す場合(子フォルダ)
        --無条件、除外する
      else --パスが File を示す場合
        preArray's addObject:(fileUrlPath) --ファイルのフルパスを、要素として追加
      end if
      
    end repeat --列挙
    
    
    --[2] (並び順不定)のため、「ファイルのフルパス」でソート (PreSort)
    --  preArray  ->  sArray
    --PreSort like "Finder"  preArray  =>  sArray  by "localizedStandardCompare:"
    --  from sortedArrayUsingSelector:"localizedCaseInsensitiveCompare:"
    set sArray to preArray's sortedArrayUsingSelector:"localizedStandardCompare:"
    
    preArray's removeAllObjects() --preArray 全要素削除
    
    return sArray --as list --NSMutableArray を return
    
  on error
    display dialog "★ retSortedArrayNotRecursive ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return sArray --as list --NSMutableArray を return
  end try
  
end retSortedArrayNotRecursive



--指定フォルダ以下のすべてのファイルを再帰で取得(文字列&拡張子 絞り込み なし)
-- 実行結果[List] (子フォルダを含む)フォルダのフルパス あるいは (拡張子を含めた)ファイル名
on retFileNameWithinAFolderWithRecursive(theFolder)
  
  set aArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] ①「先頭のSortKey6桁」を削除  ②「フォルダパス」+「拡張子を含むファイル名」に分割
    --  sArray  ->  aArray  [注] return aArray as list(NSMutableArray を List にキャスト)
    --set sArrayEnum to sArray's objectEnumerator() --enumerate for sArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in sArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (aArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      (aArray's addObject:(tempObj's lastPathComponent()))
    end repeat
    
    --sArray's removeAllObjects() --aArray が sArray に依存? 削除できず
    
    return aArray as list --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFileNameWithinAFolderWithRecursive ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return aArray as list
  end try
  
end retFileNameWithinAFolderWithRecursive



--指定フォルダ以下のすべてのファイルフルパスを再帰で取得(文字列&拡張子 絞り込み なし)
-- 実行結果[List] (子フォルダを含む)ファイルのフルパス
on retFullPathWithinAFolderWithRecursive(theFolder)
  
  set aArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] ①「先頭のSortKey6桁」を削除  ②ファイルのフルパスを aArray に追加
    --  sArray  ->  aArray  [注] return aArray as list(NSMutableArray を List にキャスト)
    --set sArrayEnum to sArray's objectEnumerator() --enumerate for sArray 列挙子
    repeat with fileObj in sArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      --set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --ファイルのフルパスを、要素として追加
      (aArray's addObject:tempPath)
      
    end repeat
    
    --sArray's removeAllObjects() --aArray が sArray に依存? 削除できず
    
    return aArray as list --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFullPathWithinAFolderWithRecursive ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return aArray as list
  end try
  
end retFullPathWithinAFolderWithRecursive



--指定フォルダ以下のすべてのファイルを再帰で取得(拡張子1つのみで 絞り込み)
-- 実行結果[List] (子フォルダを含む)フォルダのフルパス あるいは (拡張子なしの)ファイル名
on retFileNameWithinAFolderWithRecursiveFilterByExt(theFolder, theExt)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray    "pathExtension == theExt"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension == [c]%@" argumentArray:{theExt}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    
    --[2] ①「先頭のSortKey6桁」を削除  ②「フォルダパス」+「拡張子を含むファイル名」に分割
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set bArrayEnum to bArray's objectEnumerator() --enumerate for bArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (bArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      --(bArray's addObject:(tempObj's lastPathComponent() as string))
      --(拡張子を含めない)ファイル名を、要素として追加
      (bArray's addObject:(tempObj's lastPathComponent()'s stringByDeletingPathExtension()))
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFileNameWithinAFolderWithRecursiveFilterByExt ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFileNameWithinAFolderWithRecursiveFilterByExt



--指定フォルダ以下のすべてのファイルを再帰で取得(拡張子1つのみで 絞り込み)
-- 実行結果[List] ファイルのフルパス
on retFullPathWithinAFolderWithRecursiveFilterByExt(theFolder, theExt)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray    "pathExtension == theExt"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension == [c]%@" argumentArray:{theExt}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    --[2] ①「先頭のSortKey6桁」を削除  ②ファイルのフルパスを aArray に追加
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set aArrayEnum to aArray's objectEnumerator() --enumerate for aArray 列挙子
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      set tempPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      set tempPath to (tempPath & tempObj's lastPathComponent()'s stringByDeletingPathExtension() as string)
      
      --ファイルの(拡張子を削除した)フルパスを、要素として追加
      (bArray's addObject:tempPath)
      
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFullPathWithinAFolderWithRecursiveFilterByExt ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFullPathWithinAFolderWithRecursiveFilterByExt



--指定フォルダ以下のすべてのファイルを再帰で取得(拡張子リストで絞り込み)
on retFileNameWithinAFolderWithRecursiveFilterByExtList(theFolder, extList)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray    "pathExtension IN extList"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@" argumentArray:{extList}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    
    --[2] ①「先頭のSortKey6桁」を削除  ②「フォルダパス」+「拡張子を含むファイル名」に分割
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set bArrayEnum to bArray's objectEnumerator() --enumerate for bArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (bArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      (bArray's addObject:(tempObj's lastPathComponent()))
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ AppleScriptTask retFileNameWithinAFolderWithRecursiveFilterByExtList ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFileNameWithinAFolderWithRecursiveFilterByExtList



--指定フォルダ以下のすべてのファイルを再帰で取得(拡張子リストで絞り込み)
on retFullPathWithinAFolderWithRecursiveFilterByExtList(theFolder, extList)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray    "pathExtension IN extList"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@" argumentArray:{extList}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    --[2] ①「先頭のSortKey6桁」を削除  ②ファイルのフルパスを aArray に追加
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set aArrayEnum to aArray's objectEnumerator() --enumerate for aArray 列挙子
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      --set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --ファイルのフルパスを、要素として追加
      (bArray's addObject:tempPath)
      
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ AppleScriptTask retFullPathWithinAFolderWithRecursiveFilterByExtList ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFullPathWithinAFolderWithRecursiveFilterByExtList



--指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子で絞り込み)ファイル名が theKey を含む
on retFileNameWithinAFolderWithRecursiveFilterByExtAndFileNameString(theFolder, theExt, theKey)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray  "pathExtension == theExt" and "fileNameExt == *theKey*"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension == [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{theExt, theKey}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    
    --[2] ①「先頭のSortKey6桁」を削除  ②「フォルダパス」+「拡張子を含むファイル名」に分割
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set bArrayEnum to bArray's objectEnumerator() --enumerate for bArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (bArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      (bArray's addObject:(tempObj's lastPathComponent()))
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFileNameWithinAFolderWithRecursiveFilterByExtAndFileNameString ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFileNameWithinAFolderWithRecursiveFilterByExtAndFileNameString



--指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子で絞り込み)ファイル名が theKey を含む
on retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString(theFolder, theExt, theKey)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray  "pathExtension == theExt" and "fileNameExt == *theKey*"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension == [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{theExt, theKey}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    --[2] ①「先頭のSortKey6桁」を削除  ②ファイルのフルパスを aArray に追加
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set aArrayEnum to aArray's objectEnumerator() --enumerate for aArray 列挙子
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      --set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --ファイルのフルパスを、要素として追加
      (bArray's addObject:tempPath)
      
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFullPathWithinAFolderWithRecursiveFilterByExtAndFileNameString



---指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子リストで絞り込み)ファイル名が theKey を含む
on retFileNameWithinAFolderWithRecursiveFilterByExtListAndFileNameString(theFolder, extList, theKey)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray  "pathExtension IN extList" and "fileNameExt == *theKey*"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{extList, theKey}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    
    --[2] ①「先頭のSortKey6桁」を削除  ②「フォルダパス」+「拡張子を含むファイル名」に分割
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set bArrayEnum to bArray's objectEnumerator() --enumerate for bArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (bArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      (bArray's addObject:(tempObj's lastPathComponent()))
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFileNameWithinAFolderWithRecursiveFilterByExtListAndFileNameString ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFileNameWithinAFolderWithRecursiveFilterByExtListAndFileNameString



---指定フォルダ以下のすべてのファイルを再帰で取得(文字列と拡張子リストで絞り込み)ファイル名が theKey を含む
on retFullPathWithinAFolderWithRecursiveFilterByExtListAndFileNameString(theFolder, extList, theKey)
  
  set aArray to NSMutableArray's array() --FileFullPath 全要素削除すると、エラー発生(sArrayが依存?)
  set bArray to NSMutableArray's array() --FileFullPath => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] sArray 拡張子指定 => aArray  "pathExtension IN extList" and "fileNameExt == *theKey*"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{extList, theKey}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    --return (aArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    
    --[2] ①「先頭のSortKey6桁」を削除  ②ファイルのフルパスを aArray に追加
    --  aArray  ->  bArray  [注] return bArray as list(NSMutableArray を List にキャスト)
    --set aArrayEnum to aArray's objectEnumerator() --enumerate for aArray 列挙子
    repeat with fileObj in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      --set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --ファイルのフルパスを、要素として追加
      (bArray's addObject:tempPath)
      
    end repeat
    
    --return (bArray as list) --for Debug
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return (bArray as list) --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFullPathWithinAFolderWithRecursiveFilterByExtListAndFileNameString ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFullPathWithinAFolderWithRecursiveFilterByExtListAndFileNameString



--指定フォルダ以下のすべてのファイルを再帰で取得(ファイル名に対し「正規表現」を利用して、絞り込み)
-- 実行結果[List] (子フォルダを含む)フォルダのフルパス あるいは (拡張子ありの)ファイル名
-- (注)  最終結果を正規表現で単純抽出のため、該当ファイルZEROでも フォルダフルパスのみの行が出来てしまう
--    つまり、ファイル無しでフォルダフルパスの行のみが出来る場合があるため、呼び出し側で除外して頂きたい!
on retFileNameWithinAFolderWithRecursiveFilterByRegExp(theFolder, theRegExp)
  
  set aArray to NSMutableArray's array() --FolderFullPath or FileNameExt
  set bArray to NSMutableArray's array() --FolderFullPath or FileNameExt => Return as list
  
  --("Finder"相当の並び順を得るため)ファイルフルパスの先頭に「SortKey6桁」を付加 [注]ソート済み
  -- 実行結果[NSMutableArray] (子フォルダを含む)ファイルのフルパス
  set sArray to my retSortedArrayLikeFinderWithSortKey(theFolder)
  
  try
    --[1] ①「先頭のSortKey6桁」を削除  ②ファイルフルパス
    --  sArray  ->  aArray  [注] return aArray as list(NSMutableArray を List にキャスト)
    --set sArrayEnum to sArray's objectEnumerator() --enumerate for sArray 列挙子
    set oldDirPath to "" --フォルダパスが変更されたか?
    
    repeat with fileObj in sArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      set aFullPath to (fileObj as string)
      
      set tempPath to text 7 thru -1 of (aFullPath as string) --sortKey 6桁数字部分を削除
      set tempObj to (NSString's stringWithString:tempPath) --NSString 生成
      
      --取得したFolderPathの末尾に / が無いため、付加 (POSIX PATHルール)
      set newDirPath to ((tempObj's stringByDeletingLastPathComponent() as string) & "/")
      
      if (newDirPath ≠ oldDirPath) then
        (aArray's addObject:newDirPath) --フォルダパスを、要素として追加
        set oldDirPath to newDirPath
      end if
      --(拡張子を含めた)ファイル名を、要素として追加
      (aArray's addObject:(tempObj's lastPathComponent()))
    end repeat
    
    
    --sArray's removeAllObjects() --aArray が sArray に依存? 削除できず
    
    
    --[2] aArray 正規表現で抽出 => bArray    "SELF MATCHES '正規表現文字列'"
    --末尾が / で終わるPOSIX PATHは Dir を示しているため、対象とする => (.*/+$) OR条件付加!
    --[注]エスケープシーケンスのため「 . ピリオド」は 通常 \\. 表記ですが、
    --predicateWithFormatメソッドに問題があるため \\\\. つまり\4つ連続でないとエラー時あり!
    --set theRegExp to "(^(?!\\\\.).*$)" --「 . ピリオド」で始まる「隠しファイル」を除外
    --set theRegExp to "(^(a).*\\.(css|js)+$)" --先頭 a で「末尾が .css 又は .js」
    --set theRegExp to "(.*light.*\\.(css|js)+$)" --ファイル名に light を含む.css又は.js
    
    --Dirを示すパスは無条件対象とするため、OR条件で (.*/+$) を付加
    --パラメータの theRegExp は(上記サンプルのように)グループ化のため、前後を括弧で閉じて下さい
    set regExpStr to (quoted form of ("(.*/+$)|" & theRegExp)) --最後に ' で囲む
    set thePred to NSPredicate's predicateWithFormat:("SELF MATCHES " & regExpStr)
    set bArray to aArray's filteredArrayUsingPredicate:thePred --コンストラクタ
    
    
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    
    return bArray as list --最終格納結果の NSMutableArray を List にキャストして、return
    
  on error
    display dialog "★ retFileNameWithinAFolderWithRecursiveFilterByRegExp ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
    return bArray as list
  end try
  
end retFileNameWithinAFolderWithRecursiveFilterByRegExp



--選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
--    POSIXフルパス指定のため、先頭と末尾に / が必要  ex) "/Users/username/Downloads/"
-- 実行結果[0~n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfChildFolders(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、「paramList=拡張子文字列のList」
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFileNameWithinAFolderWithRecursive(theFolderPath, paramList)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfChildFolders) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfChildFolders



--選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   ファイル拡張子:"css"のように1つだけ指定指定(2つめ以降は無視)
-- 実行結果[0~n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子なしの)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfChildFoldersByExt(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、「paramList=拡張子文字列のList」
    
    if (count paramList) > 0 then --ファイル拡張子:"css"のように1つだけ指定指定(2つめ以降は無視)
      set extStr to ((first item of paramList) as string)
    else
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --return returnText(拡張子指定がない場合)
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFileNameWithinAFolderWithRecursiveFilterByExt(theFolderPath, extStr)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfChildFoldersByExt) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfChildFoldersByExt



--選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3~n]  ファイル拡張子:"html" "css"のように複数指定可(1つでもOK)
-- 実行結果[0~n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfChildFoldersByExts(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、「paramList=拡張子文字列のList」
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFileNameWithinAFolderWithRecursiveFilterByExtList(theFolderPath, paramList)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfChildFoldersByExts) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfChildFoldersByExts



--選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   keyString [fileNameExt contains keyString]  ファイル名が keyStr を含む
-- パラメータ[4~n]  ファイル拡張子:"html" "css"のように複数指定可(1つでもOK)
-- 実行結果[0~n] (子フォルダを含む)フォルダのフルパス あるいは ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfChildFoldersByExtsAndKey(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、3番目の要素は key文字列 [fileNameExt contains keyStr]
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --key文字列が有効でない場合
    end if
    set keyStr to ((first item of paramList) as string)
    if keyStr = "" then --「ファイル名」に含まれるkey文字列 [fileNameExt contains keyStr]
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --key文字列が有効でない場合
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2,3番目の要素を削除したため、「paramList=拡張子文字列のList」
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --拡張子指定が有効でない場合
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFileNameWithinAFolderWithRecursiveFilterByExtListAndFileNameString(theFolderPath, paramList, keyStr) -- [fileNameExt contains keyStr]
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfChildFoldersByExtsAndKey) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfChildFoldersByExtsAndKey



--選択したフォルダ階層(子フォルダを含む)に含まれるフォルダフルパスと全ファイル名を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   正規表現[文字列]: グループ化して利用するため、前後を ( ) で括ること!
--    ex) "(^(a).*\\.(css|js)+$)" <= ファイル名が「 a で始まり、末尾が .css 又は .js 」
--    ex) "(.*light.*\\.(css|js)+$)" <= 「末尾が .css 又は .js で、light の文字列を含む」
--  「拡張子を含むファイル名」を正規表現にて抽出 [注]エスケープシーケンスのため「 . ピリオド」は
--   通常 \\. 表記ですが、NSPredicate に問題があるため \\\\. つまり\4つ連続でないとエラーの場合あり!
-- 実行結果[0~n] (子フォルダを含む)フォルダのフルパス あるいは (拡張子付きの)ファイル名
-- (注)  最終結果を正規表現で単純抽出のため、該当ファイルZEROでも フォルダフルパスのみの行が出来てしまう
--    つまり、ファイル無しでフォルダフルパスの行のみが出来る場合があるため、呼び出し側で除外して頂きたい!
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfChildFoldersByRegExp(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、3番目の要素は "(正規表現を表す文字列)" [注意] ( ) で括る事!
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --正規表現文字列が有効でない場合
    end if
    set regExpStr to ((first item of paramList) as string)
    if regExpStr = "" then --グループ化して利用するため、前後を ( ) で括ること!ex) "(^(a).*)"
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --正規表現文字列が有効でない場合
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFileNameWithinAFolderWithRecursiveFilterByRegExp(theFolderPath, regExpStr)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfChildFoldersByRegExp) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfChildFoldersByRegExp



--選択したフォルダ階層(子フォルダを含む)に含まれるファイルのフルパスを取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- 実行結果[0~n] フォルダ階層(子フォルダを含む)に含まれるファイルの フルパス
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getPathListOfChildFolders(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFullPathWithinAFolderWithRecursive(theFolderPath)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getPathListOfChildFolders) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getPathListOfChildFolders



--選択したフォルダ階層(子フォルダを含む)に含まれるファイルのフルパスを取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3~n]  ファイル拡張子:"html" "css"のように複数指定可(拡張子1つでもOK)
-- 実行結果[0~n] フォルダ階層(子フォルダを含む)に含まれるファイルの フルパス
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getPathListOfChildFoldersByExts(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!(子フォルダ対応)" --初期値
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2番目の要素を削除したため、「paramList=拡張子文字列のList」
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set theFolderPath to (POSIX path of theFolder) --aliasを POSIX path(文字列)に変換
    set stringList to {} --  文字列リストを初期化
    set stringList to my retFullPathWithinAFolderWithRecursiveFilterByExtList(theFolderPath, paramList)
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    --display dialog returnText
    --display dialog (count stringList)
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getPathListOfChildFoldersByExts) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getPathListOfChildFoldersByExts



-- 選択ディレクトリの(POSIX)パス名+「(拡張子ありの)全ファイル名」を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子を含めた)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfFolder(paramStr) --  拡張子を指定しないため、フォルダ内の全ファイルを返す
  
  set promptStr to "フォルダを選択してください!" --初期値
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) -- 最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) -- 最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theAlias to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theAlias to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  ==== Cocoa Script 開始  ====
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set aArray to NSMutableArray's array() --FileFullPath 拡張子で抽出済み
    set bArray to NSMutableArray's array() --FolderFullPath / fileName => Return as list
    set theFolder to (POSIX path of theAlias) --aliasを POSIX path文字列に変換
    set sArray to my retSortedArrayNotRecursive(theFolder) --get SortedArray, ParentDir Only!
    
    
    set isFirst to true -- 最初かどうか?
    --[1] aArray に フォルダパス あるいは(拡張子を含めない)ファイル名 を追加
    repeat with aNSString in sArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      if isFirst then
        set newDirPath to (aNSString's stringByDeletingLastPathComponent() as string)
        (aArray's addObject:(newDirPath & "/")) --フォルダパスを aArray に追加
        set isFirst to false
      end if --以下で、(拡張子を含めた)ファイル名を aArray に追加
      (aArray's addObject:(aNSString's lastPathComponent()))
    end repeat
    
    set stringList to {} --文字列リストを初期化
    set stringList to (aArray as list) --NSMutableArray bArray をキャストして、List へ格納
    
    aArray's removeAllObjects() --bArray 全要素削除すると、エラー発生(sArrayが依存?)
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --  ==== Cocoa Script 終了  ====
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    -- display dialog returnText
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfFolder) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfFolder



--選択ディレクトリの(POSIX)パス名+「(拡張子無しの)全ファイル名」を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   ファイル拡張子:"css"のように1つだけ指定指定(2つめ以降は無視)
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子無しの)ファイル名
--2021/08/31 「フィルタ参照」にて、指定拡張子のみ抽出
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfFolderByExt(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別しない
  
  set promptStr to "フォルダを選択してください!" --初期値
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) -- 最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) -- 最初の要素を削除
    --1,2番目の要素を削除したため、「paramList=拡張子文字列のList」
    
    if (count paramList) > 0 then --ファイル拡張子:"css"のように1つだけ指定指定(2つめ以降は無視)
      set extStr to ((first item of paramList) as string)
    else
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --return returnText(拡張子指定がない場合)
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theAlias to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theAlias to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  ==== Cocoa Script 開始  ====
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set aArray to NSMutableArray's array() --FileFullPath 拡張子で抽出済み
    set bArray to NSMutableArray's array() --FolderFullPath / fileName => Return as list
    set theFolder to (POSIX path of theAlias) --aliasを POSIX path文字列に変換
    set sArray to my retSortedArrayNotRecursive(theFolder) --get SortedArray, ParentDir Only!
    
    --[1] sArray 拡張子で抽出 => aArray    "pathExtension == extStr"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension == [c]%@" argumentArray:{extStr}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --上記条件で抽出
    
    set isFirst to true -- 最初かどうか?
    --[2] bArray に フォルダパス あるいは(拡張子を含めない)ファイル名 を追加
    repeat with aNSString in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      if isFirst then
        set newDirPath to (aNSString's stringByDeletingLastPathComponent() as string)
        (bArray's addObject:(newDirPath & "/")) --フォルダパスを bArray に追加
        set isFirst to false
      end if --以下で、(拡張子を含めた)ファイル名を bArray に追加
      (bArray's addObject:(aNSString's lastPathComponent()'s stringByDeletingPathExtension()))
    end repeat
    
    set stringList to {} --文字列リストを初期化
    set stringList to (bArray as list) --NSMutableArray bArray をキャストして、List へ格納
    
    bArray's removeAllObjects() --bArray 全要素削除すると、エラー発生(bArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(aArrayが依存?)
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(bArrayが依存?)
    --  ==== Cocoa Script 終了  ====
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    -- display dialog returnText
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfFolderByExt) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfFolderByExt



--選択ディレクトリの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3~n]  ファイル拡張子:"html" "css"のように複数指定可(拡張子1つでもOK)
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子を含めた)ファイル名
--2021/08/31 「フィルタ参照」にて、指定拡張子のみ抽出
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfFolderByExts(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別しない
  
  set promptStr to "フォルダを選択してください!" --初期値
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) -- 最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) -- 最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theAlias to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theAlias to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  ==== Cocoa Script 開始  ====
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set aArray to NSMutableArray's array() --FileFullPath 拡張子で抽出済み
    set bArray to NSMutableArray's array() --FolderFullPath / fileName => Return as list
    set theFolder to (POSIX path of theAlias) --aliasを POSIX path文字列に変換
    set sArray to my retSortedArrayNotRecursive(theFolder) --get SortedArray, ParentDir Only!
    
    --[1] sArray 拡張子で抽出 => aArray    "pathExtension IN paramList"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@" argumentArray:{paramList}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --上記条件で抽出
    
    set isFirst to true -- 最初かどうか?
    --[2] bArray に フォルダパス あるいは(拡張子を含めない)ファイル名 を追加
    repeat with aNSString in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      if isFirst then
        set newDirPath to (aNSString's stringByDeletingLastPathComponent() as string)
        (bArray's addObject:(newDirPath & "/")) --フォルダパスを bArray に追加
        set isFirst to false
      end if --以下で、(拡張子を含めた)ファイル名を bArray に追加
      (bArray's addObject:(aNSString's lastPathComponent()))
    end repeat
    
    set stringList to {} --文字列リストを初期化
    set stringList to (bArray as list) --NSMutableArray bArray をキャストして、List へ格納
    
    bArray's removeAllObjects() --bArray 全要素削除すると、エラー発生(bArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(aArrayが依存?)
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(bArrayが依存?)
    --  ==== Cocoa Script 終了  ====
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    -- display dialog returnText
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfFolderByExts) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfFolderByExts



--選択ディレクトリの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   keyString [fileNameExt contains keyString] ファイル名に keyString を含む
-- パラメータ[4~n]  ファイル拡張子:"html" "css"のように複数指定可(拡張子1つでもOK)
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子を含めた)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfFolderByExtsAndKey(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!" --初期値
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) -- 最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) -- 最初の要素を削除
    --1,2番目の要素を削除したため、3番目の要素は key文字列 [fileNameExt contains keyStr]
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --key文字列が有効でない場合
    end if
    set keyStr to ((first item of paramList) as string)
    if keyStr = "" then --「ファイル名」に含まれるkey文字列 [fileNameExt contains keyStr]
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --key文字列が有効でない場合
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    --1,2,3番目の要素を削除したため、「paramList=拡張子文字列のList」
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --拡張子指定が有効でない場合
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theAlias to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theAlias to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  ==== Cocoa Script 開始  ====
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set aArray to NSMutableArray's array() --FileFullPath 拡張子で抽出済み
    set bArray to NSMutableArray's array() --FolderFullPath / fileName => Return as list
    set theFolder to (POSIX path of theAlias) --aliasを POSIX path文字列に変換
    set sArray to my retSortedArrayNotRecursive(theFolder) --get SortedArray, ParentDir Only!
    
    --[1] sArray 拡張子で抽出 => aArray    "pathExtension IN paramList"
    set thePred to NSPredicate's predicateWithFormat:"pathExtension IN [c]%@ && lastPathComponent CONTAINS %@" argumentArray:{paramList, keyStr}
    set aArray to sArray's filteredArrayUsingPredicate:thePred --上記条件で抽出
    
    set isFirst to true -- 最初かどうか?
    --[2] bArray に フォルダパス あるいは(拡張子を含めない)ファイル名 を追加
    repeat with aNSString in aArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      if isFirst then
        set newDirPath to (aNSString's stringByDeletingLastPathComponent() as string)
        (bArray's addObject:(newDirPath & "/")) --フォルダパスを bArray に追加
        set isFirst to false
      end if --以下で、(拡張子を含めた)ファイル名を bArray に追加
      (bArray's addObject:(aNSString's lastPathComponent()))
    end repeat
    
    set stringList to {} --文字列リストを初期化
    set stringList to (bArray as list) --NSMutableArray bArray をキャストして、List へ格納
    
    bArray's removeAllObjects() --bArray 全要素削除すると、エラー発生(bArrayが依存?)
    --aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(aArrayが依存?)
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(bArrayが依存?)
    --  ==== Cocoa Script 終了  ====
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    -- display dialog returnText
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfFolderByExtsAndKey) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfFolderByExtsAndKey



--選択ディレクトリの(POSIX)パス名+「(拡張子付きの)全ファイル名」を取得
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3]   正規表現[文字列]: グループ化して利用するため、前後を ( ) で括ること!
--    ex) "(^(a).*\\.(css|js)+$)" <= ファイル名が「 a で始まり、末尾が .css 又は .js 」
--    ex) "(.*light.*\\.(css|js)+$)" <= 「末尾が .css 又は .js で、light の文字列を含む」
--  「拡張子を含むファイル名」を正規表現にて抽出 [注]エスケープシーケンスのため「 . ピリオド」は
--   通常 \\. 表記ですが、NSPredicate に問題があるため \\\\. つまり\4つ連続でないとエラーの場合あり!
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子を含めた)ファイル名
--2021/09/20 Ver.3.0 Cocoa AppleScript 対応
on getFileListOfFolderByRegExp(paramStr) --AppleScriptは文字列比較で大文字と小文字の文字を区別せず
  
  set promptStr to "フォルダを選択してください!" --初期値
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} --デリミタを変更
    set paramList to (every text item of paramStr) --分割し、List格納
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then -- not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) -- 最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) -- 最初の要素を削除
    --1,2番目の要素を削除したため、3番目の要素は "(正規表現を表す文字列)" [注意] ( ) で括る事!
    if (count paramList) < 1 then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --正規表現文字列が有効でない場合
    end if
    set regExpStr to ((first item of paramList) as string)
    if regExpStr = "" then --正規表現文字列が有効でない場合
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --正規表現文字列が有効でない場合
    end if
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theAlias to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theAlias to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択フォルダの「エイリアス値」が返る
    
    
    -----------------------------------------------------------------------------------
    --  ==== Cocoa Script 開始  ====
    --  Cocoa Script ハンドラーを呼び出し!   フォルダ階層(子フォルダ)対応
    set aArray to NSMutableArray's array() --FileFullPath 拡張子で抽出済み
    set bArray to NSMutableArray's array() --FolderFullPath / fileName => Return as list
    set theFolder to (POSIX path of theAlias) --aliasを POSIX path文字列に変換
    set sArray to my retSortedArrayNotRecursive(theFolder) --get SortedArray, ParentDir Only!
    
    --[1] sArray に フォルダパス あるいは(拡張子を含めた)ファイル名 を追加 => aArray
    set isFirst to true -- 最初かどうか?
    repeat with aNSString in sArray --Cocoa ASの場合、列挙子を利用しても最速にならないらしい
      if isFirst then
        set newDirPath to (aNSString's stringByDeletingLastPathComponent() as string)
        (aArray's addObject:(newDirPath & "/")) --フォルダパスを aArray に追加
        set isFirst to false
      end if --以下で、(拡張子を含めた)ファイル名を aArray に追加
      (aArray's addObject:(aNSString's lastPathComponent()))
    end repeat
    
    --[2] aArray 拡張子で抽出 => bArray    "pathExtension IN paramList"
    --Dirを示すパスは無条件対象とするため、OR条件で (.*/+$) を付加
    --パラメータは(上記サンプルのように)グループ化のため、前後を ( ) で閉じて下さい
    set regExpStr to (quoted form of ("(.*/+$)|" & regExpStr)) --最後に ' で囲む
    set thePred to NSPredicate's predicateWithFormat:("SELF MATCHES " & regExpStr)
    set bArray to aArray's filteredArrayUsingPredicate:thePred --上記条件で抽出
    
    if (bArray's |count|() < 2) then
      set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
      set the clipboard to {} --クリップボードの初期化
      return "" --bArray内の初要素はフォルダパスのため、該当ファイルが存在しない場合
    end if
    
    set stringList to {} --文字列リストを初期化
    set stringList to (bArray as list) --NSMutableArray bArray をキャストして、List へ格納
    
    aArray's removeAllObjects() --aArray 全要素削除すると、エラー発生(bArrayが依存?)
    --bArray's removeAllObjects() --bArray 全要素削除すると、エラー発生(aArrayが依存?)
    --sArray's removeAllObjects() --sArray 全要素削除すると、エラー発生(aArrayが依存?)
    --  ==== Cocoa Script 終了  ====
    -----------------------------------------------------------------------------------
    
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    -- display dialog returnText
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFileListOfFolderByRegExp) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFileListOfFolderByRegExp



-- 選択したファイルのパスを取得する(複数ファイルの選択不可)    「単一」ファイル選択ダイアログ
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3~n]  UTI(Uniform Type Identifier):"css" "html"のように複数限定可(4つまで)
--  厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
-- 実行結果[0] 指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1] (拡張子を含めた)ファイル名
on getFilePath(paramStr)
  set promptStr to "ファイルの選択(複数ファイルの選択不可)" --  フォルダ選択時のプロンプト文字列
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --  現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} -- デリミタを変更
    set paramList to (every text item of paramStr) -- 分割し、List格納
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then --not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set f to (choose file with prompt promptStr of type paramList)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set f to (choose file with prompt promptStr of type paramList default location defaultLocation)
    end if --選択したファイルの「エイリアス値」が返される
    
    tell application "Finder"
      set fDirHFS to (f's folder as string) --  (フォルダ)HFSパス
      set fDir to (POSIX path of fDirHFS) --(フォルダ) POSIXパス
      set fNameExt to (f's name as string) --  拡張子付きファイル名
    end tell
    
    set stringList to {} --        文字列リストを初期化
    set end of stringList to fDir --    フォルダフルパスを行追加
    set end of stringList to fNameExt --  ファイル名を行追加
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFilePath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFilePath



-- 選択した(複数)ファイルのパスを取得する(複数ファイルの選択可能)  「複数」ファイル選択ダイアログ
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- パラメータ[3~n]  UTI(Uniform Type Identifier):"css" "html"のように複数限定可(4つまで)
--  厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
-- 実行結果[0]     指定フォルダ(ディレクトリ)の POSIXフルパス
-- 実行結果[1~n] (拡張子を含めた)ファイル名
on getMultiFilePath(paramStr)
  set multiFile to true
  set promptStr to "ファイルの選択(複数ファイルの選択可能)" --  フォルダ選択時のプロンプト文字列
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --  現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} -- デリミタを変更
    set paramList to (every text item of paramStr) -- 分割し、List格納
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then --not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set aliasList to (choose file with prompt promptStr of type paramList multiple selections allowed multiFile)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set aliasList to (choose file with prompt promptStr of type paramList default location defaultLocation multiple selections allowed multiFile)
    end if --選択したファイルの「エイリアス値」が返される
    
    set stringList to {} --文字列リストを初期化
    set isFirst to true -- 最初かどうか?
    
    tell application "Finder"
      repeat with f in aliasList
        set fDirHFS to (f's folder as string) --    (フォルダ)HFSパス
        set fDir to (POSIX path of fDirHFS) --  (フォルダ)POSIXパス
        set fNameExt to (f's name as string) --    拡張子付きファイル名
        
        if (isFirst) then
          set end of stringList to fDir --  フォルダパスを行追加
          set end of stringList to fNameExt --ファイル名を行追加
          set isFirst to false
        else
          set end of stringList to fNameExt --ファイル名を行追加
        end if
      end repeat
    end tell
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getMultiFilePath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getMultiFilePath



-- 選択したフォルダのフルパスを取得する(複数フォルダの選択不可)    「単一」フォルダ選択ダイアログ
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- 実行結果 選択フォルダ(ディレクトリ)の POSIXフルパス
on getFolderPath(paramStr)
  set promptStr to "フォルダの選択(複数フォルダの選択不可)" --  フォルダ選択時のプロンプト文字列
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --  現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} -- デリミタを変更
    set paramList to (every text item of paramStr) -- 分割し、List格納
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then --not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set theFolder to (choose folder with prompt promptStr)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set theFolder to (choose folder with prompt promptStr default location defaultLocation)
    end if --選択したファイルの「エイリアス値」が返される
    
    tell application "Finder"
      set fDirHFS to (theFolder as string) --  (フォルダ)HFSパス
      set fDir to (POSIX path of fDirHFS) --(フォルダ) POSIXパス
    end tell
    
    set stringList to {} --        文字列リストを初期化
    set end of stringList to fDir --    フォルダフルパスを行追加
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    set returnText to "" --  ハンドラーの戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getFolderPath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getFolderPath



-- 選択した(複数)フォルダのフルパスを取得する(複数ファイルの選択可能)  「複数」フォルダ選択ダイアログ
-- パラメータ[1]  プロンプト文字列:""なら、当ハンドラー設定の初期値
-- パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
-- 実行結果[0~n] 選択フォルダ(ディレクトリ)の POSIXフルパス
on getMultiFolderPath(paramStr)
  set multiFolder to true
  set promptStr to "フォルダの選択(複数フォルダの選択可能)" --  フォルダ選択時のプロンプト文字列
  set paramList to {} --パラメータのリスト
  
  try
    set tmp to (AppleScript's text item delimiters) --  現在のデリミタを保存
    set (AppleScript's text item delimiters) to {LF} -- デリミタを変更
    set paramList to (every text item of paramStr) -- 分割し、List格納
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    
    set str to ((first item of paramList) as string)
    if (str ≠ "") then --not=は「/=」と記述
      set promptStr to str
    end if
    set paramList to (rest of paramList) --最初の要素を削除
    set defaultLocation to ((first item of paramList) as string)
    set paramList to (rest of paramList) --最初の要素を削除
    
    activate --ウィンドウの前面に表示!
    if (defaultLocation = "") then
      set aliasList to (choose folder with prompt promptStr multiple selections allowed multiFolder)
    else
      set defaultLocation to (POSIX path of defaultLocation)
      set aliasList to (choose folder with prompt promptStr default location defaultLocation multiple selections allowed multiFolder)
    end if --選択したファイルの「エイリアス値」が返される
    
    set stringList to {} --文字列リストを初期化
    
    tell application "Finder"
      repeat with aFolder in aliasList
        set fDirHFS to (aFolder as string) --    (フォルダ)HFSパス
        set fDir to (POSIX path of fDirHFS) --  (フォルダ)POSIXパス
        set end of stringList to fDir --  フォルダパスを行追加
      end repeat
    end tell
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {CRLF})
    set the clipboard to {} --クリップボードの初期化
    set the clipboard to returnText --クリップボードへ格納
    
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set returnText to getTextWithDelimiters(stringList, {LF}) --ハンドラ-の戻り値へ 格納
    
    set stringList to {} --  文字列リストを初期化
    
  on error
    set returnText to "" --  ハンドラ-の戻り値を初期化
    set stringList to {} --  文字列リストを初期化
    set (AppleScript's text item delimiters) to tmp --  保存したデリミタに戻す
    display dialog "★ AppleScriptTask (getMultiFolderPath) ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try -- 「キャンセル」ボタン押下時用のエラーハンドリング
  
  return returnText -- display dialog returnText
  
end getMultiFolderPath



--ファイル存在チェック(引数のパスが有効で、ファイルパスかどうか?)
--引数   thePath    ( / から始まる)絶対パス
--結果   ""「パスが無効 もしくは フォルダパス」の場合    又は(拡張子を含めた)ファイル名
on checkFilePath(thePath)
  set returnText to "" --ハンドラーの戻り値を初期化
  
  try
    set myFM to NSFileManager's defaultManager() --Use for myFM's ~
    set isDir to true --フォルダ?
    set validPath to false --(File or Folder)パスが有効か?
    
    --(reference) isDir ポインタ(参照)渡しで、値が返る
    set {validPath, isDir} to (myFM's fileExistsAtPath:thePath isDirectory:(reference))
    if (validPath as boolean) then
      set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
    else
      return "" --引数の「ファイルパス」が無効(存在しない)場合
    end if
    if isDir then
      return "" --引数が「フォルダパス」の場合
    else --isFile
      set aNSString to NSString's stringWithString:thePath
      return (aNSString's lastPathComponent() as string) --(拡張子を含めた)ファイル名
    end if
    
  on error
    set returnText to "" --  ハンドラーの戻り値を初期化
    display dialog "★ checkFilePath ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try
  
  return returnText --display dialog returnText
  
end checkFilePath



--フォルダ存在チェック(引数のパスが有効で、フォルダパスかどうか?)
--引数   thePath    ( / から始まる)絶対パス
--結果   ""「パスが無効 もしくは ファイルパス」の場合    又は(末尾の)フォルダ名
on checkDirPath(thePath)
  set returnText to "" --ハンドラーの戻り値を初期化
  
  try
    set myFM to NSFileManager's defaultManager() --Use for myFM's ~
    set isDir to true --フォルダ?
    set validPath to false --(File or Folder)パスが有効か?
    (*
    if (text -1 of thePath) ≠ "/" then --not = は、/= と入力
      set thePath to (thePath & "/") --末尾に "/" 無しでも、以下メソッド問題無し
    end if
    *)
    
    --(reference) isDir ポインタ(参照)渡しで、値が返る
    set {validPath, isDir} to (myFM's fileExistsAtPath:thePath isDirectory:(reference))
    if (validPath as boolean) then
      set isDir to (isDir as boolean) --Dirならtrue、Fileならfalse
    else
      return "" --引数の「フォルダパス」が無効(存在しない)場合
    end if
    
    if isDir then --引数が「フォルダパス」の場合
      set aNSString to NSString's stringWithString:thePath
      return (aNSString's lastPathComponent() as string) --(末尾の)フォルダ名
    else --isFile
      return "" --引数が「ファイルパス」の場合
    end if
    
  on error
    set returnText to "" --  ハンドラーの戻り値を初期化
    display dialog "★ checkDirPath ★" & return & return & "   キャンセル あるいは 異常終了" buttons {"10秒で閉じます!"} with icon caution giving up after 10
  end try
  
  return returnText --display dialog returnText
  
end checkDirPath



--「choose file」で選択したファイルの UTI(Uniform Type Identifier) を取得
on getUtiByChooseFile(paramStr)
  
  try
    set theFile to choose file --get File's alias
    
    tell application "System Events"
      set theUTI to (type identifier of theFile) --UTI
      set theFileNameExt to (theFile's name) --File's nameExt
    end tell
    
    set returnText to (theFileNameExt & "  =>  " & theUTI & "    " & return) --Edit result
    return returnText
    
  on error
    return ""
  end try
  
end getUtiByChooseFile

 ちなみに、  ret  で始まる AppleScript の ハンドラー (VBAのプロシージャ相当の呼び出し単位)は Cocoa AS で主処理が実装されていますので、カスタマイズは慎重にお願いします。 その他の ハンドラー も Cocoa AS 実装の部分が判るように記述 しています。(何も記述が無ければ、Vannila AS ということ) Vanilla AS 部分はカスタマイズが楽で「 AppleScriptTask コマンド経由の呼び出し」ではなく、「 filePath.scpt をダブルクリック後に起動される スクリプトエディタ.app にて実行」すれば( Vanilla AS 部分の場合 )エラー発生箇所が判ります。 先頭部分の on test() から end test 内にサンプルのデバッグ用コードを記述済みのため、変更後に [command]+[K] でコンパイル、 test() の実行は [command]+[R] で可能です。 動作に問題が無い場合は [command]+[S] にて保存を忘れないように!

 VBA だけでなく AppleScript コードも テキスト保存が可能なため、変更前に [command]+[A] にて全選択後 [command]+[C] でコピー してテキストエディタ等に [command]+[V] にてペースト(貼り付け)しておけば元に戻せます。 カスタマイズ作業前に filePath.scptAppleScriptTaskコマンドを記述したExcelファイル を ローカルPC上か クラウド領域にバックアップしておくと なお良いでしょう。


AppleScript[06] Png01

 【VBA I/F追加】 AppleScript [06] Cocoa AppleScript 第2版 ファイルから UTI 取得、Open/Save ファイルダイアログの改良! 

 VBAコード の追加のため、末尾に 以降のコードを順番にコピー&ペースト(貼り付け) 

 ただし、(追加前 末尾の) Sub test31()Sub test32() は「差し替え」のため、一度削除してください! 

Sub test31()
'「単一」ファイル選択ダイアログで、フルパスを取得(拡張子限定あり)
'  パラメータ[1]  プロンプト文字列:""なら、AppleScriptコード設定の初期値
'  パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
'       POSIXフルパス指定のため、先頭と末尾に / が必要  ex) "/Users/username/Downloads/"
'  パラメータ[3〜n]ファイル拡張子:"css" "html"のように 複数限定可(厳密だと、UTIを4つまで)
'   厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
'  注.  list(0)     「ディレクトリの(POSIX)フルパス」を格納
'       list(1)  「ファイル名(拡張子あり)」を格納
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    Dim list() As String '          「フルパス」格納用として「文字列の配列」を定義
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "単一ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
    'getUtiByDialog() にて調べた xlsx , xlsm 対応のUTIをセットして、他のUTIを持つファイルを除外
    scriptParam = "" & vbLf & "" & vbLf & "org.openxmlformats.spreadsheetml.sheet" & _
                vbLf & "org.openxmlformats.spreadsheetml.sheet.macroenabled"
    scriptResult = AppleScriptTask("filePath.scpt", "getFilePath", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
        Call DispArray(list) '実行結果(文字列)の表示
        Erase list '配列の初期化
        Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
    End If
    
End Sub
 
Sub test32()
'「複数」ファイル選択ダイアログで、フルパスを取得(拡張子限定あり)
'  パラメータ[1]  プロンプト文字列:""なら、AppleScriptコード設定の初期値
'  パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
'       POSIXフルパス指定のため、先頭と末尾に / が必要  ex) "/Users/username/Downloads/"
'  パラメータ[3〜n]ファイル拡張子:"css" "html"のように 複数限定可(厳密だと、UTIを4つまで)
'   厳密には「拡張子ではなくUTI限定」のため、無効だと全ファイルが選択可能となる!
'  注.  list(0)     「ディレクトリの(POSIX)フルパス」を格納
'       list(1〜n)  「ファイル名(拡張子あり)」を格納
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    Dim list() As String '          「フルパス」格納用として「文字列の配列」を定義
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "複数ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("css")
    'getUtiByDialog() にて調べた xlsx , xlsm 対応のUTIをセットして、他のUTIを持つファイルを除外
    scriptParam = "" & vbLf & "" & vbLf & "org.openxmlformats.spreadsheetml.sheet" & _
                vbLf & "org.openxmlformats.spreadsheetml.sheet.macroenabled"
    scriptResult = AppleScriptTask("filePath.scpt", "getMultiFilePath", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
        Call DispArray(list) '実行結果(文字列)の表示
        Erase list '配列の初期化
        Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
    End If
    
End Sub
 

 Sub test31()Sub test32() は差し替えとなります! 呼び出される AppleScriptハンドラー のコードは変更していませんが、VBAサンプルコードを 拡張子から UTI セットに変更しました。
 末尾の getUtiByDialog() 関数を利用すれば、ファイルに対応する UTI(Uniform Type Identifier) を調査可能。 Mac上で作成したファイルであれば確実に UTI がセットされるため、ファイル選択ダイアログで「利用したい拡張子を持つ」同ファイルを選択すること。
 Sub test32()複数ファイル選択ダイアログで、選択順の配列が返されるようです。 (2つ目以降のファイル選択は、[shift]+[クリック]にて!)


Sub test33()
'「単一」フォルダ選択ダイアログで、フォルダのフルパスを取得
'  パラメータ[1]  プロンプト文字列:""なら、AppleScriptコード設定の初期値
'  パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
'       POSIXフルパス指定のため、先頭と末尾に / が必要  ex) "/Users/username/Downloads/"
'  注.  scriptResult     「ディレクトリの(POSIX)フルパス」を格納
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "単一フォルダ選択!" & vbLf & "/Users/username/"
    scriptParam = "" & vbLf & ""
    scriptResult = AppleScriptTask("filePath.scpt", "getFolderPath", scriptParam)
    
    Debug.Print scriptResult
End Sub
 
Sub test34()
'「複数」フォルダ選択ダイアログで、フォルダのフルパスを取得
'  パラメータ[1]  プロンプト文字列:""なら、AppleScriptコード設定の初期値
'  パラメータ[2]  初期表示フォルダ:""なら、無指定(前回と同じフォルダを開く)
'       POSIXフルパス指定のため、先頭と末尾に / が必要  ex) "/Users/username/Downloads/"
'  注.  list(0〜n)     「ディレクトリの(POSIX)フルパス」を格納
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    Dim list() As String '          「フルパス」格納用として「文字列の配列」を定義
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "複数フォルダ選択!" & vbLf & "/Users/username/"
    scriptParam = "" & vbLf & ""
    scriptResult = AppleScriptTask("filePath.scpt", "getMultiFolderPath", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        list = Split(scriptResult, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
        Call DispArray(list) '実行結果(文字列)の表示
        Erase list '配列の初期化
        Call GetClipBoard 'クリップボードに格納したテキストデータを取得&表示
    End If
    
End Sub


 Sub test33()Sub test34() は「単一」又は「複数」フォルダ選択ダイアログで、フォルダフルパスを返す。


'ファイル存在チェック(引数のパスが有効で、ファイルパスかどうか?)
'引数   path    ( / から始まる)絶対パス
'結果   ""「パスが無効 もしくは フォルダパス」  又は(拡張子を含めた)ファイル名
Function MAC_FileExists(path As String) As String
    On Error GoTo myError
    
    MAC_FileExists = "" '「関数の結果」を初期化
    
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    
    ' AppleScriptを実行
    ' scriptParam = "/Users/username/Desktop/fileName.ext"
    scriptParam = path
    scriptResult = AppleScriptTask("filePath.scpt", "checkFilePath", scriptParam)
    
    MAC_FileExists = scriptResult '「関数の結果」←「(拡張子を含めた)ファイル名」
    
    Exit Function
    
myError:
    MsgBox "エラー発生!(MAC_FileExists)"
End Function

'フォルダ存在チェック(引数のパスが有効で、フォルダパスかどうか?)
'引数   path    ( / から始まる)絶対パス
'結果   ""「パスが無効 もしくは ファイルパス」  又は POSIX FolderPath
'       「(有効な)POSIX FolderPath」として、末尾に"/"を付加したパスを返す
Function MAC_FolderExists(path As String) As String
    On Error GoTo myError

    MAC_FolderExists = "" '「関数の結果」を初期化
    
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    
    ' AppleScriptを実行
    ' scriptParam = "/Users/username/Desktop/"
    scriptParam = path
    scriptResult = AppleScriptTask("filePath.scpt", "checkDirPath", scriptParam)
    
    If scriptResult <> "" Then '(注) scriptResult は「(末尾の)フォルダ名」を格納
        If Right(path, 1) = "/" Then 'パスの末尾が "/"
            MAC_FolderExists = path
        Else
            MAC_FolderExists = path & "/" '「末尾に"/"を付加したPOSIX path」を返す
       End If
    End If
    
    Exit Function
    
myError:
    MsgBox "エラー発生!(MAC_FolderExists)"
End Function


 MAC_FileExists(filePath) 関数はファイルが存在すれば「(フォルダ部分を除いた)ファイル名」を返し、MAC_FolderExists(folderPath) 関数はフォルダが存在すれば「(前後に / を付加した)POSIXフォルダフルパス」を返す。


'Macで"FileFilter"パラメータを措定すると、エラー!
'パラメータの MultiSelect は指定可能だが、無効で 2021/09/26現在 複数選択できない
'   Application.GetOpenFilename を利用せず、 AppleScriptで 代替
'   パラメーター utiList は、UTIの配列
Function MAC_GetOpenFilename(utiList As Variant) As String '単一選択
    On Error GoTo myError
    
    MAC_GetOpenFilename = ""
    
    Dim filePath As String
    Dim utiListStr As String
    utiListStr = Join(utiList, vbLf) '配列の要素ごとに vbLf を挿入した文字列
    
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "単一ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("xml")
    'getUtiByDialog() にて調べた xlsx , xlsm 対応のUTIをセットして、他のUTIを持つファイルを除外
    scriptParam = "" & vbLf & "" & vbLf & utiListStr
    scriptResult = AppleScriptTask("filePath.scpt", "getFilePath", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        MAC_GetOpenFilename = scriptResult
    End If
    
    Exit Function

myError:
    MsgBox "エラー発生!(MAC_GetOpenFilename)"
    MAC_GetOpenFilename = "" '「関数の結果」を初期化
End Function

Sub sample_MAC_GetOpenFilename()
    On Error GoTo myError
    
    Dim filePath As String
    Dim utiList(2) As String '拡張子に対応する「UTI」を2つ指定する場合 [getUtiByDialogでUTI調査]
    utiList(0) = "org.openxmlformats.spreadsheetml.sheet" 'UTI for ".xlsx"
    utiList(1) = "org.openxmlformats.spreadsheetml.sheet.macroenabled" 'UTI for ".xlsm"
    filePath = ""
    
    ' 「指定したUTIを持つファイル」のみ単一選択可能なダイアログを表示
    filePath = MAC_GetOpenFilename(utiList)
    
    If filePath = "" Then 'ダイアログで「キャンセル」した場合、何も行わない
        MsgBox "「キャンセル」又は「取得失敗」!" & vbLf & "( MAC_GetOpenFilename )"
        Exit Sub
    End If
    
    Dim list() As String '「文字列の配列」を定義
    list = Split(filePath, vbLf)
    filePath = list(0) & list(1)
    
    MsgBox filePath
    Exit Sub '以下、サンプル操作を実行しない(サンプル実行なら、この行を削除かコメント化)
    
    ' 以下、サンプル操作
    Dim wb As Workbook
    Dim fileNameExt As String
    fileNameExt = MAC_FileExists(filePath) 'ファイルが存在する場合、ファイル名が返る
    If fileNameExt = "" Then 'ダイアログで filePath を取得したため、filePath 通常 有効なはず
        MsgBox filePath & vbCrLf & "は、存在しません", vbExclamation
        Exit Sub
    End If
    For Each wb In Workbooks
        If wb.Name = fileNameExt Then '同名ブックを既に開いているか?
            MsgBox filePath & vbCrLf & "は、既に開いています!", vbExclamation
            Exit Sub
        End If
    Next wb
    Workbooks.Open FileName:=filePath
    
    Exit Sub
    
myError:
    Application.DisplayAlerts = True '確認画面を表示するように 設定を戻す
    MsgBox "エラー発生!(sample_MAC_GetOpenFilename)"
End Sub


 MacのVBAで利用可能な OpenFilename ダイアログは FileFilter パラメータを指定できず MultiSelect パラメータも無効なため、Vanilla AS で代替。 「UTI配列指定」で間接的に「拡張子指定」を実現。
 sample_MAC_GetOpenFilename() プロシージャは、MAC_GetOpenFilename() 関数を呼び出すためのサンプルコード。


'Macで"FileFilter"パラメータを措定すると、エラー!
'パラメータの MultiSelect は指定可能だが、無効で 2021/09/26現在 複数選択できない
'   Application.GetOpenFilename を利用せず、 AppleScriptで 代替
'   パラメーター utiList は、UTIの配列
Function MAC_GetOpenFilenameMultiSelect(utiList As Variant) As String '複数選択
    On Error GoTo myError
    
    MAC_GetOpenFilenameMultiSelect = ""
    
    Dim filePath As String
    Dim utiListStr As String
    utiListStr = Join(utiList, vbLf) '配列の要素ごとに vbLf を挿入した文字列
    
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)、区切り文字 LF
    Dim scriptParam As String '     AppleScript パラメータ(文字列)、区切り文字 LF
    
    ' AppleScriptを実行 (最後のパラメータが AppleScript に渡される文字列)
    '  パラメータの区切り文字には、Macの改行コード(vbLf)を指定
    ' scriptParam = "単一ファイル選択!" & vbLf & "/Users/username/" & vbLf & LCase("xml")
    'getUtiByDialog() にて調べた xlsx , xlsm 対応のUTIをセットして、他のUTIを持つファイルを除外
    scriptParam = "" & vbLf & "" & vbLf & utiListStr
    scriptResult = AppleScriptTask("filePath.scpt", "getMultiFilePath", scriptParam)
    
    If scriptResult <> "" Then   '「キャンセル」ボタン押下時も、空文字列が返る
        MAC_GetOpenFilenameMultiSelect = scriptResult
    End If
    
    Exit Function

myError:
    MsgBox "エラー発生!(MAC_GetOpenFilenameMultiSelect)"
    MAC_GetOpenFilenameMultiSelect = "" '「関数の結果」を初期化
End Function

Sub sample_MAC_GetOpenFilenameMultiSelect()
    On Error GoTo myError
    
    Dim filePath As String
    Dim utiList(2) As String '拡張子に対応する「UTI」を2つ指定する場合 [getUtiByDialogでUTI調査]
    utiList(0) = "org.openxmlformats.spreadsheetml.sheet" 'UTI for ".xlsx"
    utiList(1) = "org.openxmlformats.spreadsheetml.sheet.macroenabled" 'UTI for ".xlsm"
    filePath = ""
    
    ' 「指定したUTIを持つファイル」のみ「複数」選択可能なダイアログを表示
    filePath = MAC_GetOpenFilenameMultiSelect(utiList)
    
    If filePath = "" Then 'ダイアログで「キャンセル」した場合、何も行わない
        MsgBox "「キャンセル」又は「取得失敗」!" & vbLf & "( MAC_GetOpenFilenameMultiSelect )"
        Exit Sub
    End If
    
    Dim list() As String 'ファイルフルパス格納用として、「文字列の配列」を定義
    Dim i As Long
    list = Split(filePath, vbLf) 'vbLf = Chr(10) 区切り文字に LF を利用
    For i = LBound(list) To UBound(list)
        MsgBox list(i) 'list(0):フォルダフルパス list(1〜n):ファイル名
    Next i
    Exit Sub '以下、サンプル操作を実行しない(サンプル実行なら、この行を削除かコメント化)
    
    ' 以下、サンプル操作    (省略)
    Exit Sub
    
myError:
    Application.DisplayAlerts = True '確認画面を表示するように 設定を戻す
    MsgBox "エラー発生!(sample_MAC_GetOpenFilenameMultiSelect)"
End Sub


 sample_MAC_GetOpenFilenameMultiSelect() プロシージャは、MAC_GetOpenFilenameMultiSelect() 関数を呼び出すためのサンプルコードで 複数選択可能。

AppleScript[06] Png03

'2021/09/26現在 Macで"FileFilter"パラメータを措定不可 → 指定した拡張子(配列)と異なる場合は""
'   ex) Dim extList(2) As String '許可する「拡張子」を2つ指定する場合(もちろん、1つでも可)
'       extList(0) = "xlsx"
'       extList(1) = "xlsm"
'       dim filePath as Variant : filePath = ""
'       Do Until (filePath = False Or filePath <> "") '指定した拡張子(配列)のみ、許可
'           filePath = MAC_GetSaveAsFilename("initialNoExtFileName", extList)
'       Loop
Function MAC_GetSaveAsFilename(initialFileName As String, extList As Variant) As Variant
    On Error GoTo myError
        
    Dim filePath As Variant 'ダイアログで「キャンセル」した場合、Falseが返されるため Variant型
    MAC_GetSaveAsFilename = "" '「関数の結果」を初期化
    
    'Macで"FileFilter"パラメータ措定するとエラー(←拡張子のみで起動アプリは決まらない)
    '(注)指定したパスのファイルが既に存在する場合、「置き換え」の警告ダイアログが表示される
    filePath = Application.GetSaveAsFilename(initialFileName) '(拡張子無しの)表示ファイル名
    
    If filePath = False Then
        MAC_GetSaveAsFilename = filePath
        Exit Function 'ダイアログで「キャンセル」した場合、Falseが返される
    End If
    Rem If MAC_FileExists(CStr(filePath)) <> "" Then
    Rem     Exit Function '既に存在する場合も""を返して、「上書き」させないようにする
    Rem End If
    
    '以降、指定した拡張子(配列)に含まれるかどうか?
    Dim pos As Long
    Dim fileExt As String '取得した拡張子
    Dim ext As Variant 'As Stringだと、エラーとなる
    
    pos = InStrRev(CStr(filePath), ".") '拡張子を取得するため、末尾から検索
    If pos > 0 Then
        fileExt = LCase(Mid(CStr(filePath), pos + 1))
    Else
        Exit Function '拡張子なし の場合、""を返す
    End If
    
    For Each ext In extList
        If fileExt = ext Then  '指定した拡張子(配列)に含まれるかどうか?
            MAC_GetSaveAsFilename = filePath 'フルパスを「関数の結果」として返す
            Exit For
        End If
    Next
    
    Exit Function

myError:
    MsgBox "エラー発生!(MAC_GetSaveAsFilename)"
    MAC_GetSaveAsFilename = "" '「関数の結果」を初期化
End Function

Sub sample_MAC_GetSaveAsFilename()
    On Error GoTo myError
    
    Dim filePath As Variant
    Dim extList(2) As String '拡張子を2つ指定する場合
    extList(0) = "xlsx"
    extList(1) = "xlsm"
    filePath = ""
    
    ' 指定した拡張子(配列)でない場合、再度ダイアログを表示
    Do Until (filePath = False Or filePath <> "")
        filePath = MAC_GetSaveAsFilename("fileName", extList)
    Loop
    
    If filePath = False Then 'ダイアログで「キャンセル」した場合、コピー保存しない
        MsgBox "処理が「キャンセル」されました!" & vbCrLf & "( GetSaveAsFilename )"
        Exit Sub
    End If
    
    MsgBox filePath
    Exit Sub '以下、サンプル操作を実行しない(サンプル実行なら、この行を削除かコメント化)
    
    ' 以下、サンプル操作
    Application.DisplayAlerts = False '確認画面を表示しないように 設定(今回は、上書き)
    ActiveWorkbook.SaveCopyAs (filePath) 'ActiveWorkbook は変更されず、コピー保存される
    Application.DisplayAlerts = True '確認画面を表示するように 設定を戻す
    
    Exit Sub
    
myError:
    Application.DisplayAlerts = True '確認画面を表示するように 設定を戻す
    MsgBox "エラー発生!(sample_MAC_GetSaveAsFilename)"
End Sub


 MacのVBAで利用可能な SaveFilename ダイアログは FileFilter パラメータを指定できないため、指定拡張子以外を選択した場合は再度ダイアログ表示するよう改良! こちらはVBAの Application.GetSaveAsFilename() を用いる。
 sample_MAC_GetSaveAsFilename() プロシージャは、MAC_GetSaveAsFilename() 関数を呼び出すためのサンプルコード。


AppleScript[06] Png02

Function getUtiByDialog() As String
'「ファイル選択ダイアログ」でファイルの UTI を取得【UTI (Uniform Type Identifier) 調査用】
    Dim scriptResult As String '    AppleScript 実行結果  (文字列)
    Dim scriptParam As String '     AppleScript パラメータ(文字列)
    
    scriptParam = "" '必要ないため、ダミーで "" をセット
    scriptResult = AppleScriptTask("filePath.scpt", "getUtiByChooseFile", scriptParam)
   
    Debug.Print scriptResult
    getUtiByDialog = scriptResult

End Function

 4時間ほど格闘したが「拡張子から直接UTI」変換する Cocoa AS がエラーになってしまうため、「ファイルからUTI」取得する Vanilla AS を提供。 SwiftObjective-C 実装コードの Cocoa AS 変換方法が間違っているのかもしれない。 Mac上で作成したファイルであれば確実に UTI がセットされるため、ファイル選択ダイアログで「利用したい拡張子を持つ」同ファイルを選択すること。
 ファイル と UTI は 1:1 に対応するが、拡張子 と UTI は 1:n になる場合がある? macOS11 Big Sur にて「UTI」まわりが大幅に変更になり、(Core Foundationに含まれる)従来の「UTI」関連ライブラリ内の多くの機能が非推奨となりました。 AppleScript上でも   use framework "UniformTypeIdentifiers"   で利用可能となるUniformTypeIdentifiersフレームワーク関連が今後は拡張されるのでしょうか? 利用方法がよく分かってないだけかもしれません。 なお、Apple以外の「AppleScript Libraries」を利用する方法と 「Swift でコマンドライン・アプリを作成し、コマンド呼び出しする方法」は問題無く 拡張子からUTIを取得できました!


AppleScript[06] Png04



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


 AppleScriptTask コマンドの結果文字列(エラーがあれば、空文字 "" を返す)だけでなく、クリップボードにも同じ内容(改行コードは異なる)をセットしているため、必要があれば「片方のみ」に変更してください。 ただし、「フルパスやファイル名以外」を返す結果文字列の場合 クリップボードにはセットしないため、「イミディエイト ウィンドウ」にて確認してください!
 AppleScript から VBA に数百ファイル以上結果が返されるのであれば、大量データが渡されるオーバーヘッドも含め、クリップボードのみの利用(結果文字列は、正常終了/異常終了のみ判れば良い)がオススメです。 また、バックグラウンド処理前提の場合は 相互で クリップボードの中身を消してしまう可能性 があるため、結果文字列のみの利用が良いでしょう。

 1日2時間くらい1.5ヶ月 AppleScript を勉強した成果として、今回の記事を書きました。 Cocoa AppleScript に関しては初心者のため、不具合があればコメント等で教えて頂けると嬉しいです。

 致命的な不具合が無い場合、「filePath.scpt」AppleScript は最終版になる可能性があります。 (Apple以外の「AppleScript Libraries」を利用することなく)ASOCを含む標準のAppleScriptの機能のみで 拡張子から「UTI」取得に成功した場合は、拡張子から「UTI」へ自動変換するAppleScriptコードに書き換えますが... 既に非推奨の関数のため、代替方法が今後は用意されるのかもしれません。 成功した方がいれば、その方法を ぜひ ご連絡ください!

 macOS11[Big Sur]以降限定ですが、新 "UniformTypeIdentifiers" フレームワークを利用して 拡張子 or MIME から UTI取得 成功!
 → コメント(3つめ)を参照。 macOS11以降のみ利用可能なため、拡張子からの「UTI」自動変換は保留。 


 Cocoa関連のサンプルコードが Objective-C ではなく、 Swift が標準になってきました! Cocoa AS に書き換えるためにも、 今後は Swift も学習する必要がありそうです。 少なくとも、読める程度は...






Macランキング アイコン
最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル
For follow LINE Reader Group!Subscribe to this blog on Feedly!

★筆者のオススメ★

【Mac】メイリオ, MSゴシック等の MS Office フォント を Office以外のアプリでも利用可能に!( Mac "Font Book" アプリ に認識させる方法)

 Mac用Office のインストール後に Word や Excel から指定可能な "メイリオ" や "MSゴシック" 等のフォントを、他のアプリから利用したい と思った方はいませんか?  筆者は"メイリオ" ...

フォロー(人気ランキング)ボタン

Follow @AtaruchiFollow this blog with your Google account!Subscribe to this blog on Feedly!

お問い合わせ

名前

メール *

メッセージ *

人気記事(5件)

最新記事5件( by フィード )

フォロワー

広告
広告
広告

QooQ