Keynoteで選択中のテキストアイテムからテキスト情報を抽出するAppleScriptです。
# 本内容は当時のKeynote v11.xの状況を反映したもので、その後リリースされたv12ではselectionを取得できるように変更されました
FileMaker Pro Scripting Bookの英語版を来る日も来る日も作っており、気づけばぜんぜんScriptを書いていないので「Piyomaru Software」ではなく「Piyomaru Publishing」だ、などと言っている今日このごろです。Keynoteを毎日使っていますが、微妙に痒いところに手が届かないので、使えば使うほどAppleScriptで機能を補いたくなってきます。
Keynoteに「selected objects」といった「選択中のオブジェクト」を求めるAppleScript用語が用意されていないため、本来やりたい「選択中の部品のデータを処理して元の部品に書き戻す」「選択中の部品からデータを抜き出す」といった処理ができません。selectionで取得できるのが「選択中のスライド」だというのが非常に残念です。
Keynote書類でテキストアイテムを選択し、コピーすると……テキスト情報は取り出せません。Finder上でクリップボード内容を確認してみると、あろうことか「PNGイメージ」と表示されます。
コピーされたクリップボードの内容を解析して、そのオブジェクト情報からテキストを抽出できるとよいだろうか、などとも考えたのですが、
Keynote内部オブジェクトで、ちょっと手強そうです。
というわけで、Keynote側には一切機能がないわけですが、選択中のオブジェクトをコピーし、新規ドキュメントにペーストしたうえで新規ドキュメント上のオブジェクトからテキストを取り出し、新規ドキュメントを破棄することにしました。
GUI Scriptingを用いているので、システム環境設定の「セキュリティとプライバシー」でGUI Scriptingを許可してから実行してください。
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 set kList to getEveryTextFromCurrentKeynoteSlide() of me set tRes to retDelimedText(kList, return) of me 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.1 –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 aTmpStr to object text of i set the end of tOut to aTmpStr 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 |