我们的团队正在尝试为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);
}
}
关于如何编写这样的脚本的任何想法?
答案 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扩展是免费的)