Archive for the 'Keynote 6' Category

2016/06/30 recordのlistでKeynoteに表を作成する v1.5

recordのlistでKeynote v6.6.2のドキュメント上に表を作成するAppleScriptの高速化改良版です。

Keynote v6.6.xでtable(表)を作成するのに、セルに値が入った状態で作成できないかと試してみましたが、ダメでした(T_T)

そこで、アプリケーションに対しての操作を高速化させるため、非同期実行モードでセルへの値の設定とフォントサイズの変更を行ってみました。だいたいこれで2倍速ぐらいです。

keynote0.png

keynotes2.png

AppleScript名:recordのlistでKeynoteに表を作成する v1.5
– Created 2016-06-29 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

property aFontSize : 12

set aList to {{pathStr:“book1_0.1.pdf”, creationDate:“2016年6月17日金曜日”, pageCount:222, countChars:127978, fileSize:“12027660″}, {pathStr:“book1_0.2.pdf”, creationDate:“2016年6月17日金曜日”, pageCount:230, countChars:129506, fileSize:“11109818″}, {pathStr:“book1_0.210.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:254, countChars:147119, fileSize:“22832000″}, {pathStr:“book1_0.211.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:254, countChars:147123, fileSize:“22831931″}, {pathStr:“book1_0.212.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134856, fileSize:“22273252″}, {pathStr:“book1_0.213.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134845, fileSize:“22271667″}, {pathStr:“book1_0.214.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134850, fileSize:“22270980″}, {pathStr:“book1_0.220.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:242, countChars:134870, fileSize:“21098301″}, {pathStr:“book1_0.222.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:243, countChars:135694, fileSize:“21146421″}, {pathStr:“book1_0.300.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:251, countChars:142787, fileSize:“21427502″}, {pathStr:“book1_0.301.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:251, countChars:142784, fileSize:“21421107″}, {pathStr:“book1_0.302.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:256, countChars:142827, fileSize:“22593201″}, {pathStr:“book1_0.303.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:257, countChars:142845, fileSize:“22616595″}, {pathStr:“book1_0.400.pdf”, creationDate:“2016年6月22日水曜日”, pageCount:281, countChars:162419, fileSize:“22430779″}, {pathStr:“book1_0.500.pdf”, creationDate:“2016年6月23日木曜日”, pageCount:309, countChars:178210, fileSize:“27611566″}, {pathStr:“book1_0.600.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:326, countChars:194751, fileSize:“26820825″}, {pathStr:“book1_0.700.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195943, fileSize:“26408415″}, {pathStr:“book1_0.701.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195926, fileSize:“26406738″}, {pathStr:“book1_0.702.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195924, fileSize:“26406703″}, {pathStr:“book1_0.703.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:311, countChars:196594, fileSize:“26416223″}, {pathStr:“book1_1.0.pdf”, creationDate:“2016年6月25日土曜日”, pageCount:311, countChars:196594, fileSize:“26075419″}}

set anItem to contents of first item of aList
set aDict to (current application’s NSMutableArray’s arrayWithObject:anItem)’s firstObject()
set aKeyList to aDict’s allKeys() as list
set aKeyCount to length of aKeyList
set aRowCount to length of aList

tell application “Keynote”
  tell document 1
    set aNewSlide to make new slide
    
    
tell aNewSlide
      set aTable to make new table with properties {column count:aKeyCount + 1, row count:aRowCount + 1}
      
tell aTable
        –ヘッダー行を作成(ラベルで埋める)
        
tell row 1
          repeat with i from 2 to aKeyCount + 1
            set aKey to item (i - 1) of aKeyList
            
–非同期実行ここから
            
ignoring application responses
              set value of cell i to aKey
              
set font size to aFontSize
            end ignoring
            
–非同期実行ここまで
          end repeat
        end tell
        
        
–各行のデータを埋める
        
repeat with ii from 2 to aRowCount + 1
          set aRecRow to item (ii - 1) of aList
          
tell row ii
            repeat with iii from 2 to (aKeyCount + 1)
              tell cell iii
                set aKey to item (iii - 1) of aKeyList
                
–非同期実行ここから
                
