v12で発生していた、新規書類をAppleScriptから保存できないバグは修正されていません。
タグ: Pages
Pages v12に謎のバグ。書類上に11枚しか画像を配置できない→解決
Pages v12に謎のバグを見つけました。Pagesでは書類上に任意の画像を配置できるわけですが、11枚目までは配置できるものの、12枚目を配置できません。実際には120枚ほど画像を用意してテストしていたので、12枚目が配置できればそれでOKかと言われれば、ぜんぜん不十分です。
→ OSの再起動を含む、追試を何回か行ってみたところ、その後このままでは画像の貼り込みができなくなっていました。そして、画像ファイル貼り込み前にパスの文字列をaliasにcastしたところ、問題なく120枚貼り込めました。
以前にも、Keynoteに「特定サイズ以上の表を作るとエラーになる」とかいったバグが発生していましたが、この12個目を配置するとエラーになるというのも、内部で何か不可思議なリミッターを設けているように見えます。
スクリプトエディタ、Script Debuggerの両方で発生しています。おそらく、ランタイム環境が何であるかはこの問題に影響を与えていません。
macOS 10.12以降で、日本語環境限定で発生しているバグで有名なものに、「日本語入力Input Method経由でファイル名を入力している最中に、不必要な不可視文字が入力されてしまい、これがファイル処理を妨げる危険性がある」というものがありますが、これらの画像のファイル名をチェックしたところ、そうした危険な不可視文字は混入していませんでした。
# こうした、複数チームの担当製品の間で発生しているバグは、どこが担当してバグを調査するということはないようです。組織の細分化にともない、こうした組織境界面でバグが発生するととたんに無責任になるのがいまのAppleです(組織の構造上の問題です)
ちなみに、GUI経由で画像をPages書類上に配置してみたところ、12枚以上配置できました。Pagesにそのような上限が存在しているわけではないようです。
Pages書類(バンドル書類)内で何かファイル名の重複のようなものが発生したのかと考え、別の画像を(番号をずらして)指定してみましたが、同様の枚数を配置した時点でエラーになりました。
内部で発生している(していた)別のエラーを発生させないように、謎のリミッターをかけていた可能性もありますが、その必然性がよくわかりません。
AppleScript名:指定の画像をPagesに順次貼り込む(12枚で止まってしまう!).scpt |
set baseName to "book24_" set baseFol to (choose folder) as string set pMax to 10 (* tell application "Pages" –set newDoc to make new document tell front document set dCount to count every page repeat with i from (dCount + 1) to pMax make new page end repeat set newDCount to count every page end tell end tell *) repeat with i from 1 to 120 set aFN to baseFol & baseName & makeFN(i, 4) of me & ".jpg" tell application "Pages" tell front document tell page i set newItem to make new image with properties {file:aFN} tell newItem set position of it to {0, 0} set height of it to 843 –set position of it to {-1, 0} set locked to true end tell end tell end tell end tell end repeat on makeFN(aNum, aDigit) set aText to "00000000000" & (aNum as text) set aLen to length of aText set aRes to text (aLen – aDigit + 1) thru -1 of aText return aRes end makeFN |
iWorkアプリケーションv12に共通のバグ? 新規ファイルの保存ができない
Apple iWorkアプリケーション(Keynote、Pages、Numbers)の最新バージョンv12.0において、共通のバグがあるのではないか? と見ています。もちろん、見ているだけでなくAppleにバグレポートもしています。
症状は、新規作成した書類を「保存できない」というものです。
以前にも、PDFをexportできないという致命的なバグが発生していましたが、今回のも同様のメカニズムで発生しているものと見ています。つまり、「Appleが自社OSに設定したセキュリティ機能によって、自社アプリであるKeynote、Pages、Numbersが自家中毒を起こしている」という状態です。
自分の勘違いだとよいのですが….
あとは、Numbersのsaveコマンドをよく見てみると、書類フォーマットに「as Numbers」というenumがあるのですが、これはAppleScriptの処理系では「number」の複数形として認識されてしまうので、この予約語自体に無理があります。ここは、「as Numbers format」といった予約語に変えるべきです。
AppleScript名:Keynoteで新規書類作成して指定名称で新規保存.scpt |
set dtPath to (path to documents folder) as string set uuidStr to (do shell script "uuidgen") & ".key" set savePath to dtPath & uuidStr tell application "Keynote" set nDoc to make new document with properties {document theme:theme id "Application/21_BasicWhite/Standard", width:1024, height:768} save nDoc in file savePath as Keynote end tell |
AppleScript名:Pagesで新規書類を作成して指定名称で新規保存.scpt |
set dtPath to (path to documents folder) as string set uuidStr to (do shell script "uuidgen") & ".pages" set savePath to dtPath & uuidStr tell application "Pages" set nDoc to make new document with properties {document template:template id "Application/Blank/ISO"} save nDoc in file savePath as Pages Format end tell |
AppleScript名:Numbersで新規書類作成して指定名称で新規保存.scpt |
set dtPath to (path to documents folder) as string set uuidStr to (do shell script "uuidgen") & ".numbers" set savePath to dtPath & uuidStr tell application "Numbers" set nDoc to make new document save nDoc in file savePath as numbers –change "Numbers" word into "numbers format" because "numbers" is alredy registered as "list of number" or "every number" end tell |
iWork Appsがバージョン12.0にアップデートでselection動作正常化
昨日、iWork Apps(Keynote、Pages、Numbers)がVer.12.0にバージョンアップしていました。
AppleScript系ではgetコマンドが追加(Keynote、Pages)されたぐらいですが、これによって「selection」の動作がまともになりました。
前バージョンのアップデートで「スライド単位の選択」がselectionで取れなくなったことで、「何か変更しようとしている最中なんだろう」とは思っていました。予想どおりです。selection動作の空白期間を置かず、前バージョンの段階で実装されていたらもっとよかったのですが。
AppleScript対応アプリケーション、スクリプタブルなアプリケーションの世界観は、小さい世界観のものから大きい世界観のものまでいろいろです。
小さい世界観1(一番小さい):
アプリケーション起動、バージョン確認、書類のオープン、書類の印刷、アプリケーションの設定情報の確認
小さい世界観2:
小さい世界観1+アプリケーション固有のコマンドの実行
小さい世界観3:
小さい世界観2+書類やデータ作成のための機能、選択中のデータをおおまかに取得する機能
Keynote v11.xはここ
小さい世界観4:
小さい世界観3+書類上のオブジェクト作成/改変機能、選択中のデータやオブジェクトへの参照を取得する機能
Keynote v12.xはここ? まだ、Chart作成などで未サポートのグラフ形式などもあり、不完全
大きい世界観:
小さい世界観4+書類上のオブジェクトの多数を作成/改変する機能
Adobe InDesign、Word、Excel、PowerPoint、Pixelmator Proなど。かつての(v5ぐらいの)Pagesはここにいた
Keynoteでselectionを試してみたところ、何か書類上のオブジェクトを選択してselectionを実行すると、オブジェクトへの参照を(複数、リスト形式で)取れます。オブジェクトを選択した状態でなければ、書類上のどのスライドを表示中かというスライドへの参照が取得できるようです。
Keynoteにおける処理の自由度は大幅に上がりました。選択中のテキストボックスを取得できれば、その中に含まれるテキストなり書式つきテキストを取得して、書き直し、元のテキストボックスに書き戻すことができます。
選択中のイメージを取得できれば、その画像のパスを求めるかあるいはファイル名を求めて、オリジナルの画像ファイル(書類内に格納された画像、外部に存在する画像かはやってみないと)を画像フィルタ処理などを行って書き戻すといった処理が行いやすくなります。以前までのバージョンでは、選択した画像をいったんコピーしてクリップボードに格納し、そのクリップボード内の画像に対して画像処理していました。
Pagesでも、さまざまなオブジェクトへの参照がselectionによって取得できますが、あいかわらず「ページ」という概念があるんだかないんだか不明で、アプリケーションの根幹にかかわる部分なのでいまひとつ気軽に言えないところではあります。
書籍フォルダの階層をさかのぼって、ツメに掲載する最大チャプターを推測 v2
電子書籍を作るのにPagesやKeynoteを使っており、「AppleScriptによるWebブラウザ自動操縦ガイド」(以下、Webブラウザガイド)も全ページPagesで作っています。
PagesやKeynoteでは書籍作成用としては機能が素朴すぎて、足りない点はAppleScriptでツールを作って、作業の手間を減らしています。それらの補助Scriptは、各種パラメータをその本に合わせて固定して使用しています。
Webブラウザガイドは全14章で構成されているため、ページの左右につけている「ツメ」(Index)は1から14までの数字が入っています。
今後もツメチェックAppleScript(座標、塗りつぶし色と非選択色の自動判別、ファイル名からの該当章の自動ピックアップ)を他の書籍用にも運用していくつもりですが、この「全14章」という仕様は固定なので、章構成が異なる他の本のプロジェクトでは、自動で章の数をかぞえてくれるとよさそうだと考えました。
だいたい電子書籍のファイルについては、フォルダ分けして2階層ぐらいで管理しているので、その階層数については決め打ちでDoc rootフォルダを計算(parent of parent of….)するようにしました。そして、全フォルダのフォルダ名称を取得。
ダイアログで最終章を選択させると、そこから章番号を自動抽出して(「XX章」と書かれていることが前提)、その番号を返します。
こういう用途を考えると、階層構造をそのまま選択できるNSOutlineViewを選択用の部品に使えると便利で……これまでにもedama2さんと意見交換しつつNSOutlineViewをNSAlertダイアログ上に表示するといった試作も何回か検討してきたのですが、スクリプトエディタ/Script Debugger上で記述するAppleScriptObjCではこの部品を扱うのがとても難しいんですね。
ならば、Xcode上で記述するAppleScriptObjCにAppleScript用語辞書を持たせて、階層ファイル構造を選択させる専用の補助アプリケーションを作ってもいいのかも? ただ、Xcode 13.x系が壊れて使えないままの環境であるため、いまXcodeでビルドするわけにもいかないのでした。
choose fileコマンドやchoose folderコマンドに「icon view」「list view」「column view」といった初期表示状態を指定できる機能があれば、それで済むような気もしますが、どうせAppleに要望出してもこういうのは通らないので、自分で作ったほうが確実で早いですわー。
にしても、この通常ウィンドウと見分けがつかないファイル選択ダイアログ、macOS 11で最初に見たときには「正気か?!」と、腰を抜かしました。あいかわらず、この決定を下した責任者は●●だと思いますが、せめてもう少し視覚的に見分けがつくようにできなかったもんでしょうか。
AppleScript名:書籍フォルダの階層をさかのぼって、ツメに掲載する最大チャプターを推測 v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2022/02/26 — – Copyright © 2022 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 filePath to (file of it) as alias end tell end tell tell application "Finder" set parentFol to (parent of parent of filePath) tell parentFol set fNames to name of every folder end tell end tell set folName to contents of (choose from list fNames with prompt "書籍のツメに載せる最終章のフォルダを選択") set cNum to retChapter(folName as string) of me –> 14 –ファイル名から「章」情報を抽出 on retChapter(aStr) set wList to words of aStr set aCount to 1 repeat with ii in wList set jj to contents of ii if jj = "章" then return contents of item (aCount – 1) of wList end if set aCount to aCount + 1 end repeat return 0 –Illeagal file name end retChapter |
Pages書類内の表の指定ラベルの行を削除
Pagesの書類上にある表に対して、指定のラベルを持つ行を削除するAppleScriptです。macOS 12.3beta2+Pages 11.2で動作確認しています。
現在作成中のWebブラウザのScripting本で、各種AppleScript実行環境の一覧表を掲載しているのですが、
それぞれの差別化ポイントとして掲載していたデータのうちの1つが、執筆後に一律で解決できることになり(NSAlertダイアログの最前面表示)、そのデータ行については削除することになりました。
そこで、複数のPages書類に記載した表を一括で削除することになり、AppleScriptを組んで削除することにしました。
必要はありませんでしたが、ヘッダー列が1列だけでなく、複数の列になった場合と、ヘッダーの複数セルが1つにまとめられていた場合への対処も行っておきました。ただし、気休め程度であって、本気で対処したものではありません。
AppleScript名:Pages書類内の表の指定ラベルの行を削除.scpt |
— – Created by: Takaaki Naganoya – Created on: 2022/02/14 — – Copyright © 2022 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" use framework "Foundation" use scripting additions set targRowLabel to "NSAlert ダイアログの最前面表示" tell application "Pages" tell front document set tList to every table whose column count = 2 end tell end tell delRowInEveryTable(tList, targRowLabel) of me on delRowInEveryTable(tList as list, targRowLabel as string) tell application "Pages" repeat with i in tList set j to contents of i tell j set hCCount to header column count set hRCount to header column count –ヘッダーカラムが複数存在している場合に対処? repeat with hc from 1 to hCCount tell column hc set aList to value of every cell end tell if targRowLabel is in aList then set aRes to search1DList(aList, targRowLabel) of me –ヘッダー列に削除対象ラベルが存在しつつ、削除対象ラベルがヘッダー行の範囲ではない場所に出現した場合に削除 if (aRes is not equal to false) and (aRes ≥ hRCount) then try –ねんのため delete row aRes end try end if end if end repeat end tell end repeat end tell end delRowInEveryTable on search1DList(aList, aTarg) set anArray to current application’s NSMutableArray’s arrayWithArray:aList set anIndex to anArray’s indexOfObject:aTarg if (anIndex = current application’s NSNotFound) or (anIndex > 9.99999999E+8) then return false end if return (anIndex as integer) + 1 –convert index base (0 based to 1 based) end search1DList |
Pagesのテキストアイテム内の文字の実際の幅でリサイズ
Pagesでオープン中の最前面の書類の上に載っている(Pagesの仕様でページ指定はできない)テキストアイテムから、テキスト、フォント、フォントサイズを取得し、その内容でスタイル付きテキストを作成して画面上に描画するサイズを取得し、その幅でテキストアイテムをリサイズするAppleScriptです。
macOS 12.2beta+Pages 11.2で動作確認しています。
Pages上のタブの指定までスタイル付きテキスト内で再現できていないためか、中身の幅よりも外側のテキストアイテム(枠)が小さくなってしまうケースが見られますが、もう少し枠のリサイズを余裕を持って(大きめに)指定すると回避できます。
AppleScript名:Pagesのテキストアイテム内の文字の実際の幅でリサイズ |
— – Created by: Takaaki Naganoya – Created on: 2021/12/25 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" property NSFont : a reference to current application’s NSFont property NSString : a reference to current application’s NSString property NSDictionary : a reference to current application’s NSDictionary property NSFontAttributeName : a reference to current application’s NSFontAttributeName tell application "Pages" tell front document set tList to every text item if tList = {} then return repeat with i in tList set j to contents of i tell j set tmpFontName to font of its object text set tmpFontSize to size of its object text set tmpText to (its object text as string) & " " set aSize to getSizeFromAttributedText(tmpText, tmpFontName, tmpFontSize) of me set aWidth to |width| of aSize set bWidth to aWidth + 10 set its width to bWidth end tell end repeat end tell end tell –指定のテキスト、フォント名、フォントサイズでAttributed Stringを組み立ててサイズを取得する on getSizeFromAttributedText(aText as string, aFont as string, aFSize as real) set aFont to NSFont’s fontWithName:aFont |size|:aFSize set aStr to NSString’s stringWithString:aText set aSize to aStr’s sizeWithAttributes:(NSDictionary’s dictionaryWithObjects:{aFont} forKeys:{NSFontAttributeName}) return aSize end getSizeFromAttributedText |
Pagesで選択中の表のカラム幅を自動調整
Pagesの最前面の書類で選択中の表オブジェクトの2列目以降を均等に自動調整するAppleScriptです。
1列目の列幅は変更しません。表全体を選択するのではなく、どこかのセルを選択しておく必要があります。
▲処理前 カラム幅が不均一。表の1つあるいは複数のセルを選択して処理対象を指定
AppleScript名:Pagesで選択中の表のカラム幅を自動調整 |
— Created 2021-12-18 by Takaaki Naganoya — 2021 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –現在選択中の表オブジェクトを取得 set curTable to returnSelectedTableOnCurrentSlide() of me if curTable = false then return –現在選択中の表オブジェクト中の選択範囲中のセルをすべて取得(1D List) using terms from application "Pages" tell curTable set cellList to every cell of selection range end tell end using terms from –2列目から末尾までの列幅を均等に変更する using terms from application "Pages" tell curTable set cCount to count every column set cWidth to width of every column –表の幅を取得したら、0が返ってきたので、各カラム幅を合計した set aWidth to calcSumFrom1DList(cWidth) of me set aveWidth to (aWidth – (first item of cWidth)) / (cCount – 1) –いったん幅を少なくしておく(予備動作) –途中で幅がページ幅をオーバーすると最終的な表の幅がおかしくなるので、この処理がないとおかしくなる repeat with i from 2 to cCount set width of column i to 10 end repeat –カラム幅を変更する repeat with i from 2 to cCount set width of column i to aveWidth end repeat end tell end using terms from –1D List中の数値を合計して返す on calcSumFrom1DList(aList) set anArray to current application’s NSArray’s arrayWithArray:aList return (anArray’s valueForKeyPath:"@sum.self")’s intValue() end calcSumFrom1DList –現在のスライド上で選択中の表オブジェクトへの参照を取得する on returnSelectedTableOnCurrentSlide() tell application "Pages" tell front document try return (first table whose class of selection range is range) on error return false –何も選択されてなかった場合 end try end tell end tell end returnSelectedTableOnCurrentSlide |
Pages末尾から指定ページまでページ削除
「ページ単位でページを削除する」という機能を持たない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 |
Pages書類の最終ページ上のすべてのオブジェクトを削除
最前面のPages書類のうちの最終ページ上のオブジェクトとテキストを削除するAppleScriptです。
Pagesで凝ったレイアウトの書類を作る場合、やりかたはいくつかありますが……ページはすべてセクション(改ページ処理みたいなもの)を入れて1ページ=1セクションみたいにページを作って、その上にテキストフレームを配置、ページ間のテキストフレームの連続はGUI上で指定しておき、テキストが先頭から末尾まで、指定ボックス上を流れていくように指定しています。
別途、脚注のテキストは別のテキストボックスを配置しておき、こちらも前ページの脚注と連結する必要があればつないでおきます。
そのうえで、このように作成したPages書類を前後で分割しようとした場合に、
(1)書類をコピー
(2)前半の書類は、後半部分を削除
(3)後半部分の書類は、前半部分を削除
となるわけです。
が、Pagesに「指定ページを削除」する機能はないので、このようなScriptを組んでいろいろ対処を行っています。
本Scriptは、(2)の処理を行うためのものです。最終ページ上のオブジェクトおよびテキストを削除することで、ページ自体を削除できます。
あとは、1ページ=1セクションで書類が構成されているかどうかをチェックすれば、ページ削除とほぼ同義で扱えるところです。
AppleScript名:末尾のページのオブジェクトを全削除.scpt |
tell application "Pages" tell front document tell last page delete every iWork item end tell tell last section set body text to "" end tell end tell end tell |
iWorks Apps v11.2が登場
Apple純正のiWorks App(Keynote、Pages、Numbers)の新バージョンv11.2がリリースされました。
バージョン番号が「11.1」から「11.2」に変わっただけですが、内部的にも…各アプリケーションともアイコン自体が変更になり、大きな節目のバージョンであることが伺われます。
iOS、iPadOSが新製品とともに9月にアップデートし、iWorkアプリケーションがアップデートした後にmacOSのアップデートが行われるわけで、実にリリース間近であることを感じさせます。Windows 11の発表日がどの程度注目を浴びているかはわかりませんが、10月5日より前に発表することは…ないのではないかと(ノーアイデアです)。
これらのアプリケーションのAppleScript用語辞書については、「get」コマンドが追加されたことを確認していますが、このコマンドがないと実現できないことが不明(普通は省略されるコマンド)なので、何か後で追加するための「布石」と見るのが正しい見方でしょう。
Keynote v11.2の変更点:
・スライド上のライブビデオ
・複数発表者スライドショー
・レーダーグラフ(レーダーチャートのこと)
Pages v11.2の変更点:
・ブックの公開の改善
・素早くテキストを翻訳
・レーダーグラフ(レーダーチャートのこと)
Numbers v11.2の変更点:
・強力なピボットテーブル
・レーダーグラフ(レーダーチャートのこと)
・フィルタの改善
そして、AppleScript用語辞書に「レーダーグラフ」の作成機能は反映されていないため、まだAppleScriptから追加することはできません。通例だと、マイナーアップデート2回後ぐらいに反映されるのではないでしょうか?
Pages v11.2でトンでもない変更が加わっていることが判明しました。なんと、selectionを取得できなくなっています。
これは、Pagesの数少ない長所だったのですが、selectionを取得できないととても困ります、、、、、
一応、フィードバックしておきましたが、直るかどうかは不明です。Pagesの唯一の美点であった、selectionを返せ!!!
Keynote v11.2でも、selectionが使えなくなっていました(スライド単位の選択も無効に)。
Pagesでページ数とfacing pagesフラグの値から右側ページを判定
Pagesでページ数とfacing pagesの値から該当のページが右側に存在するかどうかを判定するAppleScriptです。
ページが右側にあるかどうか、というこの判定処理はツメ処理のために用意したものです。見開きの右側に置くのが基本といいますか、別に左側にもあってもいいんですが、右側ページ右端に置いた縦長の表オブジェクトをツメと見立てて処理することに(個人的に)したためです。
▲同一のPages書類を「見開きページ」の設定をオフにした状態(左)、オンにした状態(右)でページの並びが変わる
AppleScript名:Pages書類のfacing Pagesを取得.scpt |
set fRes to getFacingPages() of me on getFacingPages() tell application "Pages" tell front document return facing pages end tell end tell end getFacingPages |
こんな記述でfacing pagesの値を取得でき、この値とページ数(ノンブル)をもとに奇数ページ、偶数ページの判定を行い、ページの左右を判定できます。
本Scriptを実行すると、以下のようにログ表示を行います。{facing pages, ノンブル, 右側ページかどうかの判定結果}を表示しています。
(*false, 1, false*) (*false, 2, true*) (*false, 3, false*) (*false, 4, true*) (*false, 5, false*) (*false, 6, true*) (*true, 1, true*) (*true, 2, false*) (*true, 3, true*) (*true, 4, false*) (*true, 5, true*) (*true, 6, false*)
以前にどこかで「奇数/偶数の判定処理なんて、素朴な処理をサブルーチンとして独立して用意しておくのか?」と聞かれたことがありましたが、このように、サブルーチンとして用意しておいたので簡単に使い回して利用できているわけです。
AppleScript名:Pagesのページ番号の該当ページが右側にあるかどうか計算.scpt |
set flagList to {false, true} repeat with i in flagList set aFlag to contents of i repeat with aPage from 1 to 6 set rRes to checkPagesRightPage(aPage, aFlag) of me log {i, aPage, rRes} end repeat end repeat –Pagesのページ番号の該当ページが右側にあるかどうか計算 on checkPagesRightPage(aNum, aFlag) set oddF to chkOddNum(aNum) of me –奇数チェック if {aFlag, oddF} = {true, true} then return true –右側ページ else if {aFlag, oddF} = {false, false} then return true –右側ページ else return false end if end checkPagesRightPage –奇数かどうかチェック on chkOddNum(aNum) set a to aNum mod 2 if a = 1 then return true else return false end if end chkOddNum –偶数かどうかチェック on chkEvenNum(aNum) set a to aNum mod 2 if a = 0 then return true else return false end if end chkEvenNum |
Pagesで選択中の表オブジェクトのデータ行を逆順に
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: |
Pagesの座標系
ここしばらくPagesで書類を作る日々が続いていました。間もなく終わりそうな気配です。
Pagesは不思議なワープロというか簡易DTPアプリケーションで、Keynoteから派生したという独特の出自からして、さっさと何かページレイアウトを作って仕上げる……という味付けのアプリケーションであります。
さっさと作るのは、比較的苦もなくできます。1ページもののレイアウトぐらいならそうでしょう。
複数ページのレイアウトになってくると、やや大変です。ルーラーを表示して、ページのレイアウト範囲に補助線を引いて参考にするという作業が……できないことはないのですが、毎ページルーラーを引き直す必要があります。
書類のマスターページという概念がなく、いきなりテンプレートを作らされます。
それでも、1書類で巨大な内容を作らない。書類を極力小分けにする、といった方法でなんとか使いこなしてきました。
昔のバージョンのPages(iOSとソース共通化する前、旧Pagesと呼ぶ)は、もっとDTPソフトっぽい機能を有しており「普通のユーザーが使えるInDesign」とも言われ、けっこうよかったのですが……。
そんな現在のPagesではありますが、いろいろと対策が進んで作れるドキュメントの幅や分量も増えてきました。いま、200ページぐらいのコンテンツをPagesだけで作っていますが、もちろん書類は小分けにしまくっています。
その、Pagesの書類も分量が増えてくると……ヤツを入れたくなってきます。入れないとわからなくなってきます。ツメです。
DTP系の人間にはおなじみの「手で作るのはごめん被りたいアイテム第1位」のアレです。手で作るなんて正気の沙汰ではありません。
でも、Pagesにその機能がないので、手作りしました。手作りしたのちに、やっぱプログラムで制御しないとしんでしまうと思い、いろいろ調べだしました。
そして知るのです。Pagesの座標系が全ページつながった独自のものであることを。
つまり、ツメの(縦方向、Y軸)の各ページ単位の座標系がないので、各ページのY座標の原点からの相対座標を計算するためには、ページの物理的なサイズ(座標的なX、Y軸の上限値)を知る必要があります。
ページの物理的なサイズを取る手段があるだろ……ない。
テンプレートには物理的なサイズの定義とかが……ない。
現在編集中の書類のページのサイズがわからないのは、けっこう困りますが……オブジェクトのサイズは計測できるので、あらかじめ各テンプレートの上にページいっぱいのサイズでオブジェクトを作っておいて、そのオブジェクトのサイズ(width、height)を調査。
テンプレート名称なりIDから、ページサイズ表を検索して、座標的なサイズを取得するしかないでしょう。
Pagesで最前面の書類中のテキストアイテムと本文テキストで文字サイズが最大のもののテキストを求める
Pagesの最前面の書類中のテキストアイテム(ボックス)中のテキストと、本文テキスト(body text)で文字サイズが最大のものを取得するAppleScriptです。Pagesで書いた書類からタイトルらしきものを抽出するために書いたものです。
まず、前提条件を書いておかなければなりません。
一般的なDTPアプリケーション(InDesignとか)やワープロであれば、書式スタイルが「タイトル」のテキストを求めるといった処理になりますが、Pagesにはその機能がありません。正確にいえば、PagesのAppleScript用語辞書にはその機能がありません。そこで、「各文書のタイトルには文章中で最大の文字サイズを設定しておく」というルールを自分に課して、文字サイズが最大のものを取得すればタイトル文字列が取得できるように決めておきました。
テキストアイテム中の最大サイズの文字を抽出し、そのあとで本文テキスト(body text)の最大サイズの文字を抽出、両者の間で最大サイズのものを求めて返します。
目下、実際に本を書き出すのに「指定フォルダ以下のPages、Markdown、Word Document、PDFをすべてPDF化してファイル名順でソートして結合」するAppleScriptを作って利用しているのですが、これにTOCつきPDFを書き出す機能を結合できるといいなーと思って書いています。
Keynote書類からTOCつきPDFを書き出すAppleScriptは実戦レベルのものを作って運用しており、これを用いて電子書籍を作っています(逆をいえば、このAppleScriptの開発に成功したのでバカスカ電子書籍を作れているわけで)。
TOCつきPDFをPagesなどの書類群から書き出せるようになれば、PagesやMarkdownで書いた書籍も自動でTOCつきPDFを生成できるわけで、PagesやMarkdown系の書類で作った書籍も手軽に生成できるようになるはずです。
AppleScript名:pagesTitleLib.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/12 – Modified on: 2021/04/10 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSString : a reference to current application’s NSString property NSCharacterSet : a reference to current application’s NSCharacterSet property NSMutableArray : a reference to current application’s NSMutableArray set aRes to pagesTitleGetter() of me –> "商標、著作権について" on pagesTitleGetter() set tiList to getLargestTextItem() of me –Text Item set bList to getLargestBodyText() of me –Body Text if tiList = {} and bList = {} then return "" if tiList = {} and bList ≠ {} then set allList to bList if tiList ≠ {} and bList = {} then set allList to tiList set allList to tiList & bList –> {{10.0, "Macrovector – jp.freepik.com によって作成された business ベクトル"}, {16.0, "商標、著作権について"}} set allRes to returnMaxItem(allList, 1, 2) of me set bRes to repChar(allRes, string id 10, "") of me set bRes to repChar(bRes, string id 13, "") of me return bRes end pagesTitleGetter –2D Listのうち、指定アイテム目の最大値をもとめ、その指定アイテムを返す on returnMaxItem(aList, seekItemNum, retItemNum) script spd property aList : {} end script set (aList of spd) to aList set tmpMax to 0 set tmpItem to 0 set aCount to 1 repeat with i in (aList of spd) set tmpV to item seekItemNum of i if tmpV > tmpMax then copy tmpV to tmpMax set tmpItem to aCount end if set aCount to aCount + 1 end repeat return item retItemNum of item tmpItem of (aList of spd) end returnMaxItem –Pagesの最大文字サイズのText Item中の最大テキストを返す on getLargestTextItem() set rList to {} tell application "Pages" if not running then return {} if every document = {} then return {} tell front document set tmpList to every text item if length of tmpList = 0 then return –テキストアイテムがない場合には処理終了 set szList to size of object text of every text item if szList is not equal to {} then set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のテキストアイテムを抽出 –set resList to object text of every text item whose size of object text is aMaxPoint set resList to every text item whose size of object text is aMaxPoint repeat with ii in resList –指定のtet item内の文字のサイズをすべて取得 set cList to size of every character of object text of ii –文字サイズのうち最大のものを取得 set cMax to calcMax(cList) of me –最大サイズの文字のみ抽出 set cRes to (every character of object text of ii whose size = cMax) set cText to cRes as string –取得したテキストの前後の改行などを削除してクリーンアップ set c2Text to cleanUpTextFromHEadAndTail(cText) of me set c2Text to repChar(c2Text, string id 10, "") of me set c2Text to repChar(c2Text, string id 13, "") of me –何か結果が得られていたら、リストに加える if c2Text is not equal to "" then set the end of rList to {cMax, c2Text} end if end repeat end if end tell end tell return rList –> {{10.0, "Macrovector – jp.freepik.com によって作成された business ベクトル"}} end getLargestTextItem on getLargestBodyText() set esList to {} tell application "Pages" if not running then return {} if every document = {} then return {} tell front document set sCount to count every section repeat with i from 1 to sCount tell section sCount set sList to size of every character of body text if sList is not equal to {} then set cMax to calcMax(sList) of me –最大サイズの文字のみ抽出 set cRes to (every character of body text of it whose size = cMax) set cText to cRes as string –取得したテキストの前後の改行などを削除してクリーンアップ set c2Text to cleanUpTextFromHEadAndTail(cText) of me set c2Text to repChar(c2Text, string id 10, "") of me set c2Text to repChar(c2Text, string id 13, "") of me set tmpList to {cMax, c2Text} set the end of esList to tmpList end if end tell end repeat end tell end tell return esList end getLargestBodyText on repChar(origText as string, targStr as string, repStr as string) 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 on calcMax(aList as list) set nArray to (NSMutableArray’s arrayWithArray:aList) set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubleValue() return maxRes end calcMax on cleanUpTextFromHEadAndTail(aStr) set aString to NSString’s stringWithString:aStr set bStr to (aString’s stringByTrimmingCharactersInSet:(NSCharacterSet’s whitespaceAndNewlineCharacterSet())) return bStr as string end cleanUpTextFromHEadAndTail |
最前面の書類中のテキストアイテムの文字サイズが最大のものの中に入っている最大のテキストを求める
以前に作った、Pagesのページ中のテキストアイテムのうち最大文字サイズのものを抽出するAppleScriptの強化版です。その最大文字サイズの文字を含むテキストアイテムの中から、さらに最大文字サイズのテキストを取り出します。
タイトル部分(と思われるテキストアイテム)から、さらに最大文字サイズのものだけを抽出。
用途は、Blog新アーカイブ本の作成時に書類からタイトルを取り出す処理を行えないか実験してみたものです。このページだけ、この例外のデータだったのですが、あとから考えれば文字サイズの小さなサブタイトル的なものは別のテキストアイテム(ボックス)に分ければよかっただろうかと。
AppleScript名:最前面の書類中のテキストアイテムの文字サイズが最大のものの中に入っている最大のテキストを求める.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/12 – Modified on: 2021/04/10 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSString : a reference to current application’s NSString property NSCharacterSet : a reference to current application’s NSCharacterSet property NSMutableArray : a reference to current application’s NSMutableArray set rList to {} tell application "Pages" tell front document set tmpList to every text item if length of tmpList = 0 then return –テキストアイテムがない場合には処理終了 set szList to size of object text of every text item set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のテキストアイテムを抽出 –set resList to object text of every text item whose size of object text is aMaxPoint set resList to every text item whose size of object text is aMaxPoint repeat with ii in resList –指定のtet item内の文字のサイズをすべて取得 set cList to size of every character of object text of ii –文字サイズのうち最大のものを取得 set cMax to calcMax(cList) of me –最大サイズの文字のみ抽出 set cRes to (every character of object text of ii whose size = cMax) set cText to cRes as string –取得したテキストの前後の改行などを削除してクリーンアップ set c2Text to cleanUpTextFromHEadAndTail(cText) of me –何か結果が得られていたら、リストに加える if c2Text is not equal to "" then set the end of rList to c2Text end if end repeat end tell end tell return rList –> {"Shane StanleyのScript Toolの変遷"} on calcMax(aList as list) set nArray to (NSMutableArray’s arrayWithArray:aList) set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubleValue() return maxRes end calcMax on cleanUpTextFromHEadAndTail(aStr) set aString to NSString’s stringWithString:aStr set bStr to (aString’s stringByTrimmingCharactersInSet:(NSCharacterSet’s whitespaceAndNewlineCharacterSet())) return bStr as string end cleanUpTextFromHEadAndTail |
iWork Appsがv11.0にアップデート、Keynoteの恥ずかしいバグが直る
iWork Apps(Keynote、Numbers、Pages)がバージョン11.0にアップデートされました。
3アプリ共通でAppleScriptから書類のパスワード設定確認、パスワード設定の機能が追加されています。
また、Keynote v10.3.5、v10.3.8とmovie書き出し時のCodec指定オプションに「h.264」とAppleScriptの処理系ではエラーになる記号を含む予約語が入っていたのですが、これがv11.0で「h264」と修正されました。
# 記号を含む予約語は禁止されています。「C++」とか(Fine Reader OCR Proに入っていますわー)
実際に動作確認してみないとまともに動くかどうかは不明ですが、用語辞書上では修正されています。報告して半年以内で修正されたので、修正も何もされないよりはマシでしょう。正直なところ、こんな程度の低いバグは事前にチェックして解消してほしいところではあります(Mac App Storeに一般開発者が出したらリジェクトされるレベル?)。
ちょいちょいAppleScriptの瑣末な機能を追加していただけるのはありがたいのですが、ページ内の選択中のオブジェクトへのアクセス(selected itemsとか)を用意してほしいところです。現状ではselectionで取れるのはページ(slide)単位だけです。
また、text itemの縦書き(Vertical)属性にもアクセス(Read/Write)できてほしい気がします。Keynote書類上にWord Cloudを作成するときにScriptから素直にオブジェクト回転ができずに困ります(GUI Scriptingで強引にやってるんですけれども)。
▲Keynote v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
Keynote v11.0上で動作確認ずみ。ただし、いったんパスワードを設定した書類は、GUI側からしかパスワード解除できない点に注意。また、AppleScriptからのKeynote書類オープン時にパスワードを指定してオープンすることもできないので、当該書類のパスワードをKeychainに保存しないと書類オープン時のパスワード入力をパスできない。こちらはちゃんと(h.264と違って)動作確認したらしい。でも、油断はできない。それがAppleクオリティ。
▲Numbers v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
▲Pages v11:documentに「password protected」属性(Read Only)と、「set password」コマンドが追加
▲Pages v11:exportコマンドのexport optionsに「include comments」属性と、「include annotations」属性が追加
iWork Appsのv10.2アップデートが公開される
AppleがKeynote/Pages/Numbersのv10.2アッップデートを公開しました。このv10.2から対象OSがmacOS 10.15以降になり、macOS 10.14では最新のKeynote v10.2を使えなくなったことになります。
Keynote v10.2のAppleScript系の機能の差分チェックを(sdefファイルベースで)行ってみたところ、iWorkアプリケーション中でKeynoteのみ機能追加されたことがわかりました。
Keynoteにムービー書き出し機能のAppleScriptオプション機能が追加される
exportコマンドのexport optionsで「movie codecs」と「movie framerates」の指定ができるように機能追加されています。
movie codecs enum h.264 : H.264 AppleProRes422 : Apple ProRes 422 AppleProRes4444 : Apple ProRes 4444 AppleProRes422LT : Apple ProRes 422LT AppleProRes422HQ : Apple ProRes 422HQ AppleProRes422Proxy : Apple ProRes 422Proxy HEVC : HEVC movie framerates enum FPS12 : 12 FPS FPS2398 : 23.98 FPS FPS24 : 24 FPS FPS25 : 25 FPS FPS2997 : 29.97 FPS FPS30 : 30 FPS FPS50 : 50 FPS FPS5994 : 59.94 FPS FPS60 : 60 FPS
風の噂によるとどうもARM Macはムービー書き出しが高速なようなので、そのあたりをアピールするためにもムービー書き出し系の機能の拡充は必要ということなのでしょう。
KeynoteのAppleScript用語辞書に構文確認をパスできないバグ持ち予約語が存在
同時に、「こんなんAppleScriptの処理系でコンパイル(構文確認)通るわけないやん、メーカーが何やってますのん?」という予約語がsdef内に書かれていることが一目でわかりました。
「h.264?」
この「h.264」の予約語はexportコマンドのexport optionsのmovie codecsのEnum内に書かれています。
<enumeration name="movie codecs" code="Knmc"> <enumerator name="h.264" code="Kmc1" description="H.264"> <cocoa string-value="AVVideoCodecTypeH264" /> </enumerator>
macOS 10.15.6上で確認したところ、見事に構文確認時にエラーになります。
Apple製のアプリケーションのAppleによるスクリプティング定義内容がまともに動きません。こうした事態は理解に苦しむものがあります。100%動作確認していないとしか思えません。
ここは、記号入りの予約語では言語処理系的に構文確認すらパスできないので、「h.264」ではなく記号を含まない「h264」ないし「H264」という予約語にすべきです。AppleScript系の機能を追加していただくのは前向きでよいと思いますが、メーカーとして一度も動作確認しないで機能をリリースするというのはいかがなものでしょう?
そんなところに凝っていないで、選択中のオブジェクトを取れる属性「selected objects」とか、テキストオブジェクトの縦書き制御属性「vertical」などをつけたほうが実用性があって助かります。機能追加自体はたいした作業ではありませんが、ぜひ動作確認した上でリリースしていただきたいところです。
AppleScript名:keynote movie export test |
–Works with Keynote v10.2 or later set aTagFile to ((path to desktop) as string) & "testOut.m4v" tell application "Keynote" set exOpt to {compression factor:1.0, movie format:native size, class:export options} –set exOpt to {compression factor:1.0, movie format:native size, movie codec:h.264, class:export options}–this cause error export document 1 to file aTagFile as QuickTime movie with properties exOpt end tell |
日頃からMac App Storeのレビューアーの血も涙もない(でも、ツッコミどころ満載の)リジェクトに遭っている身からすれば、こんなのリジェクト案件です。
個人的には信頼度の問題からmacOS 10.15は「パス」なので、macOS 11.0 Big SurがRelease時にコケないことを祈るのみです(メールが消えるとかいう話が一番OSの信頼度を下げる)。macOS 10.13, “Vista”という史上最悪・最低の大失敗をやらかして以来、「Release版のOSがBetaよりも低品質」という昨今のmacOS。10.13もBetaの時にはよかったのに、Release版で大崩壊を起こして見るも無残な姿に成り果てました。10.14もBetaの段階でGUI Scriptingの認証系でひどいバグがあって、「とても使えない」と判断。10.14.6まで待ってようやく手を出す気になったほど。
macOS 11.0, Big SurはBeta段階でも珍しく好印象で(GUIまわりの仕様はコロコロ変わるけど)、macOS 10.15みたいにBeta段階で「もう、これはダメ!」という話も聞きません(Relase時に紹介記事を書かなかったOSは10.15がはじめてです。10.15の崩壊度はひどかった)。macOS 11.0, Big Surには、macOS 10.13のような「Release版の大崩壊」を起こしてほしくないものです。
Pagesでテキストアイテムか本文テキストから最大文字サイズのテキストを返す
Pagesでオープン中の最前面の書類から、最大文字サイズのテキスト(文字ボックス/本文テキスト)を抽出するAppleScriptです。
Pagesでは、本文にテキストをベタ打ちしつつ、文字スタイルを適用していくワープロ的な作り方と、ボックスでテキストアイテムを配置して文字を入れていくDTP的な(?)作り方の2通りがあります(混在できます)。
両方取得して文字サイズが大きい方を採用します。
AppleScript名:テキストアイテムか本文テキストから最大文字サイズのテキストを返す.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/12 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSMutableArray : a reference to current application’s NSMutableArray set aRes to getMaxTextFromTextItemsAndBodText() of me –> {"テクノロジーが色彩(カラー)を決定している例は?"}–本文縦組みテキスト –> {"AppleScript"}–テキストボックス組みテキスト on getMaxTextFromTextItemsAndBodText() set aRes to getMaxTextFromTextItems() of me set bRes to getMaxTextFromBodyText() of me set aMax to maxSize of aRes set bMax to maxSize of bRes if aMax > bMax then return maxTextList of aRes else return maxTextList of bRes end if end getMaxTextFromTextItemsAndBodText on getMaxTextFromTextItems() tell application "Pages" tell front document set tmpList to every text item if length of tmpList > 0 then set szList to size of object text of every text item set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のテキストアイテムを抽出 set resList to object text of every text item whose size of object text is aMaxPoint else set aMaxPoint to 0 set resList to {} end if return {maxSize:aMaxPoint, maxTextList:resList} end tell end tell end getMaxTextFromTextItems –本文テキストから最大文字サイズのテキストを取得する on getMaxTextFromBodyText() tell application "Pages" tell front document tell body text set tmpP to every paragraph if tmpP = {""} then return {maxSize:0, maxTextList:{}} end if –フォントサイズのみパラグラフ単位に取得 set szList to size of every paragraph set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のパラグラフを抽出 set resList to every paragraph whose size is aMaxPoint –> {"テクノロジーが色彩(カラー)を決定している例は?"} return {maxSize:aMaxPoint, maxTextList:resList} end tell end tell end tell end getMaxTextFromBodyText on calcMax(aList as list) set nArray to (NSMutableArray’s arrayWithArray:aList) set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubleValue() return maxRes end calcMax |
Pagesで最前面の書類中のテキストアイテムの文字サイズが最大のもののテキストを求める
Pagesでオープン中の最前面の書類から、最大文字サイズのテキストアイテム(文字ボックス)のテキストを抽出するAppleScriptです。
Pagesでは、本文にテキストをベタ打ちしつつ、文字スタイルを適用していくワープロ的な作り方と、ボックスでテキストアイテムを配置して文字を入れていくDTP的な(?)作り方の2通りがあります(混在できます)。
ここでは、ボックスでテキストアイテムを配置して作っています。
AppleScript名:最前面の書類中のテキストアイテムの文字サイズが最大のもののテキストを求める.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/12 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSMutableArray : a reference to current application’s NSMutableArray tell application "Pages" tell front document set tmpList to every text item if length of tmpList = 0 then return –テキストアイテムがない場合には処理終了 set szList to size of object text of every text item set aMaxPoint to calcMax(szList) of me –最大の文字サイズを取得 –文字サイズが最大のテキストアイテムを抽出 set resList to object text of every text item whose size of object text is aMaxPoint –> {"AppleScript"} end tell end tell on calcMax(aList as list) set nArray to (NSMutableArray’s arrayWithArray:aList) set maxRes to (nArray’s valueForKeyPath:"@max.self")’s doubleValue() return maxRes end calcMax |