Archive for the 'Numbers 3' Category

2016/12/15 PDFしおり用データをNumbersから取得

PDFに「しおり」を作成する元のデータをNumbers上に記述しておくと、作成用のデータを取得・変換するAppleScriptです。構文確認および実行には、Shane Stanleyの「BridgePlus」AppleScript Libraries(フリー)のインストールを必要とします。

また、Numbersで(↓)のような書類を作成して、Numbersでオープンしていることが動作の前提条件です。

numbers_shiori.png

元のプログラムでは直接Script Editor上でレコードとして記述するのが、なかなか大変。また、親項目をタイトル文字列で記述するのも(作業時にミスりそうで)大変だったので、Numbers書類上で記述できるようにしてみたものです。

shiori.png

親項目は番号で記述するようにして、ID自体の連番の生成もAppleScriptから行い、極力作業ミスが発生しないように配慮してみました。

shiori2.png

AppleScript名:しおり用データをNumbersから取得
【コメント】 Book2_index_v2 を前提としています
– Created 2016-12-15 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use framework “Foundation”
use scripting additions
use BridgePlus : script “BridgePlus”
–http://piyocast.com/as/archives/4363

set aData to getIndexRecListFromNumbers() of me
–> {{|index|:3, title:”広告”, |parent|:”"}, {|index|:4, title:”本書購入特典のご案内”, |parent|:”"},…..

–NumbersのデータからPDFに付けるしおりのデータを取得する
on getIndexRecListFromNumbers()
  tell application “Numbers”
    tell window 1
      set aWinProp to properties
    end tell
    
    
set aDoc to document of aWinProp
    
tell aDoc
      tell active sheet
        tell table 1
          set colNum to column count
          
if colNum is not equal to 4 then error “Illegal Column Numbers”
          
set rowNum to row count
          
set vList to value of every cell
        end tell
      end tell
    end tell
  end tell
  
  
–Transform 1D array to 2D array
  
load framework
  
set tdList to (current application’s SMSForder’s subarraysFrom:(vList) groupedBy:colNum |error|:(missing value)) as list
  
–> {{”ID”, “index”, “title”, “parent”}, {1.0, 3.0, “広告”, missing value}, …..
  
  
–Skip First Row
  
set td2List to rest of tdList –first itemだけスキップする
  
  
set mokujiRecords to {}
  
repeat with i in td2List
    copy i to {anID, anIND, aTITLE, aParent}
    
    
–log {anID, anIND, aTITLE, aParent}
    
if aParent is not equal to missing value then
      set bParent to contents of item 3 of (item aParent of td2List)
    else
      set bParent to “”
    end if
    
    
set tmpRec to {|index|:(contents of anIND) as integer, title:aTITLE, |parent|:bParent}
    
set the end of mokujiRecords to tmpRec
  end repeat
  
  
return mokujiRecords
  
end getIndexRecListFromNumbers

★Click Here to Open This Script 

2016/05/12 表計算ソフトの選択範囲のデータをMarkdown形式の表テキストに変換する

「技術書典」に向けてAppleScript本をMarkdownエディタ「MacDown」で快調に執筆中の今日このごろ。世の中にあふれるMarkdownエディタから厳選してMacDownに行き着きました。

md0.png

一応、最低限レベルながらAppleScriptに対応しているMarkdownエディタは「MacDown」だけでした。

AppleScript対応/非対応を問わず、メジャーなエディタを調べてこれが一番よかったのは……本Blogに掲載している色分けプログラムリスト(HTML)を本文中にペーストして、テキストとしてではなくそのままHTMLとして解釈して表にレンダリングしてくれたこと(仕様的に微妙な点なので、将来にわたって維持されるかどうかは不明)。

md11_resized.png

他のエディタでは本文中にHTMLのタグを入れるという手は使えませんでした(Tableタグだけで実験したので、もしかするともうちょっといろいろやってみると認識されたのかも??)。

そんな、自分のニーズにばっちり合っているMacDownですが、使っているうちにいろいろ山のように不満も出てくるもので、そのうちのひとつに「表データを入れにくい」というものがありました。

スクラッチでゼロから表を起こすのには、Markdown書式の軽量マークアップの表タグはとてもいいと思うのですが、「ありもののデータがすでに存在している」場合には、少々困ってしまうところです。

あまりにあまねく誰もが直面する問題なので、すでにどこかで誰かが同じような変換ツールを書いている可能性が高いですが、この程度ならたいした手間はかからないので、AppleScriptで書いてしまいました。

まずは、Markdown書式における表の作り方を確認。

header1|header2|header3
—|—|—
col1|col2|col3
col4|col5|col6
col7|col8|col9

最低限、こんな風に書いておけば表として認識されるようです(MacDown v0.6上で確認。他のエディタでは傾向が違うかも)。

md00_resized.png

ヘルプファイルやサンプルなどではもっとスペースを入れてきれいに書いてありましたが、そんなきれいに書く必要はないことがわかりました。

excel1.png

まずは、Microsoft Excel版(バージョン14.6.3にて確認)。Excel上のデータを選択してAppleScriptを実行すると、Markdown形式の表データがクリップボードに転送されます。MacDownにはselection(選択範囲)という予約語がないので、選択範囲に対して転送するという手が使えないため、クリップボードに転送しておいてユーザーにペースト動作を行ってもらおうというところです。

numbers1_resized.png

次に、Numbers(v3.6.2)版。Numbersのドキュメント上でデータを選択しておくと、Markdown形式の表データがクリップボードに転送されます。Excelバージョンのプログラムを流用するために、Excelと同様のデータの取得方法を行うルーチンをもってきました(すでに作ってあった)。Numbersの選択範囲のデータの返し方がアレでナニなのでやや苦労していますが、サブルーチンの再利用ですぐに差し替えできました。

md10_resized.png

AppleScript名:Excelの選択範囲を取得してMarkdown書式の表に変換する
– Created 2016-05-12 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aSeparator to “|”
–set aCell to “—:” –Align Right
set aCell to “:—:” –Align Center
–set aCell to “:—” –Align Left

set aLineTerminator to return

tell application “Microsoft Excel”
  set aSel to string value of selection
end tell

if aSel = “” then
  tell current application
    display dialog “Excelのワークシート上で何も選択されていません” with icon 2 buttons {“OK”} default button 1 with title “選択範囲エラー”
    
return
  end tell
end if

–選択範囲の横幅チェック、ヘッダー部のデータ作成
set colNum to length of (contents of first item of aSel)
set sepList to {}
repeat colNum times
  set end of sepList to aCell
end repeat

–ヘッダーセパレータを配列の2番目に挿入する
set newList to insListItem(aSel, sepList, 2) of me

–Markdown書式の表を文字列で作成し、クリップボードに転送する
set outStr to “”
repeat with i in newList
  set outStr to outStr & retStrFromArrayWithDelimiter(contents of i, aSeparator) of me & aLineTerminator
end repeat

set the clipboard to outStr –クリップボードに転送

–指定のリスト(2次元配列)に、要素(1次元配列)を、指定箇所(1はじまり)にインサートする
on insListItem(aList as list, insList as list, insertItemNum as integer)
  set newList to {}
  
set itemCounter to 1
  
repeat with i in aList
    if itemCounter = insertItemNum then
      set the end of newList to insList
    end if
    
set end of newList to (contents of i)
    
set itemCounter to itemCounter + 1
  end repeat
  
return newList
end insListItem

–リストを指定デリミタをはさんでテキスト化
on retStrFromArrayWithDelimiter(aList as list, aDelim as string)
  set anArray to current application’s NSArray’s arrayWithArray:aList
  
set aRes to anArray’s componentsJoinedByString:aDelim
  
return aRes as text
end retStrFromArrayWithDelimiter

on retArrowText(aList as list, aDelim as string) –自分のASでよく使うハンドラ名称なので、同じものを用意
  return my retStrFromArrayWithDelimiter(aList, aDelim)
end retArrowText

★Click Here to Open This Script 

AppleScript名:Numbersの選択範囲を取得してMarkdown書式の表に変換する
– Created 2016-05-12 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aSeparator to “|”
–set aCell to “—:” –Align Right
set aCell to “:—:” –Align Center
–set aCell to “:—” –Align Left

set aLineTerminator to return

–Numbersの選択範囲からExcel仕様で2Dリストを返す
set aSel to get2DListFromNumbersSelection() of me

if aSel = “” then
  tell current application
    display dialog “Numbersのワークシート上で何も選択されていません” with icon 2 buttons {“OK”} default button 1 with title “選択範囲エラー”
    
return
  end tell
end if

–選択範囲の横幅チェック、ヘッダー部のデータ作成
set colNum to length of (contents of first item of aSel)
set sepList to {}
repeat colNum times
  set end of sepList to aCell
end repeat

–ヘッダーセパレータを配列の2番目に挿入する
set newList to insListItem(aSel, sepList, 2) of me

–Markdown書式の表を文字列で作成し、クリップボードに転送する
set outStr to “”
repeat with i in newList
  set outStr to outStr & retStrFromArrayWithDelimiter(contents of i, aSeparator) of me & aLineTerminator
end repeat

set the clipboard to outStr –クリップボードに転送

–指定のリスト(2次元配列)に、要素(1次元配列)を、指定箇所(1はじまり)にインサートする
on insListItem(aList as list, insList as list, insertItemNum as integer)
  set newList to {}
  
set itemCounter to 1
  
repeat with i in aList
    if itemCounter = insertItemNum then
      set the end of newList to insList
    end if
    
set end of newList to (contents of i)
    
set itemCounter to itemCounter + 1
  end repeat
  
return newList
end insListItem

–リストを指定デリミタをはさんでテキスト化
on retStrFromArrayWithDelimiter(aList as list, aDelim as string)
  set anArray to current application’s NSArray’s arrayWithArray:aList
  
set aRes to anArray’s componentsJoinedByString:aDelim
  
return aRes as text
end retStrFromArrayWithDelimiter

on retArrowText(aList as list, aDelim as string) –自分のASでよく使うハンドラ名称なので、同じものを用意
  return my retStrFromArrayWithDelimiter(aList, aDelim)
end retArrowText

–テキストを指定デリミタでリスト化
on parseByDelim(aData, aDelim)
  set aText to current application’s NSString’s stringWithString:aData
  
set aList to aText’s componentsSeparatedByString:aDelim
  
return aList as list
end parseByDelim

on get2DListFromNumbersSelection()
  –Numbersで選択範囲を縦に区切ったリストを返す
  
tell application “Numbers”
    tell document 1
      tell sheet 1
        tell table 1
          try
            set selList to value of every cell of selection range –選択範囲のデータを取得
          on error
            return “” –何も選択されてなかった場合
          end try
          
          
set selName to name of selection range –選択範囲のrange情報を取得
          
set {s1, s2} to parseByDelim(selName, “:”) of me
          
          
–始点の情報を取得する
          
set s1Row to (address of row of range s1) as integer
          
set s1Column to (address of column of range s1) as integer
          
          
–終点の情報を取得する
          
set s2Row to (address of row of range s2) as integer
          
set s2Column to (address of column of range s2) as integer
          
          
–選択範囲の情報を取得する
          
set selHeight to s2Row - s1Row + 1 –高さ(Height of selection range)
          
set selWidth to s2Column - s1Column + 1 –幅(Width of selection range)
          
        end tell
      end tell
    end tell
  end tell
  
  
set aLen to length of selList
  
set aaLen to selHeight
  
  
set bList to {}
  
repeat with i from 1 to aaLen
    set aHoriList to {}
    
    
repeat with ii from 1 to selWidth
      set j1 to ii + (i - 1) * selWidth
      
set tmpCon to contents of item j1 of selList
      
      
set aClass to class of tmpCon
      
if aClass = number or aClass = integer or aClass = real then
        set tmpCon to tmpCon as integer
      end if
      
      
set the end of aHoriList to tmpCon
    end repeat
    
    
set the end of bList to aHoriList
  end repeat
  
  
return bList
  
end get2DListFromNumbersSelection

★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/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/01/27 Numbers 3.1でファイル保存

コメント欄でCharanさんから教えていただきました。先日のNumbers 3.1で追加されたAppleScript対応機能のうち、ファイル保存を行うsaveコマンドが動作しないものと判断していましたが、「ファイル名を拡張子まで指定すると保存できる」とのこと。

すぐに試してみたところ、まったくそのとおりで現状でもファイル保存が可能でした(えー、なにコレー)。

ただし、ファイル名にかならず拡張子「.numbers」を指定する必要があるため、ちょっとScriptに書き足してみました(ほかにも注意事項あり。後述)。

スクリプト名:Numbers 3.1でファイル保存(パス修正機能つき)
set anAlias to choose file name
set anAliasStr to anAlias as string

–拡張子「.numbers」が指定されていないと保存できないので補ってみた
if anAliasStr does not end with “.numbers” then
  set anAliasStr to anAliasStr & “.numbers”
end if

tell application “Numbers”
  tell document 1
    save in file anAliasStr
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

新規作成したNumbers書類(名称未設定の状態)をAppleScriptでファイル保存すると、オープン中の書類は保存ずみの状態になるのが普通ですが、Numbers 3.1ではオープン中の書類(保存ずみ)は「名称未設定」のままです。

numb10.png

一般的にはこのような挙動はしないはずなので、まだまだ今後のアップデートで動作内容が変わる可能性が高いと思われます。「as Numbers」のオプションも効かない(指定するとエラーになる)ので、現状はまだ暫定的な実装なはずです(でないと困ります)。

現状では、ドキュメントを新規作成していじくった後にファイル保存を行うと、前面に名称未設定のドキュメントのウィンドウが残ったままになるので、「close without saving」(ファイル非保存でクローズ)をdocumentなりwindowなりに対して実行しておく必要が出てきます。この残骸が残る状態は今後のNumbersの新バージョンで修正される可能性があるため、Apple側の将来的な対応も含めて予測して対処を行う必要がありそうです。

ちなみに、Numbers 3.1のAppleScript用語辞書に書かれているように、documentオブジェクトだけではなくwindowオブジェクトに対してもsaveコマンドが効くようです。

スクリプト名:Numbers 3.1でファイル保存(Windowを指定)
set anAlias to choose file name
set anAliasStr to anAlias as string

–拡張子「.numbers」が指定されていないと保存できないので補ってみた
if anAliasStr does not end with “.numbers” then
  set anAliasStr to anAliasStr & “.numbers”
end if

tell application “Numbers”
  tell window 1
    save in file anAliasStr
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

将来的なバージョンアップ(Numbers 3.1以降)での微妙な改修を考慮すると、こんな感じになるでしょうか。ただ、将来のバージョンで確実に動くという保証はありません。

スクリプト名:Numbers 3.1でファイル保存(パス修正機能つき)v2
set anAlias to choose file name
set anAliasStr to anAlias as string

–拡張子「.numbers」が指定されていないと保存できないので補ってみた
if anAliasStr does not end with “.numbers” then
  set anAliasStr to anAliasStr & “.numbers”
end if

tell application “Numbers”
  —オープン中のNumbers書類をすべて破棄
  
close every window without saving –重要な書類がオープンされた状態で実行してはいけない
  
  
–Numbersドキュメントを新規作成
  
make new document
  
  
–最前面のウィンドウで表示されているdocumentを保存
  
tell window 1
    save in file anAliasStr
    
close without saving
  end tell
  
  
–保存されたドキュメントを再オープン。今後はパス指定なしでsaveコマンドの実行のみで保存可能
  
open file anAliasStr
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/01/24 Numbers 3.1にAppleScriptサポート機能が復活

iWork ‘13のNumbers 3.1でAppleScript対応機能が復活しました。ただし、一部に微妙な挙動の変更があるので、注意が必要です。

numb1.png

Mac AppStoreを見ると、「AppleScriptのサポートの向上」と明記されています。

あまりに使えなかったのでめまいがしてゴミ箱行きになっていたiWork ‘13ですが、この機会に動作確認のため再度インストールしてみました。

numb0.png

NumbersのアプリケーションのアイコンをAppleScriptエディタにドラッグ&ドロップしてAppleScript用語辞書の内容を確認。

numb2.png

たしかに、用語辞書がついていますし、その中に「Numbers ‘09 Compatibility Suite」という用語群が用意されています。

Numbers 2.3の用語辞書と内容を比較してみると、「split into columns」と「split into rows」の2つの命令が削除されたほかは、命令、オブジェクトの数は合っているようです。

numb3.png

そこで、本Blogに掲載しているAppleScriptのうち「GUI Scriptingを用いていないもの」と「他のアプリケーションとの連携を行っていないもの(Numbersだけで動作が完結する)」について、すべて動作確認を行ってみました。

多くは以前と同じ動作を確認できたのですが、いくつかの重大な変更が行われていることも確認できました。以下、その内容を紹介します。

非互換スクリプト名:Numbersで書類の情報を取得する

動作内容には変更はないのですが、返り値の一部が異なります。documentのpath属性がfileに変更になっていました。

非互換スクリプト名:Numbersでウィンドウの情報を取得する

返り値の一部が変更されています。Windowオブジェクトのtitledとfloating属性がなくなっていました(影響はほぼない)。

非互換スクリプト名:Numbersで書類を保存する

実行すると「書類を自動保存できませんでした」とダイアログが出て、保存パスを指定できません。ファイルの保存ができないということで、すぐに修正を行うべき重大なバグです。こういうバグを放置したままリリースするとは、US Appleは一体何をやっているのでしょうか?

numb4.png

numb5.png

ねんのために、パスを念入りにfileに変換して指定してみましたが……状況は変わりません。

スクリプト名:Numbers 3.1でファイル保存のテスト
set anAlias to choose file name
set anAliasStr to anAlias as string

tell application “Numbers”
  tell document 1
    save in file anAliasStr –ダメだった(T_T)
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

あと、AppleScript用語辞書の「save」命令のオプションに「as Numbers」という用語が使えると書いてありますが、構文確認(コンパイル)すると、「as number」と解釈されてエラーになります。ちゃんと、実装してから用語辞書に明記してほしいものです。

numb6.png

非互換スクリプト名:Numbersで指定シート上の最初のテーブルと同じデータとサイズでシート&テーブルを連続作成

空きセルから値を取得すると、以前は数値の0が返ってきましたが、いまはmissing valueになります。また、1列目と1行目のヘッダー列の扱いが変わったようで、これらに値を設定することもできません。

非互換スクリプト名:Numbersで新規ドキュメントをオープンする

バンドル内におけるテンプレートのフォルダ位置がResourceフォルダ外に変更になりました。ただし、普通にmake new documentで新規ドキュメントの作成ができるようになったので、今後は無理矢理テンプレートをオープンする方法はつかわなくて大丈夫です。

スクリプト名:Numbers 3.1で新規ドキュメント作成
tell application “Numbers”
  make new document
end tell
–> document “名称未設定 2″ of application “Numbers”

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

今回のNumbers 3.1をAppleScript的に評価すると、60点といったところでしょうか。もともとの機能はほぼ復活して、部分的には以前の実装でおかしかったところ(rangeのnameをまともに扱えなかったり、新規ドキュメント作成がまともにできなかったり)が直っていたりと前向きに評価できます。

その一方で、最も重要な機能ともいえるファイル保存がまともにできないのは大きなマイナスです。空きセルの値の解釈が変更になったことも、プログラムの書き換えが必要になるため、感心しません。

Windowの枚数をカウントさせると、開いてもいないウインドウ(見えないウィンドウ)の枚数まで同じようにカウントできていますが、これは元々の挙動がおかしかったので、変なところで互換性を維持しなくてよいと思います。見えないウィンドウがAppleScriptからカウントできるアプリケーションは、基本的にダメなアプリケーションです(たいへんに残念なレベルです)。

せめてあともう1回、バージョン3.2ぐらいで修正されれば、「元通り」の機能レベルが回復できるのではないでしょうか。

あいかわらず、リリース前にひととおりScriptの動作内容を確認するぐらいはしてもいいと思うのですが、この内容ではリリース前に動作確認はしていないのでしょう。

■参考資料:動作確認実施AppleScriptのリスト
numb7.png