ignoring application responses
                  set value to retValueForKey(aRecRow, aKey) of me
                  
set font size to aFontSize
                end ignoring
                
–非同期実行ここまで
              end tell
            end repeat
          end tell
        end repeat
        
      end tell
    end tell
    
  end tell
end tell

on retValueForKey(aRec, aLabel)
  set tmpDic to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec
  
return (tmpDic’s valueForKey:aLabel) as string
end retValueForKey

★Click Here to Open This Script 

2016/06/28 recordのlistでKeynoteに表を作成する

recordのlistでKeynote v6.6.2のドキュメント上に表を作成するAppleScriptです。

今回作成した本の各バージョンのPDFの情報を収集するAppleScriptを作成し、さあこのデータをどうしようと思ったときに、「じゃあ、まとめたデータをKeynoteの書類上に表で作成すればいいじゃない」ということになり、AppleScriptで自動生成するようにしてみました。

これまでに、意外とAppleScriptで収集したデータをKeynoteにまとめるのは手作業で行っていたりで、なかなか大変でした。発表資料でも、仕様書でも、これが省けるのは(自分的に)省力化になります。

Keynoteでオープン中のドキュメントにページ(slide)を新規追加し、指定データから表を作成します。表の作成は、作成時に一気にすべてのセルのデータを指定することも可能なはずなので、まだまだスピードアップは可能なはずです。

table1.png

table2_resized.png

tabletograph_resized.png

AppleScript名:recordのlistでKeynoteに表を作成する
– Created 2016-06-28 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

property aFontSize : 12

set aList to {{pathStr:“book1_0.1.pdf”, creationDate:“2016年6月17日金曜日”, pageCount:222, countChars:127978, fileSize:“12027660″}, {pathStr:“book1_0.2.pdf”, creationDate:“2016年6月17日金曜日”, pageCount:230, countChars:129506, fileSize:“11109818″}, {pathStr:“book1_0.210.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:254, countChars:147119, fileSize:“22832000″}, {pathStr:“book1_0.211.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:254, countChars:147123, fileSize:“22831931″}, {pathStr:“book1_0.212.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134856, fileSize:“22273252″}, {pathStr:“book1_0.213.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134845, fileSize:“22271667″}, {pathStr:“book1_0.214.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:241, countChars:134850, fileSize:“22270980″}, {pathStr:“book1_0.220.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:242, countChars:134870, fileSize:“21098301″}, {pathStr:“book1_0.222.pdf”, creationDate:“2016年6月18日土曜日”, pageCount:243, countChars:135694, fileSize:“21146421″}, {pathStr:“book1_0.300.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:251, countChars:142787, fileSize:“21427502″}, {pathStr:“book1_0.301.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:251, countChars:142784, fileSize:“21421107″}, {pathStr:“book1_0.302.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:256, countChars:142827, fileSize:“22593201″}, {pathStr:“book1_0.303.pdf”, creationDate:“2016年6月20日月曜日”, pageCount:257, countChars:142845, fileSize:“22616595″}, {pathStr:“book1_0.400.pdf”, creationDate:“2016年6月22日水曜日”, pageCount:281, countChars:162419, fileSize:“22430779″}, {pathStr:“book1_0.500.pdf”, creationDate:“2016年6月23日木曜日”, pageCount:309, countChars:178210, fileSize:“27611566″}, {pathStr:“book1_0.600.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:326, countChars:194751, fileSize:“26820825″}, {pathStr:“book1_0.700.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195943, fileSize:“26408415″}, {pathStr:“book1_0.701.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195926, fileSize:“26406738″}, {pathStr:“book1_0.702.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:310, countChars:195924, fileSize:“26406703″}, {pathStr:“book1_0.703.pdf”, creationDate:“2016年6月24日金曜日”, pageCount:311, countChars:196594, fileSize:“26416223″}, {pathStr:“book1_1.0.pdf”, creationDate:“2016年6月25日土曜日”, pageCount:311, countChars:196594, fileSize:“26075419″}}

set anItem to contents of first item of aList
set aDict to (current application’s NSMutableArray’s arrayWithObject:anItem)’s firstObject()
set aKeyList to aDict’s allKeys() as list
set aKeyCount to length of aKeyList
set aRowCount to length of aList

