用于ServiceNow中重复任务的JS脚本

时间:2019-06-06 21:48:36

标签: javascript datetime servicenow

我们的团队正在尝试为ServiceNow中的重复任务开发脚本。我们有一个自定义表,其中包含start_date,end_date和一个间隔(number_of_days)。例如,如果任务的开始日期为6/6/2019,并且列出的间隔为3天,则我们希望脚本在6/9 / 2019、6 / 12 / 2019、6 / 15吐出任务/ 2019等。

首先,我们认为我们可以执行以下操作,在该操作中,我们计算开始和结束之间的日期差,如果余数为0,则退出该任务。例如,如果日期差异为10且间隔为2,并且可以很好地整除,则此方法效果很好。但是,例如,如果日期差异为15,而间隔仍为2,则显然不起作用。

if(trigger=='recurring'){
            var milestone_start = performance_start;
            var milestone_end = performance_end;
            var dur = GlideDateTime.subtract(milestone_start, milestone_end);

            var duration = dur.getNumericValue();
            var durationSeconds = (duration/1000);
            var durationDays = (durationSeconds/(60*60*24));

            if(durationDays % days == 0){
                var runScript=new customTaskUtils();
                var x = runScript.applyTasks(case_sysID,milestoneGR.sys_id);
            }
        }

关于如何编写这样的脚本的任何想法?

2 个答案:

答案 0 :(得分:0)

脚本缺少有关“今天”的内容,您如何知道今天还是明天要执行?

您需要检查持续时间是否均匀​​或不均匀。如果不均匀,并且%2返回1,则表明您应该执行任务。而且如果它是偶数且%2返回0,您也应该执行。

if (trigger == 'recurring') {
    var milestone_start = performance_start;
    var milestone_end = performance_end;
    var dur = GlideDateTime.subtract(milestone_start, milestone_end);

    var duration = dur.getNumericValue();
    var durationSeconds = (duration / 1000);
    var durationDays = (durationSeconds / (60 * 60 * 24));

    var isEven = (durationDays % days == 0);
    var daysSinceMilestoneStart = whichNumberIsTodayInInterval(milestone_start, milestone_end, new GlideDateTime())

    if (daysSinceMilestoneStart == -1) {
        return;
    }
    if (isEven && daysSinceMilestoneStart % 2 == 0) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else if (!isEven && !(daysSinceMilestoneStart % 2 == 0)) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else if (daysSinceMilestoneStart == 0) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else {
      // nothing
    }

    function whichNumberIsTodayInInterval(milestone_start, milestone_end, today) {
        if (milestone_start.before(today)) && milestone_end.after(today) {
            var dur = GlideDateTime.subtract(milestone_start, today);

            var duration = dur.getNumericValue();
            var durationSeconds = (duration / 1000);
            var daysSinceMilestoneStart = (durationSeconds / (60 * 60 * 24));
            return daysSinceMilestoneStart;
        }
        return -1;
    }
}   

答案 1 :(得分:0)

最好的方法是重新创建自定义表并扩展sysauto_script表。

这为您提供了安排重复工作所需的所有字段。

然后,您可以添加字段,例如表选择,模板或字段选择,以及用于对设置字段进行其他控制的脚本框。

创建脚本包含以使用记录上的字段运行逻辑,并在表上设置业务规则以设置表上的OOB脚本字段以运行当前记录的脚本包含。

然后,您将拥有一个可重复的流程,以一个简单的界面来安排新的重复任务,并且该表不会花费您许可证部门的任何费用(sysauto扩展是免费的)