Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

配列の指定要素を検索する(テキスト)

Posted on 2月 7, 2018 by Takaaki Naganoya

配列(リスト)のうち、指定要素が何番目に登場するかを検索するAppleScriptです。

もともと、AppleScriptの配列に該当するリスト(list)は、非常に機能が素朴で、要素数を数える(length、count every item of)ほかはループで順次要素を取り出すとか、指定データが配列中に入っているかのチェックを行うとか(is in)、1番目の要素を取り出して元の配列から削除するといった程度の機能しかありません。「検索」については、データベース(FileMaker Proなど)に処理を依頼してね、というのが当初の立ち位置でした。

ただ、それだとたいした処理が書けないので、自力で配列の全要素をループして照合する、といった力技が全世界的に使われてきました。高速化を考慮しているとか、高度な技術を使っているとか、外部のOSAX(プラグイン形式の命令語拡張書類。macOS 10.14で廃止に)を利用するといっても「高級な力技」の域を出るものではありませんでした。

set aList to {9, 4, 2, 6, 4, 7}
set aTarg to 7
set aCount to 1

repeat with i in aList
  set j to contents of i
  
if j = aTarg then
    exit repeat
  end if
  
set aCount to aCount + 1
end repeat

return aCount

★Click Here to Open This Script 

macOS 10.6でXcode上記述するAppleScriptでCocoaの機能が利用できるようになり、macOS 10.10で通常のAppleScript上でもCocoaの機能が呼び出せるようになると、AppleScriptからCocoaの機能を利用することが検討されはじめました。

Cocoaの配列であるNSArray、NSMutableArrayは、多次元配列の作成や操作に難を抱えています(正直なところ、2次元配列の操作は補助プログラムを使わないとやりたくないレベル)。多次元配列の作成や操作ならCocoaの機能を使わずにAppleScriptだけで行なったほうが数億倍簡単です。

# その後、多次元配列専用のクラス「MLMultiArray」がCoreML.frameworkに用意されることになりました。AppleScriptからは直接アクセスできないんで、用はないんですが、、、

ただ、これらのCocoaの配列オブジェクトには検索や抽出などの機能があるため、複数キーによる検索程度なら少ない行数で記述することが可能です。さらに、いくつかの前提条件を満たせば、速度的なメリットもあります。

(1)AppleScriptの配列をCocoaの配列に変換するのに若干時間がかかる

まったく世界観が異なる世界の配列を変換するのに、若干時間がかかります。そのため、AppleScriptからCocoaの配列を使う目的が「スピードアップ」だとしたら、それに見合った「巨大なデータ」が処理対象であることが前提条件です。目安としては、AppleScriptの配列のアクセスが遅くなってくる(高速化処理を行えば、そのかぎりではありませんが)4,000項目以上、もう少しいえば10,000項目の配列の処理ぐらいでないと速度向上のメリットを感じにくいところです。

また、Cocoaの配列が持っている条件抽出や正規表現による抽出を使うぐらいでないと、「ただ漫然とループする」ぐらいでは使う価値がありません。

(2)Cocoaの配列にAppleScriptの世界のアプリケーションのオブジェクトを入れられない

Cocoaの配列には、AppleScript上で普通に扱っている「Photoshopの最前面のドキュメント」とか「iTunesで選択中の音楽トラック」といったオブジェクトを直接入れることはできません。これらのオブジェクトのIDを取り出して、「単なる数値」として扱うのであれば別ですが、これらのアプリケーションのオブジェクトをCocoaの配列に入れることはできません。

(3)AppleScriptの配列(リスト)とCocoaの配列(NSArray/NSMutableArray)はアイテムの開始値が違う

普通、配列といえば0番目の要素から始まりますが、AppleScriptでは1番目から始まります。そのため、Cocoaの配列の機能を利用するときには、これらの仕様の違いを念頭におく必要があります。

ここで紹介するのは、Cocoaの配列を作ってCocoaの配列の機能を利用して指定要素の登場位置を求めるものです。さらに、Cocoaのバグ(OSのバグ)に対処するために若干の処理を追加してあります。macOS 10.12〜10.13の間、定数「NSNotFound」の定義が間違ったまま出荷されていました。その値がAppleScriptで扱える範囲を超える巨大な定義値だったために、そのバグの影響を受けました。