tell application “Keynote”
  tell document 1
    set aNewSlide to make new slide
    
    
tell aNewSlide
      set aTable to make new table with properties {column count:aKeyCount + 1, row count:aRowCount + 1}
      
tell aTable
        –ヘッダー行を作成(ラベルで埋める)
        
tell row 1
          repeat with i from 2 to aKeyCount + 1
            set aKey to item (i - 1) of aKeyList
            
set value of cell i to aKey
            
set font size to aFontSize
          end repeat
        end tell
        
        
–各行のデータを埋める
        
repeat with ii from 2 to aRowCount + 1
          set aRecRow to item (ii - 1) of aList
          
tell row ii
            repeat with iii from 2 to (aKeyCount + 1)
              tell cell iii
                set aKey to item (iii - 1) of aKeyList
                
set value to retValueForKey(aRecRow, aKey) of me
                
set font size to aFontSize
              end tell
            end repeat
          end tell
        end repeat
        
      end tell
    end tell
    
  end tell
end tell

on retValueForKey(aRec, aLabel)
  set tmpDic to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec
  
return (tmpDic’s valueForKey:aLabel) as string
end retValueForKey

★Click Here to Open This Script 

2016/05/11 FileMaker Pro v15, Keynote v6.6.2, Pages v5.6.2, Numbers v3.6.2が登場

今日は大物プリケーションのアップデートが集中してやってきました。

FileMaker Proの新バージョン、v15のお試し版をダウンロードしてためしてみました。主にモバイル(iPhone、iPad)での機能アップが中心で、Mac上での開発および運用環境としては、スクリプト記述がやりやすくなった(エラーが発生したステップの色が変わるとか)、というあたりで「小幅な改善」という印象を受けます。

FileMaker v14からのAppleScript用語辞書の変更はとくにありません。

FileMakerのWeb系ソリューションについては、AmazonのAWSみたいなクラウド・ホスティングサービスでもないと正直手を出しにくい印象を受けています。

これらのほかに、AppleのKeynote、Pages、Numbersも小幅なアップデート。前バージョンからのAppleScript用語辞書の変更点はとくにありません。

keynote_sdef.png
ツール(ASDictionary)でアプリケーションの用語辞書をHTMLに書き出しして、diffツールで比較。有意な差分が認められた場合にはラベルをつけています

2015/11/13 iWorkアプリがアップデート。AppleScript関連の機能変更はなし

AppleのiWorkアプリケーションのアップデートがリリースされました。

Keynote 6.6→6.6.1、Pages 5.6→5.6.1、Numbers 3.6→3.6.1

AppleScript用語辞書ベースでの変更点はありません。

2015/10/28 Keynote 6.6のじっけん(4)〜グラフを作成

Keynote 6.6をAppleScriptから操作してグラフを作成するじっけんです。

iworkautomarion.com掲載Scriptの内容をそのまま実行しようにも、各種名称がローカライズされてしまっているので、そのままでは動かないため書き換えました(あと、趣味に合わせて微調整)。

keynote_2dpie.png

いろいろ数値で調整してみましたが、うまくグラフが中央にこないので適当なところでごまかしています。

AppleScript名:Keynote 6.6でドキュメントを新規作成してグラフ(2D円グラフ)を作成
set targWidth to 500
set targHeight to 500

tell application “Keynote”
  set thisDocument to make new document with properties {height:764, width:1024, document theme:theme “ブラック”}
  
  
tell thisDocument
    
    
set aHeight to height
    
set aWidth to width
    
    
tell slide 1
      set base slide to master slide “タイトル(上)” of thisDocument
      
set object text of default title item to “2D円グラフ”
      
      
tell default title item
        set height to 80
      end tell
      
      (
add chart row names {“ROW A”} column names {“COL A”, “COL B”, “COL C”} data {{103, 25, 30}} type pie_2d group by chart column)
      
      
tell chart 1
        
        
set width to targWidth
        
set height to targHeight
        
        
set position to {(aWidth / 2) - (targWidth / 2), (aHeight / 2) - (targHeight / 2) + 20}
        
      end tell
      
    end tell
  end tell
