使用 JavaScript 創建 MacOS 自動任務


最近想用一用系統自帶的提醒事項和日曆軟件,但是總覺得打開應用操作太麻煩,想通過 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 語言,或者通過別的方式找到解決方案。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章