未来日期applescript不会触发

时间:2019-06-19 08:41:51

标签: applescript automator

我是自由职业者,并且想设置一个自动服务,因此我可以快速将日期从今天的日期起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的屏幕截图以及键盘快捷键的系统偏好设置,以查看我是否在哪里出错了?

System Preferences Screenshot

Automator Screenshot

1 个答案:

答案 0 :(得分:1)

我对您的脚本有一些后思考,其中的一些建议并非至关重要,但从理论上讲,它们可能会改善性能并可能。为了保持连续性,并从其他想要学习解决问题的人中受益,这里总结了我之前的观点。跳到后面的部分,以获得其他建议:

序曲

  • 您当时采用的脚本尚不清楚,但是其中一个变体是从 Run AppleScript 操作内部调用do shell script的(在 Automator 内部),但它可能会在慢速系统上降低性能,因此如果您执行以下操作,则可能会得到响应速度更快的工作流:

    1. 将工作流程拆分为运行Shell脚本操作以检索日期,然后使用运行AppleScript 操作来执行AppleScript位; OR

    2. 通过一个运行Shell脚本操作即可完成所有操作,您可以在其中使用osascript执行AppleScript。听起来就等于从另一头开始,但这不是。

  • 您应该将 Scripting Additions 命令与属于某个应用程序的任何命令分开,这些命令在tell块内发送。具体来说,请移动以下行:

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

    tell块之前(因此位于外部)。要求系统事件返回current date(一个它不理解的命令),引发一个(无声的)错误,并将该命令沿继承链向上发送,直到到达{{1 }}实例,其中将 Scripting Additions 命令加载到其中。因此,这会影响性能,但解​​决此问题并不奇怪: Workflow Service Runner 不是应用程序,并且可能没有自己的current application实例。加载附加命令(它们仍然可以通过current application实例本身进行访问,但只能与任何AppleScript块一起使用)。

其他想法

可以通过使用特殊的类来改进/优化AppleScript,我们可以在其中强制使用tell application对象,并使其返回ISO 8601格式的日期和时间字符串,例如date。这可以更简单,更快捷地分解为其日期组件,并重新组合为标准的英式日期字符串。这是代码:

"2019-06-20T09:41:45"

旁边::是否应该从英国格式日期转换为ISO-8601标准格式日期,例如property text item delimiters : { "/", "-", "T"} return text items 1 thru 3 of ¬ ((current date) + 14 * days as ¬ «class isot» as string) as text ,AppleScript代码可以简化并执行更多操作:

"2019-06-20"

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

Automator Service Workflow in macOS (AppleScript)

即,选项 property text item delimiters : { "/", "-", "T"} return text 1 thru 10 of ((current date) + ¬ 14 * days as «class isot» as string) 内置于 Automator 中。我认为这很容易被忽略,因为“选择的文本”一词经常被认为是突出显示的选择,总是包含至少一个字符。但是,要使用AppleScript命名法作为类名,在文本输入中始终存在Output replaces selected text,并且所选文本的值至少为selection-object。基本上,它总是可以替换的,这是一种可以在插入点插入文本的机制。

如果选择该选项,则上面的AppleScript代码段是完整的脚本。  它绝不会改变生活,但是对于AppleScript来说,它的工作量更少,并且消除了依赖性(没有对 System Events 的调用),并且从学术上来讲,这可以带来速度,开销,和稳定性。

现在无需使用系统事件,您可以选择换出AppleScript并使用单个shell脚本:

Automator Service Workflow in macOS (Shell script)

再一次,在理论上有所改进。这其中是否有任何可证明的/实际的收益?可能不会。但是我认为有选择很不错。