「ページ単位でページを削除する」という機能を持たないPagesに対して、限定的ながらもページ単位の削除を行うAppleScriptです。Pages v11.2+macOS 12beta9で動作確認していますが、macOS 11.xやmacOS 10.15でも動作すると思います。
Pagesでまとまった内容の書類(例:書籍)を作る場合には、1書類にすべての内容を詰め込むのは自殺行為で、なるべく記事単位に分割するのがセオリーです。さすがに1ページあたり1書類といった作り方はしませんが、まとまった意味のある内容で1つの書類(扉ページと記事ページは別書類)ぐらいの分け方はします。
それというのも、Pagesがページ単位での入れ替えとかページ単位での削除、ページ単位での挿入といった操作系の機能が弱いからです。ページ単位での削除、入れ替えといった操作ができません。おまえはPagesなんて名乗らず「Overflow」とか名乗っとけ! という気持ちでいっぱいです。Page関連操作の弱いPages.app。
Pagesのヘルプで確認しても、ページ単位での削除については、「ページ上のオブジェクトを削除したあと、地に敷いている文字を削除して回れ」という、脳みそに何か湧いているような説明しか見当たりません。
ウィンドウ左に表示されているページのサムネイルを選択して、コンテクストメニューから「削除」を選ぶと書類の内容がまるごと削除されるという「わけのわからない」挙動をします。セクションを小分けしてある場合には、当該ページを含むセクションを削除してくれるようですが、1セクション=1ページという作り方をしていない場合には複数ページが削除されてしまいます。
–> Watch Page Removal Demo on Pages Movie
そこで、仕方なく本Scriptを作成してみたわけです。本Scriptの前バージョンとして「最終ページ上のオブジェクトの全削除」Scriptを作成して、実際にこれでページ削除が行える/行えないパターンについて検証を重ねてきました。実用性もある程度あったので、実際に作業で使ってもいました。
条件1:ページ削除は末尾側から行う。先頭側からは行えない
条件2:書類作成時に、ページの「地」に文字を置かず、テキストボックスを配置して文字を流し込んでいる
–> Watch Page Removal AppleScript Demo Movie
本Scriptでは、ページの地に直接「テキスト」や「表」を流し込んでいるような作り方の書類だと、書類上の内容をまるごと削除してしまいます。そういう場合には、Pages上の「表」などの元データが存在しているはずなので、そちらを再利用して別のPagesレイアウトに流し込み直すような対応になることでしょう。
なお、Pagesは(KeynoteやNumbersも)書類に変更を加えるとリアルタイムにファイルに変更が反映されるため、本Scriptのような道具でページ単位の削除をおこなった場合、「ファイル保存していないから、ファイルの再オープンを行えば復帰」ということはできません。あらかじめ、元の書類のコピーを作っておいた上で実行するようにしてください。
AppleScript名:末尾から指定ページまでページ削除.scpt |
— – Created by: Takaaki Naganoya – Created on: 2021/10/12 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.8" use framework "Foundation" use scripting additions set dMax to 3 –このページまで残す。ここから後はすべて削除する tell application "Pages" set dCount to count every document if dCount < 1 then display notification "Pagesでオープンしている書類はありません" return end if end tell set pMax to getPageNum() of me if pMax < (dMax + 1) then display notification "Pagesでオープンしている書類は、指定よりも少ないページ数であるため、削除の必要がありません" return end if –セクションごとのページ数のリストを取得 set aList to retSectionPageList() of me set bList to sectionPageListToSectionHeaderList(aList) of me repeat with i from pMax to (dMax + 1) by -1 tell application "Pages" tell front document –オブジェクト削除前のページ数 set pMax1 to getPageNum() of me tell last page delete every iWork item end tell –セクション先頭の場合 set curPStat to contents of item i of bList if curPStat = true then tell last section set body text to "" end tell end if –オブジェクト削除後のページ数 set pMax2 to getPageNum() of me –オブジェクト削除処理を行ってもページ数に変動がない場合には、last section上のbody textも消してみる if pMax2 = pMax1 then tell last section set body text to "" end tell end if end tell end tell end repeat –セクションごとのページ数のリストを、ページ単位のセクション開始位置リストに変換する on sectionPageListToSectionHeaderList(aList) set bList to {} repeat with tmpP in aList if tmpP = 1 then set the end of bList to true else set the end of bList to true repeat (tmpP – 1) times set the end of bList to false end repeat end if end repeat return bList end sectionPageListToSectionHeaderList –最前面の書類の各セクションごとのページ数を1Dリスト(1次元配列)で返す on retSectionPageList() tell application "Pages" tell front document set sList to every section set pList to {} repeat with i in sList set the end of pList to count every page of i end repeat end tell end tell return pList end retSectionPageList –最前面の書類のページ数を取得 on getPageNum() tell application "Pages" tell front document return count every page end tell end tell end getPageNum |