Pagesで編集中の最前面の書類上で選択中の表オブジェクトに対して、行単位で逆順に入れ替えるAppleScriptです。Pages v11.1+macOS 12beta7で開発して使用しています。
Pagesの表操作機能には大したものはありませんが、さすがに昇順/降順のソートぐらいはできます。ただ、そうしたソートではなく、単純に順番を入れ替えたいといったときに処理する機能がありません。
この表データにはソート用のキーが存在していません。「軍隊の階級順にソート」とかいうお花畑な機能があれば使うんでしょうけれど、頭がいいヒトなら一時的にソート用の列を作ってシーケンシャル値を入れておき、逆順ソートして一時ソートキー列を削除することでしょう。
ただ、この「ソート用の一時データ列」すら作るのがめんどくさかったので、ありあわせの機能を使って使い捨てレベルのScriptを書いてみました。AppleScriptで書いておけば、同じ作業を行うさいに、2度目からは手間をかけずに行えますので。
PagesはiWork3兄弟(Keynote、Pages、Numbers)の中で、唯一、「selection」で各種選択中のオブジェクトを取得できます。Keynoteもこの仕様になってほしいのですが、違っています(Keynoteでは選択中のスライドが返ってくるだけ)。
正直なところ、いったんPages上の表のデータをコピペでNumbersに持って行って、Numbers側で並べ替えて手動でふたたびPagesの表に書き戻せばScriptを持ち出す必要もないんですが、繰り返し行う作業っぽいのでmacOS標準搭載のScript Menuに組み込んでおくことを前提に書いてみました。
ほぼ組み捨てレベルの使い捨てScriptなので、さまざまな条件でのテストは行っていません。何か問題があったらコメント欄でお知らせください。
Keynote/Pages/Numbers共通で、表のデータを取得すると1次元配列(1D List)で返ってきます。それはもう、既知の事実なので……1次元配列から2次元配列に変換するルーチンを用意して使っています。普通はBridgePlusの機能を呼び出して使うところですが、FileMaker ProのAppleScriptランタイム中でこれを呼び出せない(外部ライブラリの機能を一切呼び出せない)ことに苦しめられ、ちょっとBridgePlusを外しています。
AppleScript名:選択中の表オブジェクトのデータ行を逆順に.scpt |
— – Created by: Takaaki Naganoya – Created on: 2021/09/26 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "Pages" tell front document set aSel to selection if aSel = {} then return set aTarg to first item of aSel set aClass to class of aTarg if aClass is not equal to table then return –選択中の表オブジェクトを処理対象に tell aTarg set rCount to count every row set cCount to count every column set hCount to header row count set fCount to footer row count set allData to value of every cell of cell range –表中の全セルのデータを取得(1Dで返ってくる) set aRes to my subarraysFrom:(allData) groupedBy:(cCount) –1D Listの2D化 set bRes to items (1 + hCount) thru (-1 – fCount) of aRes set rList to reverse of bRes –逆順に –表にデータを書き戻す repeat with rC from (1 + hCount) to (rCount – fCount) tell row rC repeat with cC from 1 to cCount tell cell cC set tmpVal to item cC of item (rC – hCount) of rList –けっこういい加減 if tmpVal = missing value then set tmpVal to "" set value of it to tmpVal end tell end repeat end tell end repeat end tell end tell end tell –1D Listの2D化(BridgePlus不使用バージョン) on subarraysFrom:(aList as list) groupedBy:(gNum as integer) script spdObj property list : aList property bList : {} end script –Group Num check if gNum = 0 then return false if length of aList < gNum then return false if (length of aList) mod gNum is not equal to 0 then return set (bList of spdObj) to {} set tmpList to {} set aCount to 1 repeat with i in aList set j to contents of i set the end of tmpList to j set aCount to aCount + 1 if aCount > gNum then set the end of (bList of spdObj) to tmpList set tmpList to {} set aCount to 1 end if end repeat return (bList of spdObj) end subarraysFrom:groupedBy: |