スクリプトをスクリプトメニューから実行するとかなり実行速度が遅くなる。ちょっとした軽いスクリプトだとわからないが、重いスクリプトを走らせると如実にわかる。
アクティビティモニタで比較してみると、スクリプトエディタから実行するときは、数秒間CPU使用率が100%近くまで上がり、その後は25%ぐらいで推移し、十数秒で処理を終わらせる。ところが、スクリプトメニューから実行するとCPU使用率は20%ぐらいのままだらだらと推移し、3分ほどかかって処理を終わらせる。バックグラウンドで処理することを考慮してこうなっているのかもしれんが、余計なお世話よ。
で、これを回避するのに「スクリプトを実行するスクリプト」から実行するという手がある。
run script "実行スクリプトのパス"
例 run script "/Users/username/Library/Scripts/Applications/Excel/excelsum.scpt"
でいい。10.6だとパスの書き方はaliasでもPOSIX pathでもいいみたい。
2010年10月10日日曜日
2010年9月28日火曜日
Numbers:現在表示されているシートを取得/セルの式を取得
ExcelからiWork'09のNumbersにデータを移植する際、アップルスクリプトの互換性も気になるところ。
作業中に行き当たったのが、Numbersでは「現在表示されているシート」を示すプロパティがないこと。Excelでいうところの「active sheet」に相当するプロパティがない。もうひとつは、セルの値ではなく「式」を示すプロパティがないこと。Excelでいうところの「formula」に相当するプロパティがない。
「現在表示されているシート」については、もしセルを選択している状態ならば、以下の方法で現在表示されているシート(active_sheet)を取得することは可能。ただしセルを選択していないと、いずれのitemも{missing value}になってしまい、エラーとなる。
tell application "Numbers"
tell document 1
repeat with a_sheet in sheets
if selection range of tables of a_sheet is not {missing value} then set active_sheet to contents of a_sheet
end repeat
active_sheet
end tell
end tell
「式」については、一旦セルのformatプロパティをtextに変更し、テキスト化された計算式を取得するというやり方を提案している人がアップルのフォーラムにいる。これが現状では一番簡単なやり方かな。
tell application "Numbers"
tell table 1 of sheet 1 of document 1
set a_cell to a reference to cell of selection range
set a_format to format of a_cell
set format of a_cell to text
set a_formula to value of a_cell
set format of a_cell to item 1 of a_format
a_formula
end tell
end tell
で、これらを組み合わせて、現在選択しているセルの式を取得するアップルスクリプト。まあこれもtableがひとつというのが前提だから、そこまで突き詰めるとめんどくせー。
tell application "Numbers"
tell document 1
repeat with a_sheet in sheets
if selection range of tables of a_sheet is not {missing value} then set active_sheet to contents of a_sheet
end repeat
active_sheet
end tell
tell table 1 of active_sheet
set a_cell to a reference to cell of selection range
set a_format to format of a_cell
set format of a_cell to text
set a_formula to value of a_cell
set format of a_cell to item 1 of a_format
a_formula
end tell
end tell
作業中に行き当たったのが、Numbersでは「現在表示されているシート」を示すプロパティがないこと。Excelでいうところの「active sheet」に相当するプロパティがない。もうひとつは、セルの値ではなく「式」を示すプロパティがないこと。Excelでいうところの「formula」に相当するプロパティがない。
「現在表示されているシート」については、もしセルを選択している状態ならば、以下の方法で現在表示されているシート(active_sheet)を取得することは可能。ただしセルを選択していないと、いずれのitemも{missing value}になってしまい、エラーとなる。
tell application "Numbers"
tell document 1
repeat with a_sheet in sheets
if selection range of tables of a_sheet is not {missing value} then set active_sheet to contents of a_sheet
end repeat
active_sheet
end tell
end tell
「式」については、一旦セルのformatプロパティをtextに変更し、テキスト化された計算式を取得するというやり方を提案している人がアップルのフォーラムにいる。これが現状では一番簡単なやり方かな。
tell application "Numbers"
tell table 1 of sheet 1 of document 1
set a_cell to a reference to cell of selection range
set a_format to format of a_cell
set format of a_cell to text
set a_formula to value of a_cell
set format of a_cell to item 1 of a_format
a_formula
end tell
end tell
で、これらを組み合わせて、現在選択しているセルの式を取得するアップルスクリプト。まあこれもtableがひとつというのが前提だから、そこまで突き詰めるとめんどくせー。
tell application "Numbers"
tell document 1
repeat with a_sheet in sheets
if selection range of tables of a_sheet is not {missing value} then set active_sheet to contents of a_sheet
end repeat
active_sheet
end tell
tell table 1 of active_sheet
set a_cell to a reference to cell of selection range
set a_format to format of a_cell
set format of a_cell to text
set a_formula to value of a_cell
set format of a_cell to item 1 of a_format
a_formula
end tell
end tell
2010年9月21日火曜日
登録:
投稿 (Atom)