過去の情報を調べてみたところ、AppleがNSNotFoundの定義値を間違えてOSを出荷するというのはこれが初めてのことではありません(2度目か3度目)。そんな基礎的かつ重要な値の定義を間違えるなんて●●としか思えないのですが、そういうことのようです。

AppleがNSNotFoundの定義値を今後も間違える可能性があるため、本来シンプルで済むはずの記述でもこの程度の対処が必要となります。

AppleScript名:AppleScript名:配列の指定要素を検索する(テキスト)
— Created 2015-09-02 by Takaaki Naganoya
— 2015 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aList to {"AAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCCCCCCCCCCCCCCC"}
set anArray to current application’s NSArray’s arrayWithArray:aList
–>  (NSArray) {"AAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBBB", "CCCCCCCCCCCCCCCCCCCCCCCC"}

–指定要素を検索する
set aInd to anArray’s indexOfObject:"CCCCCCCCCCCCCCCCCCCCCCCC"
if (aInd = current application’s NSNotFound) or (aInd > 9.999999999E+9) then
  return false
else
  return aInd
  
–>  2
end if

★Click Here to Open This Script 

More from my site

  • Wikipedia経由で2つの単語の共通要素を計算するcommon elements Lib Script LibraryWikipedia経由で2つの単語の共通要素を計算するcommon elements Lib Script Library
  • 画面上の指定座標にマウスカーソルを強制移動させてクリック画面上の指定座標にマウスカーソルを強制移動させてクリック
  • checkboxLibをアップデート(3)sdefにサンプルドキュメントを入れるcheckboxLibをアップデート(3)sdefにサンプルドキュメントを入れる
  • checkboxLibをアップデートcheckboxLibをアップデート
  • アイテム番号リストをもとに、ヒットしなかった項目を返すアイテム番号リストをもとに、ヒットしなかった項目を返す
  • メインScript側で宣言したglobal変数値をサブ側で使用するメインScript側で宣言したglobal変数値をサブ側で使用する
(Visited 1,226 times, 2 visits today)
Posted in list | Tagged 10.11savvy 10.12savvy 10.13savvy | Leave a comment

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • macOS 13.6.5 AS系のバグ、一切直らず
  • 開発機としてM2 Mac miniが来たのでガチレビュー
  • CotEditorで2つの書類の行単位での差分検出
  • Apple純正マウス、キーボードのバッテリー残量取得
  • macOS 15, Sequoia
  • Cocoa-AppleScript Appletランタイムが動かない?
  • macOS 14の変更がmacOS 13にも反映
  • ディスプレイをスリープ状態にして処理続行
  • 初心者がつまづきやすい「log」コマンド
  • Adobe AcrobatをAppleScriptから操作してPDF圧縮
  • 与えられた文字列の1D Listのすべての順列組み合わせパターン文字列を返す v3(ベンチマーク用)
  • macOS 13 TTS環境の変化について
  • macOS 14、英語環境で12時間表記文字と時刻の間に不可視スペースを入れる仕様に
  • メキシカンハットの描画
  • 新刊発売 AppleScript最新リファレンス v2.8対応
  • Pixelmator Pro v3.6.4でAppleScriptからの操作時の挙動に違和感が
  • 2023年に書いた価値あるAppleScript
  • 指定のWordファイルをPDFに書き出す
  • 可変次元のベクトルに対応したコサイン類似度計算
  • Safariで「プロファイル」機能を使うとAppleScriptの処理に影響

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (586) 10.15savvy (436) 11.0savvy (280) 12.0savvy (200) 13.0savvy (122) 14.0savvy (70) 15.0savvy (40) CotEditor (62) Finder (50) iTunes (19) Keynote (109) NSAlert (60) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (51) NSDictionary (27) NSFileManager (23) NSFont (19) NSImage (41) NSJSONSerialization (21) NSMutableArray (62) NSMutableDictionary (21) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (117) NSURL (97) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (65) Pages (50) Safari (44) Script Editor (24) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • Clipboard
  • Code Sign
  • Color
  • Custom Class
  • dialog
  • diff
  • drive
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC