Keynoteの最前面の書類の現在表示中のスライドで選択中のオブジェクトの情報を、テキスト(object text)と幅(width)、高さ(height)から特定するAppleScriptです。
KeynoteのAppleScript用語辞書に「selected item」といった予約語がなく、現在のスライド上の「選択中のオブジェクト」を取得する機能が存在していません。一応、「selection」という予約語はあるのですが、これが有効なのは「選択中のスライド」(複数選択可)なので、本来やりたい「選択中のテキストアイテムからリンク情報を消去」といった処理ができません。
その下調べで作ってみました。
以前、選択中のオブジェクトのテキスト(object text)を取得するScriptを書いたことはあったのですが、それはあくまでテキストを取得するだけで、元のスライド上のオブジェクトのどれが該当するかという処理は行なっていませんでした。
そこで、選択中のオブジェクト(だいたいテキストアイテムが目標)をテキスト(object text)、オブジェクトの幅と高さで比較して特定するようにしてみました。例によってCopy & Pasteで新規書類にペーストして情報を調べるため、GUI Scriptingがオンになっている必要があります。
本Scriptの実行前にKeynote書類上のオブジェクトを選択しておく必要があります。
AppleScript名:選択中のオブジェクトをテキストとサイズを元に特定する.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/01/27 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions –選択中のオブジェクト(Text Frameを想定)をコピペで取得する set kList to getEveryTextFromCurrentKeynoteSlide() of me set out2List to {} –取得した情報をもとに元書類からデータを特定する tell application "Keynote" tell front document tell current slide repeat with i in kList copy i to {tmpTitle, tmpW, tmpH} try set bList to (every iWork item whose object text is equal to tmpTitle and width of it is equal to tmpW and height of it is equal to tmpH) set tmpItem to first item of bList set the end of out2List to tmpItem on error log {"Something Wrong with an item", tmpTitle, tmpW, tmpH} end try end repeat end tell end tell end tell return out2List –> {text item 4 of slide 179 of document id "E3EFE83C-A691-4D99-8939-6928892CBED5"} –選択中のオブジェクトをコピーして新規書類にペーストしてオブジェクト情報(テキスト、幅、高さ)を返す on getEveryTextFromCurrentKeynoteSlide() tell application "Keynote" activate set dCount to count every document if dCount = 0 then display notification "There is no Keynote document" return {} end if tell front document set sCount to count every slide end tell if sCount = 0 then display notification "There is no Slide in Keynote document" return {} end if end tell –Copy tell application "System Events" keystroke "c" using {command down} end tell tell application "Keynote" activate set nDoc to make new document tell nDoc set aMaster to master slide "空白" –set aMaster to master slide "Blank" tell current slide set base slide to aMaster end tell end tell end tell –Paste tell application "System Events" keystroke "v" using {command down} end tell delay 0.01 –Important!! set tOut to {} tell application "Keynote" tell front document tell current slide set tList to every iWork item repeat with i in tList set tmpText to (object text of i) as string set tmpHeight to height of i set tmpWidth to width of i set the end of tOut to {tmpText, tmpWidth, tmpHeight} end repeat end tell end tell –Dispose document tell front document close without saving end tell end tell return tOut end getEveryTextFromCurrentKeynoteSlide on retDelimedText(aList, aDelim) set aText to "" set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to aDelim set aText to aList as text set AppleScript’s text item delimiters to curDelim return aText end retDelimedText |