end tell

★Click Here to Open This Script 

2015/10/28 Keynote 6.6のじっけん(3)〜表を作成してデータで埋める

Keynote 6.6でドキュメントを新規作成し、スライド(ページ)を追加して、そこに表(table)を作成してすべてのセルをデータで埋めるAppleScriptです。

kn_table.png

AppleScript名:Keynote 6.6でテーブルを新規作成してデータで埋める
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
tell application "Keynote"
  set aDoc to (make new document with properties {document theme:theme "ホワイト", width:1024, height:768}) –Normal Slide
  
–set aDoc to (make new document with properties {document theme:theme "ホワイト", width:1920, height:1080})–Wide Slide
  
tell aDoc
    set aSlide to make new slide at end with properties {base slide:master slide "空白"}
    
    
tell aSlide
      set aTable to make new table with properties {row count:10, column count:3}
      
      
tell aTable
        set cCount to count every cell
        
        
repeat with i from 1 to cCount
          set value of cell i to (i as text)
        end repeat
        
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

2015/10/28 Keynote 6.6のじっけん(2)〜放射状にラインを引く

Keynote 6.6でドキュメント上に放射状にラインを引くじっけんです。手作業ではさすがにかったるい内容ですが、AppleScriptからであれば「やってみようかな」という気になる内容です。

実行にはShane StanleyのAppleScriptライブラリ「BridgePlus」をあらかじめインストールしておく必要があります。

kn1.png

(少々ごまかしつつも)さっくりできました。拡大するとこんなかんじです。

実用性はひたすらありませんが、こういう操作ができるようになったのかと思うと感慨深いものがあります。

kn2.png

AppleScript名:Keynote 6.6で放射状にラインを引く
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use bPlus : script “BridgePlus”

set aNum to 250

load framework

tell application “Keynote”
  –新規ドキュメント作成
  
set aDoc to (make new document with properties {document theme:theme “ホワイト”, width:1024, height:768})
  
–set aDoc to (make new document with properties {document theme:theme “White”, width:1024, height:768})
  
tell aDoc
    set aHeight to height
    
set aWidth to width
    
    
set aCenterW to aWidth / 2
    
set aCenterH to aHeight / 2
    
    
set aMas to master slide “空白”
    
–set aMas to master slide “Blank”
    
    
tell slide 1
      set base slide to aMas
      
      
repeat with i from 1 to 130 by 6
        set {x, y} to calcSinCos(i, aCenterW, aCenterH, aNum) of me
        
make new line with properties {start point:{aCenterW, aCenterH}, end point:{x, y}, rotation:i}
      end repeat
      
    end tell
  end tell
end tell

on calcSinCos(i, aCenterW, aCenterH, aNum)
  tell current application
    set aSinNum to (current application’s SMSForder’s sinValueOf:i)
    
set aCosNum to (current application’s SMSForder’s cosValueOf:i)
    
set x to ((aNum * (aSinNum as real))) + aCenterW
    
set y to (aNum * (aCosNum as real)) + aCenterH
    
return {x, y}
  end tell
end calcSinCos

★Click Here to Open This Script 

2015/10/28 Keynote 6.6のじっけん(1)

先日Keynote、Pages、Numbersがアップデートされたので、実際にどの程度(AppleScript的に)使い物になってきたのかじっけんしてみました。

kn66.png

ごあいさつ:アプリケーションのプロパティを取得

このレベルで問題が出たら大変ですが、さすがにそういうことはありません。

AppleScript名:Keynote 6.6でアプリケーションのプロパティを取得する
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
tell application “Keynote”
  properties
  
–> {frozen:true, class:application, playing:false, version:”6.6″, slide switcher visible:false, name:”Keynote”, frontmost:false}
end tell

★Click Here to Open This Script 

ドキュメントの新規作成

アプリケーション側はバグっていないんですが、KeynoteのAppleScript用語辞書に掲載されている「サンプル」が間違っています。

apple_sample.png

本当はwidthとheightを指定するのですが、用語辞書のサンプルではdocument widthとdocument heightと書かれています。ちなみに、先日更新されたiworkautomation.comのKeynoteの説明では、widthとheightを指定していますね(アプリケーションの用語辞書も直そうよ、、、、、)。

