Numbersの最前面の書類で選択中の表の範囲をHTML化してファイルに書き出すAppleScriptです。
Numbers v5.1+macOS 10.12.6、Numbers v5.2+macOS 10.13.6、Numbers v5.2+macOS 10.14.1で確認しています。
Numbers v5.xでは書類の書き出し(export)形式にPDF、Microsoft Excel、CSV、Numbers 09の4形式を指定できるようになっていますが、HTMLの表(table)に書き出してくれたりはしません。
GUI側(↑)にその機能がありませんし、AppleScript用語辞書(↓)にもそういう機能は見当たりません。
ただ、HTMLの表に書き出すという処理自体はとても初歩的で簡単な内容なので、「なければ作ればいい」ということになるでしょう。
そこで、ありもののルーチンを組み合わせて、選択範囲をHTMLの表(table)として書き出すScriptを書いて、OS標準装備のScript Menuに入れて利用しています。書き出すHTMLの内容は個人の趣味や用途に応じて大きく変わってきますので、そのあたりは自由に書き換えるとよいと思われます。
本Scriptは、電子書籍「AppleScript最新リファレンス」の正誤表(2018/1のBlog消失事件の影響で、書籍内で参照していたURLリンクが切れてしまったことへの対処)を作成するために、すでに存在していたものにほんの少しの修正を加えたものです。
データベースやデータからHTMLを作成するという処理は、自分がAppleScriptを覚えようと思ったきっかけでもあり(当時は、FileMaker Pro Server経由でLAN上でデータを共有して処理)、感慨深いものがあります。
AppleScript名:表の選択範囲をHTML化 v2 |
use AppleScript version "2.5" use scripting additions use framework "Foundation" use bPlus : script "BridgePlus" script spd property uniqList : {} end script set (uniqList of spd) to {} –Numbersからデータを取得する set aList to get2DListFromNumbersSelection() of me if aList = false then return set colCount to (length of first item of first item of aList) + 1 set aHeader to "<!DOCTYPE html><html lang=\"ja\" ><head><meta charset=\"utf-8\"><title>First</title><style>table , td, table , tr, th{border:1px solid #333333;padding:1px;}</style></head><body><table >" set aTable to "<tr><td>%@</td><td> </td><td>%@</td><td>%@</td><td>%@</td></tr>" set aFooter to "</table></body></html>" set aHTMLres to retTableHTML(aList, aHeader, aTable, aFooter) of me set tFile to choose file name with prompt "Select Output File Name and Folder" set fRes to writeToFileAsUTF8(aHTMLres, tFile, false) of me on retTableHTML(aList, aHeaderHTML, aTableHTML, aFooterHTML) set allHTML to current application’s NSMutableString’s stringWithString:aHeaderHTML set aCounter to 1 repeat with i in aList set j to contents of i set aRowHTML to "<tr>" repeat with ii in j set jj to contents of ii if jj = missing value then set jj to " " else try set aURL to (current application’s |NSURL|’s URLWithString:jj) if aURL is not equal to missing value then set jj to "<a href=\"" & jj & "\">" & jj & "</a>" end if end try end if set aTmpHTML to "<td>" & jj & "</td>" set aRowHTML to aRowHTML & aTmpHTML end repeat set aRowHTML to aRowHTML & "</tr>" (allHTML’s appendString:aRowHTML) set aCounter to aCounter + 1 end repeat (allHTML’s appendString:aFooterHTML) return allHTML as list of string or string end retTableHTML –テキストを指定デリミタでリスト化 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 front document tell active sheet set theTable to first table whose class of selection range is range tell theTable 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 on writeToFileAsUTF8(this_data, target_file, append_data) tell current application try set the target_file to the target_file as text set the open_target_file to open for access file target_file with write permission if append_data is false then set eof of the open_target_file to 0 write this_data as «class utf8» to the open_target_file starting at eof close access the open_target_file return true on error error_message try close access file target_file end try return error_message end try end tell end writeToFileAsUTF8 |