首页 > 解决方案 > 未来日期小程序不会触发

问题描述

我是一名自由职业者,想建立一个自动化服务,这样我就可以快速将今天起 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 的屏幕截图和键盘快捷键的系统首选项,看看我是否在哪里出错了?

系统偏好设置截图

自动机截图

标签: applescriptautomator

解决方案


我对您的脚本有一些事后想法,其中一些建议并不重要,但从理论上讲,可能会提供小的性能改进,并且可能会带来额外的稳定性。为了保持连续性,并让其他想要了解是什么解决了最初的问题的人受益,这里是我之前从上面的评论的摘要;跳到后面的部分以获得一些额外的建议:

序幕

  • 当时还不清楚您采用了哪个脚本,但其中一个变体从Automatordo shell script内部的Run AppleScript动作内部调用,但它可能会消耗慢速系统的性能,因此您可能会得到一个如果您:

    1. 将工作流程拆分为一个Run Shell Script动作来检索日期,然后是一个Run AppleScript动作来执行 AppleScript 位;或者

    2. 在单个Run Shell Script操作中完成所有操作,您可以在其中osascript执行 AppleScript。这听起来相当于他反过来做,但事实并非如此。

  • 您应该将脚本添加tell命令与属于在块内发送的应用程序的任何命令分开。具体来说,移动这一行:

    set _date to ((current date) + (days * 14))
    

    在块之前(因此,在tell块之外)。要求系统事件返回current date- 它不理解的命令 - 引发(静默)错误,并将命令向上发送到继承链,直到它到达加载脚本添加current application命令的实例。因此,这会影响性能,但解​​决了问题也就不足为奇了:Workflow Service Runner不是应用程序,并且可能没有自己的实例来加载添加命令(它们仍然可以访问通过实例本身,但仅限于任何块)。current applicationAppleScripttell 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)

目前,您正在让系统事件通过有效地为您输入日期来插入日期。这不是一个坏方法,也不是一个好方法,但最重要的是,它忽略了一个就在你鼻子底下的选项:

macOS 中的 Automator 服务工作流程 (AppleScript)

即,Output replaces selected text内置于Automator的选项。我认为由于“选定文本”这一短语很容易被忽视,人们倾向于将其视为始终包含至少一个字符的明显突出显示的选择。但是,要为类名使用 AppleScript 命名法,selection-object文本输入中的 a 始终存在,并且所选文本的值至少是"". 基本上,它总是可以被替换的,这就是人们可以在插入点插入文本的机制。

如果您选择该选项,则上面的 AppleScript 片段就是完整的脚本。它不会以任何方式改变生活,但它对 AppleScript 的工作量更少,并且它消除了依赖项(没有调用System Events),并且从学术上讲,这推断出对速度、开销和稳定性的好处。

无需使用System Events,您现在可以选择换出 AppleScript 并使用单个 shell 脚本:

macOS 中的 Automator 服务工作流程(Shell 脚本)

再次,理论上的改进。这些是否有任何真正可证明/实际的收益?可能不是。但我认为有选择是件好事。


推荐阅读