Master slideの名称やthemeの名称を調べてみると、このへんローカライズされています。フランス語とか日本語とか、利用者の言語環境が異なると(英語以外だと)AppleScriptを修正する必要があるので、この手の「ローカライズしすぎ問題」はどうにかならないものでしょうか(Appleがローカライズの外注に細かく指定してないからこうなる)。

AppleScript名:Keynote 6.6でドキュメントを新規作成して指定可能なマスタースライド一覧を取得
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Keynote”
  –Keynoteの用語辞書のサンプルどおりに書いても動かない!!
  
set aDoc to (make new document with properties {document theme:theme “ホワイト”, width:1920, height:1080})
  
  
tell aDoc
    set masList to name of every master slide
    
–> {”タイトル & サブタイトル”, “画像(横長)”, “タイトル(中央)”, “画像(縦長)”, “タイトル(上)”, “タイトル & 箇条書き”, “タイトル、箇条書き、画像”, “箇条書き”, “画像(3 点)”, “引用”, “写真”, “空白”}
  end tell
end tell

★Click Here to Open This Script 

ちょっと順番が狂いましたが、新規ドキュメント作成時に指定可能なテーマ名の一覧も取得できます。こちらも名称はすべてローカライズされたものが取得されますし、ローカライズされた名称で指定することになります。

AppleScript名:Keynote 6.6で利用可能なテーマの一覧を取得
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Keynote”
  set installedThemes to name of every theme
end tell
–> {”ブラック”, “ホワイト”, “グラデーション”, “ショールーム”, “モダンタイプ”, “展示”, “ドラフト”, “写真エッセイ”, “クラシック”, “スレート”, “クリームペーパー”, “アルチザン”, “即興”, “ルネッサンス”, “写真ポートフォリオ”, “論説”, “京都風”, “ブラシ塗りキャンバス”, “活字組”, “モロッコ風”, “クラフト”, “インダストリアル”, “モダンポートフォリオ”, “ハーモニー”, “方眼紙”, “ブループリント”, “フォーマル”, “革装本”, “ビンテージ”, “ハードカバー”, “布装本”, “黒板”, “羊皮紙”}

–CAUTION: Name of Keynote themes are *localized*

★Click Here to Open This Script 

利用可能なテーマすべてで新規ドキュメントを作ってみました。たまーに、指定しても指定できないものが入っているケースがあるので、すべて新規作成できることを確認しておくことには意味があります(本当)。

AppleScript名:Keynote 6.6で利用可能なテーマすべてで新規ドキュメント作成
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Keynote”
  set installedThemes to name of every theme
  
repeat with i in installedThemes
    set j to contents of i
    
make new document with properties {document theme:theme j}
  end repeat
end tell

★Click Here to Open This Script 

スライドの新規作成

Keynoteでは、書類(document)の下に存在する各ページのことをslideと呼びます。このslideの新規作成を実験してみました。

AppleScript名:Keynote 6.6で新規ドキュメント&スライド作成
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Keynote”
  –Keynoteの用語辞書のサンプルどおりに書いても動かない!!
  
set aDoc to (make new document with properties {document theme:theme “ホワイト”, width:1024, height:768}) –Normal Slide
  
–set aDoc to (make new document with properties {document theme:theme “ホワイト”, width:1920, height:1080})–Wide Slide
  
  
tell aDoc
    set masList to name of every master slide
    
–> {”タイトル & サブタイトル”, “画像(横長)”, “タイトル(中央)”, “画像(縦長)”, “タイトル(上)”, “タイトル & 箇条書き”, “タイトル、箇条書き、画像”, “箇条書き”, “画像(3 点)”, “引用”, “写真”, “空白”}
  end tell
  
  
tell aDoc
    repeat with i from 1 to 10
      make new slide at end with properties {base slide:master slide “タイトル(上)”}
      
    end repeat
  end tell
end tell

★Click Here to Open This Script 

スライドのタイトルにアクセス

まだうまく使いこなせていませんが、スライドのタイトルに文字を突っ込めますね。フォントサイズも指定可能で、フォントも指定できます。

