1次元リスト(配列)を幅を指定しつつ2次元リストとして評価し、1番左側のセルとの変化を横方向にサーチして検出するAppleScriptです。
もともと、macOS標準搭載の「辞書.app」に収録される各辞書データの名称が、各OSバージョンでどのように変化しているかを表計算ソフトNumbers上でチェックしていました。辞書.appの辞書をCocoa Frameworkを通じて呼び出し、さまざまな便利な処理を行っているため、辞書名称が変わると日常的に利用しているAppleScriptに影響が出てしまいます。その変化を検出するために、辞書名の変化を知っておこうというチェック作業が発生しています。
辞書.appの収録辞書名称は、意図したものか意図していないものか不明ですが、OSバージョンごとに微妙に変化することが知られています。そうした名称細部の変化を実際にチェックするのに、専用のScriptを使っていました(過去形)。
ただし、NumbersのデータをAppleScriptから取得すると、2D Listではなく1D Listとして返ってきます。そのさいに、BridgePlusの機能を用いて1D→2D変換を行ったのちに、いろいろ処理を行ってきました。
リストの1D→2D変換処理なんて、使っている場所が多すぎて数えきれないぐらいですが、Script Menu上で動かすScriptでBridgePlusを呼び出せなくなっており(macOS 10.14以降)、今後Script Menuが機能強化されるとは考えにくいところです。
サードパーティのFastScriptsなどでFramework入りScriptの実行をサポートするとか、そういう進化ができてほしいところですが、それもちょっと期待できません。
結果として、BridgePlusを極力使わなくて済むように、機能の置き換えを進めるしかありません。無理な機能もありますが、1D→2D変換ぐらいなら問題ありません(そして、出現頻度がおっそろしく高いものであります)。
そして、実際にNumbers上のデータを横方向(左→右、冒頭から末尾へ)に走査して変更を検出する処理を書いてみました。
処理に柔軟性が欲しかったので、追加でフラグ(reNewF)を用意しました。
これがfalseの場合には、横方向に変更を走査し、変化を検出した場合には評価を打ち切ります。trueの場合には、変化を検出した場合でも変化の検出を続行します。
AppleScript名:1D Listを2D的に評価してアイテム内の相違点を検出.scptd |
— – Created by: Takaaki Naganoya – Created on: 2022/06/28 — – Copyright © 2022 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aList to {1, 1, 1, 2, 3, 3, 3, 3, 3, 4, 3, 5} set diffRes to getListDifference2D(aList, 3, true) of me –> {{xAddrs:{2}, yAddr:2}, {xAddrs:{2}, yAddr:4}}–reNewF=falseで評価 –> {{xAddrs:{2}, yAddr:2}, {xAddrs:{2, 3}, yAddr:4}}—reNewF=true で評価 –1D Listを、2D Listとして評価しつつ、{cell1, cell2, cell3}のcell 1とcell2, cell3が違っていないか評価して返す on getListDifference2D(dList as list, aWidth as integer, reNewF as boolean) script tdSpd property dList : {} end script copy dList to (dList of tdSpd) set diffList to {} set diffAdrList to {} set yOffsetCount to 1 set aCountMax to ((length of dList) div aWidth) repeat with aC from 1 to (length of dList) by aWidth set tmpList to items aC thru (aC + aWidth – 1) of (dList of tdSpd) set i1 to first item of tmpList set i2 to rest of tmpList set xOffsetCount to 2 set xDiffList to {} repeat with ii in i2 set jj to contents of ii if i1 is not equal to jj then set the end of diffList to {i1, jj} set the end of xDiffList to xOffsetCount if reNewF = true then copy jj to i1 else exit repeat end if end if set xOffsetCount to xOffsetCount + 1 end repeat if xDiffList is not equal to {} then set the end of diffAdrList to {xAddrs:xDiffList, yAddr:yOffsetCount} end if set yOffsetCount to yOffsetCount + 1 end repeat return diffAdrList end getListDifference2D |