OLD Style AppleScriptで(強引に)レコード中の任意の値を間接指定で取得するAppleScriptです。
裏技を駆使し、エラーメッセージからデータを取り出して動的にScript生成して結果を取得するという、仕様的にはできるわけがないが、実際にできるという処理です。
# 書籍「AppleScript最新リファレンス」からのリンクURLがBlog消失後に修復されていなかったので、再掲載しました。書籍側もリンクURLを修正したものを近日中にアップします
AppleScript名:文字列で指定したラベルの値をレコードから取得する v2 |
set aRec to {myAge:36, myHight:166, myWeight:70} set aLabel to "myHight" set a to getSpecifiedAttrOfRec(aRec, aLabel) of me –> 166 –与えられたレコードから指定の属性値ラベルの値を取り出して返す on getSpecifiedAttrOfRec(aRec, aLabel) –パラメータのエラーチェック。エラー時にはmissing valueを返す set aClass to class of aRec if aClass is not record then return missing value if aLabel = "" then return missing value if class of aLabel is not string then return missing value –レコードを無理矢理stringにcastして、エラーメッセージを取得する try set a to aRec as string on error aMes set a to aMes end try –エラーメッセージ文字列から、元のレコードの情報を組み立てる set b to trimStrFromTo(a, "{", "}") set b to "{" & b & "}" –動的にAppleScriptを生成して、無理矢理レコードから目的の属性値を取り出す set s to "return " & aLabel & " of " & b try set recData to run script s on error return missing value –指定の属性値が存在しなかった場合にはエラー end try return recData end getSpecifiedAttrOfRec on trimStrFromTo(aStr, fromStr, toStr) –fromStrは前から探す if fromStr is not equal to "" then set sPos to (offset of fromStr in aStr) + 1 else set sPos to 1 end if –toStrは後ろから探す if toStr is not equal to "" then set b to (reverse of characters of aStr) as string set ePos to (offset of toStr in b) set ePos to ((length of aStr) – ePos) else set ePos to length of aStr end if set aRes to text sPos thru ePos of aStr return aRes end trimStrFromTo –文字置換ルーチン on repChar(origText, targStr, repStr) set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr} set temp to text items of origText set AppleScript’s text item delimiters to repStr set res to temp as text set AppleScript’s text item delimiters to txdl return res end repChar |
Cocoaの機能を利用して(macOS 10.10以降)書くと、こんな感じです。
AppleScript名:レコードからラベルを指定して値を取り出し |
use AppleScript version "2.4" use scripting additions use framework "Foundation" set aDict to current application’s NSDictionary’s dictionaryWithDictionary:{abc:"123", bcd:"456"} set aVal to (aDict’s valueForKey:"abc") as string –> "123" |
More from my site
(Visited 66 times, 1 visits today)