未来日期applescript不';t触发器

未来日期applescript不';t触发器,applescript,automator,Applescript,Automator,我是一名自由职业者,想建立一个自动售货机服务,这样我就可以快速地将从今天起14天的日期插入发票。 该脚本在automator中运行良好,并生成所需的结果,但我无法使用分配给它的键盘快捷键或通过应用程序菜单激活该服务来实际触发它 在故障排除方面的任何帮助都将不胜感激,或者如果有更好的方法来实现这一点,我将很乐意接受他们 现在这是我的剧本 on run {input, parameters} tell application "System Events" set _date

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


我对您的脚本有一些想法,其中有些建议在任何方面都不重要,但从理论上讲,可能会提供一点性能改进,可能还会增加稳定性。为了保持连续性,也为了其他想要了解是什么解决了最初的问题的人的利益,这里是我前面的评论的总结;请跳到后面的部分,获取一些其他建议:

序曲
  • 当时还不清楚您采用了哪种脚本,但其中一种变体从Automator内部的运行AppleScript操作中调用了
    do shell script
    ,但这可能会消耗缓慢系统的性能,因此如果您:

  • 将工作流拆分为一个运行Shell脚本操作以检索日期,然后一个运行AppleScript操作以执行AppleScript位;或

  • 在一个运行Shell脚本操作中完成这一切,在该操作中,您可以使用
    osascript
    执行AppleScript。这听起来相当于反过来做,但事实并非如此

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

    set _date to ((current date) + (days * 14))
    
    tell
    块之前(因此在其外部)。要求系统事件返回
    当前日期
    ——一个它不理解的命令——抛出一个(静默)错误,并沿继承链向上发送该命令,直到它到达加载脚本添加命令的
    当前应用程序
    实例。因此,这会影响性能,但修复此问题并不奇怪:工作流服务运行程序不是应用程序,并且可能没有自己的
    当前应用程序
    实例来加载添加命令(它们仍然可以通过
    AppleScript
    实例本身进行访问,但只能通过任何
    tell application
    块进行访问)

其他想法 AppleScript可以通过使用一个特殊类来改进/优化,我们可以将
日期
对象强制到该类中,并使其返回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选项替换了自动程序中内置的选定文本。我认为这很容易被忽略,因为“选定文本”这个短语,人们倾向于将其视为始终包含至少一个字符的明显突出显示的选择。但是,要使用AppleScript命名法作为类名,文本输入中始终存在一个
选择对象,并且所选文本的值至少为
“”
。基本上,它总是可以替换的,这就是在插入点插入文本的机制

如果选择该选项,则上面的AppleScript片段就是完整的脚本。 无论如何,它都不会改变生活,但AppleScript的工作量更少,而且它消除了依赖性(不需要调用系统事件),从学术角度讲,这可以推断出速度、开销和稳定性的好处

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


再一次,这是一个理论上的改进。这其中有没有真正可以证明的/实际的好处?可能没有。但我认为有选择是很好的。

您可以使用
set datePlus14Days to do shell script”/bin/date-v+14d+%d%m%Y来创建稍微简单一点的日期
@vadian-OP似乎希望将来的日期格式为
DD/MM/YYYY
,如果这是要求,您的shell脚本应该是
“/bin/date-v+14d+%d/%m/%Y”
(即在格式中添加
/
)@谢谢,当然,我忽略了slashes@RobC,感谢您在简化代码方面的帮助!我更新了我的帖子,添加了几个屏幕截图,希望能帮助您了解我的错误所在。如果您仍在这样做,请不要在insde Automator的AppleScript操作中运行
do shell script
命令。最好有两个单独的操作:第一个是shell脚本,它导致