Applescript快速入门及OmniFocus每日md报告开发
本篇主要记录 Applescript 基础语法,以及利用 applescript 生成 omnifocus 每日报告
从 windows 转换到 macos,最近一直在不断折腾,这两天浏览 github 过程中,看到 omnifocus 可以搭配 applescript 开发出一些自动化脚本,因此想开发一个 omnifocus 每日生成 Markdown 报告的脚本。
Applescript 快速入门
脚本编写 Eg.
applescript 最大的特点就是语法简单,编写一个清理废纸篓的脚本如下:
tell application "Finder" empty the trash end tell
变量 及 运算
变量的赋值和运算方法如下:
-- 变量赋值 set width to 8 set height to 9 -- 变量运算 set area to width * height -- 支持运算符 -- + - * / ^;
文本处理
文本处理的方法同样简单易懂
set str1 to "" set str2 to "test" set result to "YK" -- 拼接 set resultingString to nameOfActress & actressRating -- 长度 set theLength to the length of "Neal" -- 类型转换 set strToNumber to "16" as number set numToStr to 12 as string
弹窗
set stringToBeDisplayed to "say hi" display dialog "stringToBeDisplayed" display dialog stringToBeDisplayed
数据类型:list
set exampleList to {1,2,3,"hahah",9} -- 列表拼接 同样用 & 操作符 -- 变更元素 set item 2 of theList to "yang" set the second item of theList to "yang" set the 2nd item of theList to "yang" -- 取全部列表 get exampleList -- 取最后一个元素 set valueOfLastItem to item -1 of myList -- 一次取多个元素 set shortList to items 2 through 5 of myList -- 翻转数组 set reversedList to reverse of myList -- 获取数组的长度 set theListLength to the length of {"ds",1,2,3} set theListLength to the count of {"ds",1,2,3} -- 随机取数 set x to some item of {1,2,3} -- 自动类型转换 set myList to {"a"} set myString to "b" set result to myList & myStringls set itemized to every character to "Nealyang" -- 切分字符串时,可以自定义delimiters set AppleScript's text item delimiters to " " set AppleScript's text item delimiters to oldDelimiters
注释
-- 注释一行 # 注释一行 (xxx) 注释多行
条件语句
set ageEntered to 73 set myAge to 24 if ageEntered is myAge then display dialog "You are as old as I as" end if say "this sentence is spoken anyway"
错误捕获
try set x to 1 / 0 on error display dialog "Error:" & the error_number & "." & the error_message buttons {"OK"} end try
路径
路径分隔符用 :
函数
可定义需要参数和不需要参数的函数定义
on test(la) display dialog lala end test
至此,AppleScript 的基本语法已逐一学习,下面就利用上面的知识开(gai)发(xie)一个 OmniFocus 每日生成 report 的脚本,并利用 crontab 布置成定时任务每日执行。
OmniFocus 每日 Report 脚本
脚本生成的 Markdown 效果如下:
总体框架参考了 https://github.com/mygeekdaddy/OF-Markdown-Task-List,细节上根据需求更改了 report 的结构
每日 report 配合检查能更好的对 GTD 进行实践
更改后的 AppleScript 如下:
set CurrDatetxt to short date string of date (short date string of (current date)) set dateYeartxt to year of (current date) as integer if (month of (current date) as integer) < 10 then set dateMonthtxt to "0" & (month of (current date) as integer) else set dateMonthtxt to month of (current date) as integer end if if (day of (current date) as integer) < 10 then set dateDaytxt to "0" & (day of (current date) as integer) else set dateDaytxt to day of (current date) as integer end if set str_date to "" & dateYeartxt & "-" & dateMonthtxt & "-" & dateDaytxt set theFilePath to "Macintosh HD:Users:Insomnia:Desktop:效率小结:小结" & str_date & ".md" set due_Tasks to my OmniFocus_task_list() my write_File(theFilePath, due_Tasks) on OmniFocus_task_list() set CurrDate to date (short date string of (current date)) set TomDate to date (short date string of ((current date) + days)) set TomTomDate to date (short date string of ((current date) + days * 2)) set Tom7Date to date (short date string of ((current date) + days * 7)) set CurrDatetxt to short date string of date (short date string of (current date)) set bigReturn to return & return set smallReturn to return set strText to "## 📮" & CurrDatetxt & " 效率小结:" & smallReturn tell application "OmniFocus" -- 1. 列出今日已完成的任务 tell default document set refDueTaskList to a reference to (flattened tasks where (completion date > (CurrDate) and completion date ≤ TomDate and completed = true)) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set strText to strText & bigReturn & "### 🏅 今日已完成 <span style="\"color:green\"">" & length of lstName & " 项任务 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "✅`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end repeat end tell -- 2. 列出今日未完成的任务 tell default document set refDueTaskList to a reference to (flattened tasks where due date ≤ TomDate and completed = false) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set strText to strText & bigReturn & "### ❗️ 今日未完成 <span style="\"color:orange\"">" & length of lstName & " 项任务 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "📌`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end repeat end tell -- 3. 列出过期的任务 tell default document set refDueTaskList to a reference to (flattened tasks where due date < CurrDate and completed = false) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set strText to strText & bigReturn & "### ‼️ 已有 <span style="\"color:red\"">" & length of lstName & " 项任务严重延期 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "📌`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end repeat end tell -- 4. 列出明日已计划的任务 tell default document set refDueTaskList to a reference to (flattened tasks where due date > TomDate and due date ≤ TomTomDate and completed = false) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set strText to strText & bigReturn & "### 📆 明日已计划 <span style="\"color:blue\"">" & length of lstName & " 项任务 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "💫`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end repeat end tell -- 5. 列出未来七天的紧急和重要的任务 tell default document set refDueTaskList to a reference to (flattened tasks where due date ≤ Tom7Date and completed = false) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set icount to 0 repeat with iTask from 1 to count of lstName set varContext to item iTask of lstContext if varContext = "*Important" or varContext = "+Urgent" then set icount to icount + 1 end if end repeat set strText to strText & bigReturn & "### 7️⃣ 未来七天共 <span style="\"color:purple\"">" & icount & " 项**紧急/重要**任务 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if varContext = "*Important" or varContext = "+Urgent" then if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "⚠️`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end if end repeat end tell -- 6. 列出未指定日期且未完成的任务 tell default document set refDueTaskList to a reference to (flattened tasks where due date = missing value and completed = false) set {lstName, lstProject, lstContext, lstDueDate} to {name, name of its containing project, name of its primary tag, due date} of refDueTaskList set strText to strText & bigReturn & "### 🈳 仍有 <span style="\"color:turquoise\"">" & length of lstName & " 项任务未指定到期日 </span>" & ":" & bigReturn set strText to strText & "|项目|任务|dateDue|" & smallReturn & "|--|--|--|" & smallReturn repeat with iTask from 1 to count of lstName set {strName, varProject, varContext, varDueDate} to {item iTask of lstName, item iTask of lstProject, item iTask of lstContext, item iTask of lstDueDate} if (varDueDate < (current date)) then set strDueDate to "**<span style="\"color:red\"">" & short date string of varDueDate & "</span>**" else try set strDueDate to short date string of varDueDate on error set strDueDate to " " as string end try end if set strText to strText & "|" & "❓`" & varProject & "`" & "|" & " " & strName & " " & "|" & strDueDate & "|" & smallReturn end repeat end tell end tell strText end OmniFocus_task_list --Export Task list to .MD file on write_File(theFilePath, due_Tasks) set theText to due_Tasks set theFileReference to open for access theFilePath with write permission write theText to theFileReference as «class utf8» close access the theFileReference end write_File tell application "Typora" open file theFilePath end tell