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 效果如下:

小结 2021-08-24.jpg

总体框架参考了 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

参考资料

https://segmentfault.com/a/1190000011273388

https://sspai.com/post/46912

posted @ 2021-08-25 01:34  AKA栗子  阅读(622)  评论(0编辑  收藏  举报