指定フォルダ以下のWordファイルをSpotlight機能でリストアップし、かたっぱしからPDF書き出しするAppleScriptです。
Wordの制御以外はありもののルーチンを組み合わせただけなので、とくにたいした手間がかかっているわけではありません。
逆に、Wordでファイルをオープンするという動作が割とたいへんだということがわかりました。Wordの書類によっては変換の必要があるようで、オープン時に形式を聞かれました。Word書類を作成したWordのバージョン次第のようですが、注意したいところです。Script中ではオートで変換してくれるように指定しておいたものの、それほど現場でさまざまな書類を処理したわけではありません。
処理する書類の古さや、作成したWordがどのOS上で作られたかによっては、さらに何かを追加指定する必要があるかもしれません(確認は作成時最新のWord v16.24+macOS 10.12.6にて行いました)。
Spotlightでサーチして、指定フォルダ以下のWord書類をすべてリストアップしたあと、オープンしてPDFに書き出してクローズ、という動作を繰り返します。実にAppleScript「らしい」処理です。
これを、GUI Scripting(メニューやボタンの強制的な操作)だけで行うサンプルもあるようですが、GUI Scriptingは各アプリケーションの持っているAppleScriptのコマンド(AppleScript用語辞書に書かれています)に記載のない命令を「仕方なく」「例外的に」実行するだけのものであって、こういう「命令が最初から用意されているコマンド」を実行させてもメリットが何もありません。
GUI Scriptingを使ったScriptを評して「遅い」とか「確実性がない」と言われることが多いようですが、それはGUI Scriptingを使っているからです。GUI Scriptingを使うと、AppleScript本来の処理速度よりも10〜100倍ぐらい遅くなる(Cocoaの機能を活用している現代のAppleScriptだとそこから50倍ぐらい高速)ものなので、GUI Scriptingが(System Eventsを用いてメニューやボタンのクリックが行われている)多用されているAppleScriptは、本来の性能を活かせない可能性が高い(もっと高速に処理できる余地がある)ことを知っていただきたいところです。
本Scriptはそのような意味をこめて作成・公開したものです。
–> Download WordFileToPDFExporter Run-Only (Applet)
AppleScript名:WordFileToPDFExporter.scptd |
— Created 2019-06-20 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use mdLib : script "Metadata Lib" version "2.0.0" –https://www.macosxautomation.com/applescript/apps/Script_Libs.html#Metadata_Lib property NSString : a reference to current application’s NSString property NSFileManager : a reference to current application’s NSFileManager property NSOrderedSame : a reference to current application’s NSOrderedSame set basePath to (path to desktop) as string –Target Folder to write PDFs set origPath to POSIX path of (choose folder with prompt "Select Word File Orig Folder") –(path to documents folder) –Find Word (.doc & .docx ) files by Spotlight set resList to mdLib’s searchFolders:{origPath} searchString:("kMDItemContentTypeTree == %@ || kMDItemContentTypeTree == %@") searchArgs:{"org.openxmlformats.wordprocessingml.document", "com.microsoft.word.doc"} if resList = {} then –No Word Files or Spotlight index is broken display dialog "There is no Word File within your folder.." buttons {"OK"} default button 1 with icon 1 return end if set resNumLen to length of ((length of resList) as string) –Close Word Documents without saving closeEveryWordDocs() of me set sCount to 1 –saving file counter set erCount to 0 –Loop by Word files repeat with i in resList set j to contents of i set anAlias to (POSIX file j) as alias set dRes to openWordFile(anAlias) of me if dRes is not equal to false then set numStr to retZeroPaddingText(sCount, resNumLen + 1) of me set newFile to basePath & numStr & "_" & (repFileNameExtension(dRes, ".pdf") of me) saveWordDocAsPDF(newFile) of me else set erCount to erCount + 1 end if set sCount to sCount + 1 –Increment end repeat –Report Finish if erCount = 0 then activate display dialog (sCount as string) & " Word files are converted to PDF.." buttons {"OK"} default button 1 with icon 1 else if erCount = 1 then set pluralStr to "" else set pluralStr to "s" end if activate display dialog (sCount as string) & " Word files are converted to PDF.." & return & "But " & (erCount as string) & "file" & pluralStr & " caused error to open" buttons {"OK"} default button 1 with icon 1 end if –最前面のWord Documentを指定パスにPDFとして書き出す on saveWordDocAsPDF(saveHFSpathStr) tell application "Microsoft Word" save as active document file name saveHFSpathStr file format format PDF close front document saving no end tell end saveWordDocAsPDF –指定パスのWord書類をオープンする on openWordFile(aFileAlias) tell application "Microsoft Word" try –このあたり、予想外にいろいろオープン処理を止めるダイアログ表示などがあるようなので試行錯誤が必要 open aFileAlias file converter open format auto tell front document set dName to name end tell on error return false end try end tell return dName end openWordFile –Word書類をすべてクローズ。未保存のものも破棄してクローズ on closeEveryWordDocs() try tell application "Microsoft Word" close every document without saving end tell end try end closeEveryWordDocs –ファイル名から拡張子を置換する on repFileNameExtension(origName, newExt) set aName to current application’s NSString’s stringWithString:origName set theExtension to aName’s pathExtension() if (theExtension as string) is not equal to "" then set thePathNoExt to aName’s stringByDeletingPathExtension() set newName to (thePathNoExt’s stringByAppendingString:newExt) else set newName to (aName’s stringByAppendingString:newExt) end if return newName as string end repFileNameExtension –数値にゼロパディングしたテキストを返す on retZeroPaddingText(aNum, aLen) set tText to ("0000000000" & aNum as text) set tCount to length of tText set resText to text (tCount – aLen + 1) thru tCount of tText return resText end retZeroPaddingText |