その一方で、左寄せ(left align)といった指定ができないのが気になります。あらかじめテーマで(画面上から手動で)定義しておくということでしょうか。

AppleScript名:Keynote 6.6でslideのタイトルにアクセス
– Created 2015-10-27 by Takaaki Naganoya
– 2015 Piyomaru Software
tell application “Keynote”
  tell document 1
    tell slide 1
      tell default title item
        properties
        
–> {opacity:100, parent:slide 1 of document id “9F67B27D-BAEC-4B87-9829-DE3823B54533″ of application “Keynote”, class:shape, reflection showing:false, background fill type:no fill, position:{75, 35}, object text:”", width:874, rotation:0, reflection value:0, height:170, locked:false}
        
tell object text
          properties
          
–> {font:”HiraKakuProN-W3″, color:{0, 0, 0}, class:word, size:80}
          
          
set size to 80
          
        end tell
        
        
set object text to “ぴよまるさんだよ〜”
        
        
–left/right/center alignment の定義はない
        
      end tell
    end tell
  end tell
end tell

★Click Here to Open This Script 

2015/10/17 iWorkアプリがアップデート、AppleScript対応機能が強化される

AppleのiWorkアプリケーション(Keynote、Pages、Numbers)がアップデートされ、Keynote v6.6、Pages v5.6、Numbers v3.6になりました。それぞれ、AppleScript関連機能が強化されています。

AppleのSal SoghoianがUSのAppleScript Users MLに投稿し、それぞれの解説ページへのリンクを紹介しています。

Keynote
Updates to export options:
PDF image quality

Pages
Updates to export options:
image quality
EPUB metadata: publisher, language, genre

Numbers
Transpose table command:
Updates to export options:
image quality
exclude summary worksheet option for exporting to Excel

英語で書かれていますが、しっかりと解説されており納得の行くレベルです。アプリケーション自体の機能では、Pagesでドキュメント内リンクが作れるようになってほしいところです(PDF書き出ししたときに、リンクで書類内を行き来できないのが辛い)。

2015/01/09 Keynote, Pages, Numbersがアップデート。AppleScript用語辞書は変更なし

Keynote、Pages、Numbersがアップデートされ、それぞれ、

 Keynote:Version 6.5.2
 Pages:Version 5.5.2
 Numbers:Version 3.5.2

となりました。マイナーバージョンアップであり、セキュリティ関連のみのアップデートで、AppleScript用語辞書には変更はありません。

毎回、例によってAS Dictionary(Now, By MugginSoft)でAppleScript用語辞書をHTMLに(AppleScriptで)書き出しして、FileMergeでdiffをとって用語辞書の差分を検出しており、今回は変更が検出されませんでした。

keynote.png

pages.png

numbers.png

2014/11/22 Keynote 6.5で各スライドのタイトル、マスタースライド名を取得してデータ化

Keynote 6.5で作成中の書類(開発中のシステムの仕様書)から、各ページタイトルを取得。さらに各スライド(ページ)のマスタースライド名を取得しておいて、目次の文字の大きさに違いをつけようとして、データを作成するAppleScriptの試作品です。

実際に、一般的なアプリケーションであるKeynoteをコントロールしつつ、データ処理をASOCベースのサブルーチンで行わせてみました。

40ページ強あるKeynoteのデータの処理を1秒以下で行えます(MacBook Pro Retina mid 2012)。

また、各スライド(ページ)のマスタースライド名については、出現頻度をカウントし、出現頻度の少ないものが各章のトビラであると仮定して、各タイトルにレベル設定(トビラページは1、通常ページは2)を行っています。

実際に、OmniGraffleではこうした処理(各ページのタイトルを求めて、目次ページを動的に作成してすべての項目に実際のページへのリンクを設定)をすべてAppleScriptで行っていますが(PDFに書き出したときに便利)・・・OmniGraffleで行うよりも、(ユーザーの多い)Keynote上で行えたほうが便利です。

Keynote 6.5もけっこうAppleScript対応機能が向上してきてはいるのですが、たとえばテキストオブジェクトを生成しても・・・左寄せ/センタリング/右寄せを指定できないとか、フォントと文字サイズも設定できないとか(ここはまだ試行錯誤の余地あり)、他のスライド(ページ)へのリンク設定が行えないなど、実践的な処理を記述するためには「いまひとつ」な印象です。

とはいえ、Keynote 6.5のAppleScript用語辞書を見ていると、オブジェクトにScript Labelを(将来的に)設定できるように考えられているなど、楽しみです(グラフ方面は手付かずだったり)。

Keynoteには、早く完全体になってほしいところです(永遠に未完成ということはないと思いたいですが、なかなか進捗しないですね)。

ちなみに、Keynoteへのtellブロック内でcocoaの機能にアクセスするコードを直接書くと、実行時にScript Editorがクラッシュするなどなかなかたいへんでした。ASOCのコードは通常のアプリケーションへのアクセスと分けたほうが得策のようです。

AppleScript名:keynote_test
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”

property sPage : 3 –1ページ目が表紙、2ページ目が目次として3ページ目以降を処理対象とする

–最前面のドキュメントを取得する
tell application “Keynote”
  set aDocRef to front document
end tell

set tList to retKeynoteSlideTitleFrom(3, aDocRef) of me
–> {”システム概要”, “ハードウェア構成概要”, “ソフトウェア構成概要”,….}

–ドキュメント中の3ページ以降のslideの各マスタースライドの名称を取得して、各マスタースライドの出現頻度を取得して昇順ソート
set bList to retKeynoteSlideBaseSlideNameFrom(sPage, aDocRef) of me
–> {{”タイトル(中央)”, 8}, {”タイトル(上)”, 32}}–{マスタースライド名, 登場頻度カウント}

set {masterList, freqList} to conv2dListTo1dLists(bList) of me
–> {{”タイトル(中央)”, “タイトル(上)”}, {8, 32}}

set tOutList to {}

tell application “Keynote”
  tell aDocRef
    repeat with i from sPage to (count every slide)
      tell slide i
        –Title
        
set aIndex to (i - sPage + 1)
        
set aTitle to contents of item aIndex of tList
        
        
–Base Slide
        
set aBaseName to name of base slide
        
set aLevel to offseOfList(masterList, aBaseName) of me
        
        
set the end of tOutList to {aTitle, aLevel}
        
      end tell
    end repeat
  end tell
end tell

return tOutList
–> {{”システム概要”, 1}, {”ハードウェア構成概要”, 2}, {”ソフトウェア構成概要”, 2}, {”プログラム概要”, 2}, {”プログラム呼称一覧”, 2}, ….}
–1=マスタースライドが”タイトル(中央)”
–2=マスタースライドが “タイトル(上)”

–List中の指定項目の出現位置を返す(複数ヒットした場合には最初の項目番号)。1はじまりのAS仕様のインデックスを使用
on offseOfList(aList, anItem)
  set aResList to (current application’s SMSFord’s indexesOfItem:anItem inArray:(aList) inverting:false) as list
  
set aRes to (first item of aResList)
  
return (aRes + 1)
end offseOfList

–指定ページ(slide)から末尾までの各ページのTitleを取得して返す
on retKeynoteSlideTitleFrom(startPageNum as integer, aDocRef)
  
  
set tList to {}
  
  
try
    –全ページ(slide)のtitleを一括で取得するのが一番高速
    
tell application “Keynote”
      tell aDocRef
        set sCount to count every slide
        
        
if sCount < startPageNum then error
        
if startPageNum < 1 then return {}
        
        
set tList to object text of default title item of every slide
      end tell
    end tell
  on error
    return {}
  end try
  
  
–取得したタイトルから、前後の改行、前後の空白、および途中に入っている改行を削除する
  
set t2List to {}
  
repeat with i in tList
    set j to contents of i
    
set jj to cleanUpText(j) of me
    
set jj to cleanUpCRLF(jj) of me
    
set the end of t2List to jj
  end repeat
  
  
  
  
–一括取得した内容を適宜加工して返すのがベスト
  
set ttList to contents of items startPageNum thru -1 of t2List
  
  
return ttList
  
end retKeynoteSlideTitleFrom

–文字列の前後の改行と空白文字を除去
on cleanUpText(someText)
  set theString to current application’s NSString’s stringWithString:someText
  
set theString to theString’s stringByReplacingOccurrencesOfString:” +” withString:” “ options:(current application’s NSRegularExpressionSearch) range:{location:0, |length|:length of someText}
  
set theWhiteSet to current application’s NSCharacterSet’s whitespaceAndNewlineCharacterSet()
  
set theString to theString’s stringByTrimmingCharactersInSet:theWhiteSet
  
return theString as text
end cleanUpText

–文字置換
on repChar(aStr, targStr, repStr)
  set aString to current application’s NSString’s stringWithString:aStr
  
set bString to aString’s stringByReplacingOccurrencesOfString:targStr withString:repStr
  
set cString to (bString’s ASify()) as string
  
return cString
end repChar

–指定文字列からCRLFを除去
on cleanUpCRLF(aStr)
  set aString to current application’s NSString’s stringWithString:aStr
  
set bString to aString’s stringByReplacingOccurrencesOfString:(string id 10) withString:“” –remove LF
  
set cString to bString’s stringByReplacingOccurrencesOfString:(string id 13) withString:“” –remove CR
  
set dString to (cString’s ASify()) as string
  
return dString
end cleanUpCRLF

–2D Listを1D Listに変換
on conv2dListTo1dLists(aList as list)
  
  
set newList to {}
  
set aLen to length of first item of aList
  
  
repeat aLen times
    set the end of newList to {}
  end repeat
  
  
  
repeat with i in aList
    repeat with ii from 1 to aLen
      set the end of item ii of newList to (item ii of i)
    end repeat
  end repeat
  
  
return newList
  
end conv2dListTo1dLists

–指定ページ(slide)から末尾までの各ページのbase slide名を取得してユニーク化して返す
on retKeynoteSlideBaseSlideNameFrom(startPageNum, aDocRef)
  
  
set aList to {}
  
  
tell application “Keynote”
    tell aDocRef
      set sCount to count every slide
      
if sCount < startPageNum then error
      
      
repeat with i from startPageNum to sCount
        tell slide i
          set aBase to name of base slide
          
set the end of aList to aBase
        end tell
      end repeat
      
    end tell
  end tell
  
  
  
–結果をユニーク化する
  
set aArray to current application’s NSArray’s arrayWithArray:aList
  
set bArray to aArray’s valueForKeyPath:“@distinctUnionOfObjects.self”
  
  
set bList to bArray’s ASify() as list
  
–> {1, 1.1, 2, 3, 4}
  
  
  
–Base Slide名の出現頻度を調べる
  
set cList to {}
  
  
repeat with i in bList
    set aName to contents of i
    
set aCount to countSpecifiedItem(aList, aName) of me
    
set the end of cList to {aName, aCount}
  end repeat
  
  
  
–出現頻度(aCount)をキーにして昇順ソート
  
set dList to sort2DList(cList, 2, {true}) of me
  
  
return dList
  
end retKeynoteSlideBaseSlideNameFrom

–リスト中の指定項目の出現回数を返す
on countSpecifiedItem(aList, countItem)
  set aRes to (current application’s SMSFord’s indexesOfItem:countItem inArray:aList inverting:false) as list
  
set aCount to length of aRes
  
return aCount
end countSpecifiedItem

–2D Listをソート
on sort2DList(aList as list, sortIndexes as list, sortOrders as list)
  
  
–index値をAS流(アイテムが1はじまり)からCocoa流(アイテムが0はじまり)に変換
  
set newIndex to {}
  
repeat with i in sortIndexes
    set j to contents of i
    
set j to j - 1
    
set the end of newIndex to j
  end repeat
  
  
–Sort TypeのListを作成(あえて外部から指定する内容でもない)
  
set sortTypes to {}
  
repeat (length of sortIndexes) times
    set the end of sortTypes to “compare:”
  end repeat
  
  
–Sort
  
set resList to (current application’s SMSFord’s subarraysIn:(aList) sortedByIndexes:newIndex ascending:sortOrders sortTypes:sortTypes |error|:(missing value)) as list
  
  
return resList
  
end sort2DList

★Click Here to Open This Script