вызвать электронную почту за один день до срока, используя JavaScript - PullRequest
0 голосов
/ 29 марта 2019

Мне нужно отправить письмо получателю за 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());
    }
}

Электронная почта должна срабатывать только для тех записей, у которых конечная дата - завтра.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Один из способов сделать это - создать Запланированное задание , которое при выполнении находит записи с датой исполнения в течение следующих 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 () может быть получена с помощью фильтра в виде списка запрашиваемой таблицы. После выбора фильтров запустите фильтр. На последнем запросе щелкните правой кнопкой мыши и выберите «Копировать запрос» .

0 голосов
/ 29 марта 2019

gr.getValue и gs.daysAgo обе возвращают строки, поэтому сравнение, которое вы проводите в if(u_loaner_return_date > today_date), просто сравнивает две строки.

Что вы действительно хотите, так это сравнить 2 даты или использовать 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 день до, а не просто любой днем ​​ранее), возвращаемое значение gs.dateDiff когда вы добавляете true в качестве третьего аргумента, это разница в секундах, положительная, если первый аргумент находится перед вторым аргументом, и отрицательная в противном случае.

...