iWork 09のKeynote 5.0.5で、各スライド(slide)のタイトルを読み取って目次のテキストを作成するAppleScriptです。
本Scriptでslideのtitleを取得するためには、スライドを作成する際にKeynoteのテンプレート(マスタースライド)機能を用いて、Keynoteが期待しているtitle欄の枠を使用するようにKeynote書類を作る必要があります。
自分は、無地のマスタースライドを選んで、好き勝手に文字やらグラフィックを配置するのが好きなのですが、そのやり方では(膨大な資料をKeynoteで作ってしまうと)目次を作ったり連番のスライドのリナンバー作業が大変です。
AppleScriptからデータを取りやすいよう、根本的に作業スタイルを変えてみました。新規スライド作成(ページの追加)時にはかならずマスタースライドを適用するようにしました。逆に、この機能を利用してスライドを作らないとAppleScriptからタイトルの取得を行おうとしても無意味な値しか返ってきません。

▲表紙のタイトル部分のスライド。マスタースライドで「タイトル(中央)」を指定している

▲内容部分のスライド。マスタースライドで「タイトル(上)」を指定している
スライド中で、1つの内容について複数枚にわたって説明するようなケースがあり、もし3枚に渡って説明する場合には、
「ひよこさんの特徴(1/3)」「ひよこさんの特徴(2/3)」「ひよこさんの特徴(3/3)」
などとタイトル末尾にナンバーを振ることになっています(慣習上)。
目次データ作成時にはこのナンバーを振っている内容については同一内容であると認識して、(2/3)や(3/3)は目次に含めないようにしています。



ためしに、あるKeynote書類の目次をこのAppleScriptで作ってみました。
実行結果:
2 メディアの変遷
5 コンピュータ/通信業界「主役」の変遷
6 携帯キャリアを軸とした情報通信における競合と協業
7 ラジオ関連のタイムテーブル
8 V-Lowデジタルラジオに対するNHKの見解
9 V-HighとV-Lowの電波帯域
10 デジタルラジオの技術的仕様
11 参考資料:ISDB放送規格
12 参考資料: マルチメディア放送企画LLC合同会社
13 参考資料:V-LOW放送の地域ソフト会社一覧
14 デジタルラジオ受信機とは何か?
15 デジタルラジオ放送は「聴いただけでは分からない」
16 音声コンテンツへの需要は?
17 いまやリアルタイム視聴・聴取は不可能
18 各放送メディアのトレンド
19 ユーザーの可処分時間の最後のフロンティアは「移動時間」
20 貴重な移動時間を活用できるのが音声コンテンツの強み
このように、Keynoteでプレゼン資料というよりは、文字中心でページ数の多い仕様書や報告書を作った場合でも、AppleScriptでタイトルを走査してかんたんに目次用のテキストを作成できます。
個人的には、ものすごく助かりました。
| スクリプト名:Keynoteの各slideのtitleから目次のテキストを作成する |
set separatorC to “(” –「(1/3)」の形式で連番を振っている場合の最初のカッコを書いておく。ここでは、全角カッコを想定
–Keynoteの各slideのタイトルを取得する set aList to {}
tell application “Keynote” tell slideshow 1 set aList to title of every slide end tell end tell
–各タイトルにすでに「(1/2)」のようなナンバリングが行われていたらナンバリング部分を削除する set newList to {}
repeat with i in aList set j to contents of i set aPos to offset of separatorC in j if aPos is not equal to 0 then set j to text 1 thru (aPos - 1) of j end if set the end of newList to j end repeat
–目次を作成する set sPage to 3 –ページ数カウンタ set curItem to second item of newList set newList2 to items 3 thru -1 of newList
set outList to {{2, curItem}} –出力用データ
repeat with i in newList2 set j to contents of i if j = curItem then –何もしない else set curItem to j set the end of outList to {sPage, j} end if set sPage to sPage + 1 end repeat
set aText to retItemDelimedAndParagraphDelimedText(outList, tab, return) of me
–入れ子のリストを、アイテム間のデリミタとパラグラフ間のデリミタを指定してテキスト化 –というか、入れ子のリストをタブ区切りテキストにするのが目的 on retItemDelimedAndParagraphDelimedText(aList, itemDelim, paragraphDelim) set aText to “” repeat with i in aList set aStr to retDelimedText(i, itemDelim) of me set aText to aText & aStr & paragraphDelim end repeat return aText end retItemDelimedAndParagraphDelimedText
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
|
|
▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に
|