[Mac OS X] AppleScript-行事曆當日事件同步到便條紙:進階班
此篇為[Mac OS X] Automator-惱人的重複工作小幫手:初級班的進階。Automator本身雖然內建許多實用且常用的指令,提供我們用拖拉、組合的方式,將不同的指令組合起來,完成自動化工作流程。但也不是所有的工作都有現成的指令,例如本篇的應用案例,將「行事曆」當日事件標題抓出來,同步到「便條紙」當中,作為當日行程的摘要,顯示在桌面上。所以這個時候就需要撰寫AppleScript來達成我們自動化工作流程的目的。本篇將著重在應用案例,介紹如何使用AppleScript來自動化我們的工作流程,並以單日及多天數事件進行測試,最後成果如下圖。
AppleScript
AppleScript為蘋果公司所開發的腳本語言,可以用來控制Mac OS X上運行的應用程式。其”自然語言”的特性,讓開發者以類似人與人之間溝通的語言來撰寫程式碼,讓即使沒有程式碼撰寫經驗的人,能夠以日常語言經驗進行開發。「AppleScript Editor」為AppleScript整合開發環境(IDE),但目前「AppleScript Editor」也支援使用JavaScript進行開發。對我來說,現在的AppleScript概念已經不單單是一個語言了,而是泛指能夠開發控制Mac OS X應用程式的語言,也就是AppleScript, JavaScript。支援AppleScript的應用程式
支援AppleScript的內建應用程式如Finder,Safari,photo及部分第三方應用程式如Office, PDF, Photoshop等,稱為Scriptable Applications。意思就是在上述應用程式開發的過程中,針對AppleScript開出相對應的API,讓使用者透過此API直接操控應用程式。為了要支援AppleScript,應用程式在開發的過程中,要額外花心力針對AppleScript做開發,所以不是所有應用程式開發者都願意這麼做。但也不代表沒辦法操控那些Non- Scriptable Applications,我們可以透過GUI Scripting,模擬使用者操作介面的方式,例如點擊程式內UI元件或者鍵盤按下某個鍵等,間接操控這些應用程式。AppleScript語言語法及應用程式API
網路上有很多AppleScript入門的教學,如AppleScript入门。其對於一些基礎重要語法,解說得簡明易懂,並搭配一些適當的例子。想要更進一步的話,推薦到蘋果的官方網站,《AppleScript Language Guide》 。應用程式的API則可以在AppleScript Editor「檔案」->「打開指令詞彙」看到相關應用程式指令。接下來,我會介紹如何從「行事曆」中抓出當日事件標題及時間地點等資訊,貼到「便條紙」當中,作為當日行程的摘要。整個工作流程的邏輯可以拆解為一般Scripting及GUI Scripting兩大過程。先使用「行事曆」開給AppleScript的API來取得事件,並從所有事件中篩選出當日事件相關的資料,並將資料複製至剪貼板;之後再用GUI Scripting的方式,模擬「貼上」鍵盤快捷鍵,將資料貼至沒有支援AppleScript的「便條紙」應用程式中。
P.S 程式碼中綠色字為自定義變數名稱、藍色字為程式保留變數、紫色字為Class物件的屬性
一.「行事曆」篩選當日事件資料,並將資料複製至剪貼板
以上設定了當天開始日期(currentDateStart)與結束日期(currentDateEnd)變數,以及把等會要排除的清單指定給excludedCal變數。1. eventContent 變數儲存了待會要貼到「便條紙」上的所有文字
2.repeat with aCalendar in theCalendars ,遍歷所有行事曆。在每個行事曆當中再repeat with aEvent in todayEvents,遍歷該行事曆中的所有當日事件(todayEvents),篩選過程的程式碼在紅色框當中。此外repeat 1 times為一 個小技巧,用一次的迴圈來判斷該迴圈抓到的行事曆名稱,有沒有在要排除的清單裡面。如果是,則跳出迴圈,再換下一個行事曆做判斷。會這麼做是因為,AppleScript沒有一般程式語言,迴圈當中的continue機制。
3.藍色框的程式碼則代表將”事件”這個物件中的屬性(summary, description, location),處理後存到相關的變數。
4.棕色框是自定義的function,拿來處理List插入元素的工作,該function實作在最後附上的完整原始碼當中。
5.待抓出所有當日事件的相關資料後,把資料指定到剪貼板的變數當中(the clipboard)。
二.以GUI Scripting,模擬「貼上」鍵盤快捷鍵,將剪貼板的內容複製到「便條紙」。
雖然「便條紙」是內建的應用程式,但它卻沒有支援AppleScript API,非常的令人沮喪,不過我們還是可以用GUI Scripting的方式來操控它。在GUI Scripting當中最重要的就是System Events了,它管理了所有被開啟的應用程式。所以在這邊我們要透過System Events來取得「便條紙」這個物件下,可以讓我輸入文字的UI元件,也就是text area,再模擬按下command+a跟command+v按鍵,全選後貼上剪貼板中的內容。至於怎麼取得應用程式內的UI元件,可以參考使用Accessibility Inspector来检测iOS APP中控件元素的层级结构,雖然文章中講的是iOS APP,但Mac OS X APP也一樣適用。接著儲存檔案後,可以利用「Scheduler」這個免費的排程軟體,在每天固定的時間執行腳本,來更新「便條紙」上面的當日行程摘要。最後附上完整的程式碼。
以上介紹了如何使用AppleScript來自動化我們的工作流程。在研究AppleScript這個腳本語言過程中,發現自然語言的這個特性有時候反而是一種累贅。雖然語法簡單易懂,但是同樣的邏輯,程式碼量比用JavaScript寫的還多。這樣反而不容易閱讀。可能Apple也因為這樣,所以後來才加入JavaScript當作另一個Scripting language。
留言
張貼留言