applescript - 未来日期小程序不会触发
问题描述
我是一名自由职业者,想建立一个自动化服务,这样我就可以快速将今天起 14 天的日期插入发票。该脚本在 automator 中运行良好并产生所需的结果,但我无法使用分配给它的键盘快捷键或通过应用程序菜单激活服务来实际触发它。
在故障排除方面的任何帮助将不胜感激,或者如果有更好的方法来实现这一点,我很乐意接受他们。
现在这是我的脚本
on run {input, parameters}
tell application "System Events"
set _date to ((current date) + (days * 14))
keystroke ¬
text -2 thru -1 of ("00" & ((day of _date) as integer)) & "/" & ¬
text -2 thru -1 of ("00" & ((month of _date) as integer)) & "/" & ¬
(year of _date as text)
end tell
end run
编辑 2
感谢@vadian 和@RobC 在简化代码方面的帮助!我已经将我的键盘快捷键更改为我确定没有被使用但仍然没有运气神秘地获得任何结果的东西。只要我可以让它工作,我就不需要捷径。附件是来自 Automator 的屏幕截图和键盘快捷键的系统首选项,看看我是否在哪里出错了?
解决方案
我对您的脚本有一些事后想法,其中一些建议并不重要,但从理论上讲,可能会提供小的性能改进,并且可能会带来额外的稳定性。为了保持连续性,并让其他想要了解是什么解决了最初的问题的人受益,这里是我之前从上面的评论的摘要;跳到后面的部分以获得一些额外的建议:
序幕
当时还不清楚您采用了哪个脚本,但其中一个变体从Automatordo shell script
内部的Run AppleScript动作内部调用,但它可能会消耗慢速系统的性能,因此您可能会得到一个如果您:将工作流程拆分为一个Run Shell Script动作来检索日期,然后是一个Run AppleScript动作来执行 AppleScript 位;或者
在单个Run Shell Script操作中完成所有操作,您可以在其中osascript
执行 AppleScript。这听起来相当于他反过来做,但事实并非如此。
您应该将脚本添加
tell
命令与属于在块内发送的应用程序的任何命令分开。具体来说,移动这一行:set _date to ((current date) + (days * 14))
在块之前(因此,在
tell
块之外)。要求系统事件返回current date
- 它不理解的命令 - 引发(静默)错误,并将命令向上发送到继承链,直到它到达加载脚本添加current application
命令的实例。因此,这会影响性能,但解决了问题也就不足为奇了:Workflow Service Runner不是应用程序,并且可能没有自己的实例来加载添加命令(它们仍然可以访问通过实例本身,但仅限于任何块)。current application
AppleScript
tell application
额外的想法
AppleScript 可以通过使用一个特殊的类来改进/优化,我们可以强制一个date
对象并让它返回一个 ISO 8601 格式的日期和时间字符串,例如"2019-06-20T09:41:45"
. 将其分解为日期组件并重新组装成标准的英国格式日期字符串更简单、更快捷。这是代码:
property text item delimiters : { "/", "-", "T"}
return text items 1 thru 3 of ¬
((current date) + 14 * days as ¬
«class isot» as string) as text
另外:如果您曾经从英国格式转换到 ISO-8601 标准格式的日期,例如"2019-06-20"
,AppleScript 代码可以简化并执行更多:
property text item delimiters : { "/", "-", "T"}
return text 1 thru 10 of ((current date) + ¬
14 * days as «class isot» as string)
目前,您正在让系统事件通过有效地为您输入日期来插入日期。这不是一个坏方法,也不是一个好方法,但最重要的是,它忽略了一个就在你鼻子底下的选项:
即,Output replaces selected text
内置于Automator的选项。我认为由于“选定文本”这一短语很容易被忽视,人们倾向于将其视为始终包含至少一个字符的明显突出显示的选择。但是,要为类名使用 AppleScript 命名法,selection-object
文本输入中的 a 始终存在,并且所选文本的值至少是""
. 基本上,它总是可以被替换的,这就是人们可以在插入点插入文本的机制。
如果您选择该选项,则上面的 AppleScript 片段就是完整的脚本。它不会以任何方式改变生活,但它对 AppleScript 的工作量更少,并且它消除了依赖项(没有调用System Events),并且从学术上讲,这推断出对速度、开销和稳定性的好处。
无需使用System Events,您现在可以选择换出 AppleScript 并使用单个 shell 脚本:
再次,理论上的改进。这些是否有任何真正可证明/实际的收益?可能不是。但我认为有选择是件好事。
推荐阅读
- php - Node js sha512 相当于PHP?
- android - 滚动时,Android Horizontal RecylerView 显示与适配器上最后一项相同的项目
- android - 如何调试错误“AAPT2 错误:检查日志以获取详细信息”?
- php - 使用 PDO 获取单个数据并存储在变量中
- javascript - 如何在开发过程中向文档添加属性,但不保存到数据库?
- java - PDFClown:如何克隆页面
- yocto - 用 Yocto 编译 Dlib 库
- c++ - VisualStudio 2010 C++ 颜色主题
- asp.net-mvc - MVC:无法弄清楚这段代码是如何命中存储过程的
- wordpress - 更新插件时出现 WordPress HTTP ERROR 500