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
参考资料
https://segmentfault.com/a/1190000011273388
Applescript快速入门及OmniFocus每日md报告开发的更多相关文章
- AppleScript 快速入门
AppleScript 快速入门 AppleScript 顾名思义是苹果开发的一套脚本语言,利用 AppleScript 在 macOS 系统上可以对其他程序进行操作,点击按钮.发送消息.模拟自动化执 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(四)
本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(三)
声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(一)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- AndroidStudio快速入门四:打造你的开发工具,settings必备
http://blog.csdn.net/jf_1994/article/details/50085825 前言:这里是使用AS的基本设置,适合新入手的朋友阅读,将这里介绍的设置完基本使用无忧啦. 1 ...
- 快速入门PaddleOCR,并试用其开发一个搜题小工具
介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
随机推荐
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)
一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...
- js 在浏览器中的event loop事件队列
目录 前言 认识一个栈两个队列 执行过程 异步任务怎么分配 简单例子 难一点的例子 前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意. 都说js是单线程的,不过它本身其 ...
- Python3使用Print输出彩色字体
一.介绍 在一些开发程序中,有些输出消息需要突出显示,我们可以尝试着给他们换上更靓丽的颜色来突出显示. 二.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. ...
- yum Multilib version problems
这两天在更新CentOS7系统时,出现了Multilib version problems错误,执行命令: # yum update 出现了的错误信息: .... ---> Package li ...
- robot_framewok自动化测试--(2)创建第一个项目
创建第一个robot_framewok项目 通过 RIDE 去学习和使用 Robot Framework 框架,对于初学者来说大大的降低了学习难度.所以后面对 Robot Framework 框架都将 ...
- windows下端口占用
1,netstat -ano | findstr 1235 2,taskkill /pid 9772 /f
- (十)JDBC(重点)
10.1 数据库驱动 驱动:声卡,显卡,数据库 我们的程序会通过 数据库 驱动和数据库打交道 10.2 JDBC SUN公司为了简化 开发人员的(对数据库的统一)操作,提供了一个(Java操作数据 ...
- Part 35 AngularJS caseInsensitiveMatch and Inline Templates
In this video we will discuss 2 simple but useful features in Angular caseInsensitiveMatch Inline Te ...
- python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度
目录: (一)图像加载与保存 (二)图像显示窗口创建与销毁 (三)图片的常用属性的获取 (四)生成指定大小的矩形区域(ROI) (五)图片颜色通道的分离与合并 (六)两张图片相加,改变对比度和亮度 ( ...
- 论文解读(LLE)《Nonlinear Dimensionality Reduction by Locally Linear Embedding》and LLE
论文题目:<Nonlinear Dimensionality Reduction by Locally Linear Embedding > 发表时间:Science 2000 论文地址 ...