文章目錄
最近想用一用系統自帶的提醒事項和日曆軟件,但是總覺得打開應用操作太麻煩,想通過 Alfred 快捷操作。
但是最後沒發現很好用的、現成的 workflow,於是只能研究一下蘋果提供的腳本服務。
本來在猶豫,因爲不想花功夫去學 AppleScript,幸好發現最近蘋果已經支持 JavaScript 來寫腳本了,所以就花了半天時間研究了一下。
什麼是自動化任務
我這裏說的自動化任務,主要是用來提高工作效率的小程序,例如:
- 定期清理下載文件夾下的特定文件
- 通過 Alfred 快速創建日曆事件,免去鼠標操作
- 快速實現圖片裁剪、文件中的文本替換等任務
- 通過 Alfred 快速操作瀏覽器,例如打開某個收藏夾
- 設置郵箱規則,定期清理無用郵件
在哪裏編寫、使用我們的腳本
1 Script 應用
蘋果提供了 Script Editor 應用
你可以使用 Object C、AppleScript 或者 JavaScript 編寫一些小腳本,按照官方網站說明,可以生成幾種類型的腳本:
- Applets:可以雙擊執行的小腳本
- Droplets:可以將文件拖拽到腳本上進行執行
- Scripts:可以被其他腳本 / 命令行調用、執行的腳本
- Stay-open scripts:打開後持續執行的小腳本,每 30 秒左右會執行一次
Script 軟件的使用說明,可以參考官網
2 automator
編寫後的腳本,可以通過多種方式執行,除了上述所說的雙擊、拖拽文件、命令行以外,還可以在 mac 自帶的 automator 中添加、使用 JS 腳本,如下方截圖
3 Alfred
付費軟件 Alfred 中的 workflow 中可以添加 AppleScript 或 JavaScript 寫的 NSApple 腳本,其中 JavaScript 語言的腳本只能通過 Run Script 添加,不能通過 Run NSAppleScript 添加
記得選擇 oascript(JS) 作爲腳本的“語言”
自動化腳本基本框架
類似 C 語言中的 main
函數,Mac 在執行 JS 腳本時,會調用 run
函數,因此需要在腳本中對該函數進行定義
function run(input, parameters) {
...
}
Droplets 相對特殊,需要對拖拽到腳本上的文件進行處理,會調用 openDocuments
函數
function openDocuments(droppedItems) {
// Process the dropped items here
}
如果需要使用 Stay-open scripts,需要在保存腳本時選擇相應選項,同時定義 idle
function idle() {
...
}
函數
如果希望在退出腳本時執行特殊動作,需要定義 quit
函數
function quit() {
app.displayDialog("The script is quitting.")
}
與系統中的應用進行互動
系統中的一些應用是可以與腳本進行互動的,我們需要關心到底有哪些應用支持與腳本互動,又具有哪些能力。
Script 應用提供了詞典功能,在詞典中定義了系統中支持與腳本互動的所有應用,及其所有動作。
你可以通過 文件 > 打開詞典
,來打開詞典,快捷鍵 Command + Shift + O
我們以系統自帶的備忘錄爲例,看看到底有哪些能力
在實際的使用過程中,當你需要與某個應用互動時,你需要首先使用 Application 生成一個應用,例如我們生成一個 Notes 實例
var notes = Application('Notes');
// 通過 notes 實例與備忘錄應用產生互動
例如我可以利用上面生成的 notes 做些事情
// 獲取文件夾列表,並打印文件夾名稱
var f = notes.folders;
for (i in f) {
console.log(f[i].name());
}
// 新增一個筆記,並添加到第一個文件夾
var new_note = notes.Note({
name: '標題',
body: '內容'
})
notes.folders[0].push(new_note)
進行簡單的用戶交互
腳本提供了一些用戶交互能力,例如調用對話框、用戶輸入框、文件選擇器等。
1 對話框
var app = Application.currentApplication()
app.includeStandardAdditions = true
var dialogText = "An error has occurred. Would you like to continue?"
app.displayDialog(dialogText, {
buttons: ["Don't Continue", "Continue"],
defaultButton: "Continue",
cancelButton: "Don't Continue"
})
// Result: {"buttonReturned":"Continue"}
2 用戶輸入框
var app = Application.currentApplication()
app.includeStandardAdditions = true
var alertText = "An error has occurred."
var alertMessage = "The amount of available free space is dangerously low. Would you like to continue?"
app.displayAlert(alertText, {
message: alertMessage,
as: "critical",
buttons: ["Don't Continue", "Continue"],
defaultButton: "Continue",
cancelButton: "Don't Continue"
})
// Result: {"buttonReturned":"OK"}
3 系統通知
var app = Application.currentApplication()
app.includeStandardAdditions = true
app.displayNotification("All graphics have been converted.", {
withTitle: "My Graphic Processing Script",
subtitle: "Processing is complete.",
soundName: "Frog"
})
4 文件選擇器
var app = Application.currentApplication()
app.includeStandardAdditions = true
var document = app.chooseFile({
withPrompt: "Please select a document to process:"
})
document
// Result: Path("/Users/yourUserName/Documents/ImportantDoc.pages")
5 用戶選項
var app = Application.currentApplication()
app.includeStandardAdditions = true
var fruitChoices = ["Apple", "Banana", "Orange"]
var favoriteFruit = app.chooseFromList(fruitChoices, {
withPrompt: "Select your favorite fruit:",
defaultItems: ["Apple"]
})
favoriteFruit
// Result: ["Apple"]
一些遺憾
蘋果的腳本雖然支持 JavaScript,但是並不如對 AppleScript 的支持那麼好,例如有一些操作就只能提供了 AppleScript 的 API,包括:
- 調用命令行
- 模擬用戶點擊操作
如果你希望使用這些功能,那麼可能你還是得學習 AppleScript 語言,或者通過別的方式找到解決方案。