我需要在到期日前1天将电子邮件发送给受让人。我有此代码,但此方法将电子邮件发送到所有记录,而不是到明天到期。
while(gr.next()) {
var u_loaner_return_date = gr.getValue("u_loaner_return_date");
var today_date = gs.daysAgo(1);
if(u_loaner_return_date > today_date) {
gs.eventQueue('Asset_Loaner_Email_BeforeDueDate', gs, gs.getUserID());
}
}
电子邮件应仅针对结束日期为明天的那些记录触发。
答案 0 :(得分:1)
完成此任务的一种方法是创建一个计划的作业,该作业在执行时会查找下一个在24小时内到期的记录,并触发发送通知的事件。
下面的脚本查找任务表上所有记录,这些记录的到期日期是从现在开始的24小时到现在的24小时15分钟。该查询看起来像this。对于找到的每个记录,它将触发一个事件,并传递记录本身,并将assigned_to
作为参数。计划的作业设置为每15分钟运行一次。
根据您的喜好随意操作以下脚本,并将其添加到计划作业的脚本字段中。
var gr = new GlideRecord('task');
gr.addEncodedQuery('due_dateRELATIVEGE@minute@ahead@1440^due_dateRELATIVELT@minute@ahead@1555');
gr.query();
while (gr.next()) {
gs.eventQueue('due_date.approaching.event', gr, gr.assigned_to);
}
注释:
在sysauto
表上创建作业时,如果系统提示您执行此操作,则需要选择“自动运行所选脚本”。
可以通过在要查询的表的列表视图中使用过滤器来获取addEncodedQuery()函数的查询字符串。选择过滤器后,运行过滤器。在上一个查询中,right click and select "Copy query"。
答案 1 :(得分:0)
gr.getValue
和gs.daysAgo
都返回字符串,因此您在if(u_loaner_return_date > today_date)
中所做的比较只是比较两个字符串。
您真正想要的是比较两个日期,或使用将字符串值作为日期进行比较的API。快速更改是使用ServiceNow API gs.dateDiff(startDate, endDate, returnNumericSeconds)
:
if (gs.dateDiff(u_loaner_return_date, today_date, true) < 0)
//...u_loaner_return_date is after today_date ...
如果您需要更具体的逻辑(如果您想知道自己是否是1天前,而不仅仅是任何天,我想您可能会这样做),返回值{{ 1}},当您添加gs.dateDiff
作为第三个参数时,是秒数之差;如果第一个arg在第二个arg之前,则为正;否则为负。