我正在编写一个Google Apps脚本,以创建基于我收到的工作的自动化电子邮件的日历事件。我正在使用正则表达式来提取我需要在Google日历中填充事件的信息。到目前为止,除了一个函数,GetEndTime(),我的所有功能都按预期工作,它应该找到工作的结束时间,但目前随时返回NULL。我使用exec()的所有其他功能正常工作。
我读了有关exec()返回null并解决了常见问题的其他许多问题,例如删除'g'标签并将lastIndex重置为0之前,请在调用exec()。我还使用Regex101.com使用JavaScript选项检查了我的正则表达式,该选项显示了我期望的匹配。
在Regex101上有效的我的正则表达式,但在我的代码中却不是:
/(Substitutes+Reports+Times:s+[0-9_ ]*:[0-9_ ]*s+[A-Z_ ]*s+-s+)([0-9_ ]*:[0-9_ ]*s+(AM|PM))(r|n)/
我的代码是:
function findJobs() {
//Searches Gmail for substitute jobs and creates an event on the calendar
//Gets emails with 'NewJobs' label
var label = GmailApp.getUserLabelByName("NewJobs");
var threads = label.getThreads();
for (var i = 0; i < threads.length; i++){
var messages = threads[i].getMessages();
Logger.log("Thread " + i);
for (var j = 0; j < messages.length; j++) {
Logger.log("Message " + j);
//gets email body in plain text
var body = messages[j].getPlainBody();
Logger.log("Getting body..." + j);
//gets school name
var school = getSchool(body);
Logger.log(school);
//gets start time
var starttime = getStartTime(body);
Logger.log(starttime);
//gets end time
var endtime = getEndTime(body);
Logger.log(endtime);
//gets teacher name
var teacher = getTeacher(body);
Logger.log(teacher);
//gets school address
var address = getLocation(body);
Logger.log(address);
//gets date
var startdate = getDate(body);
Logger.log(startdate);
CalendarApp.getDefaultCalendar().createEvent("Subbing - " + school, new Date(startdate + " " + starttime), new Date(startdate + " " + endtime), {location: address, description: teacher});
//threads[j].removeLabel(label);
}
}
Logger.log("--Done--");
}
function getSchool(text){
//Gets the school name from an assignment email
//Regular expression for school name
var regex = /(Schools+:s+)([a-zA-Z0-9_ ]*)(r|n)/;
regex.lastIndex = 0;
var match = regex.exec(text)[2];
return match;
}
function getDate(text){
//Gets the start date from an assignment email
//Regular expression for start date
var regex = /(Date:s+)([0-9_ ]*/[0-9_ ]*/[0-9_ ]*)(r|n)/;
regex.lastIndex = 0;
var match = regex.exec(text)[2];
return match;
}
function getStartTime(text){
//Gets the start time from an assignment email
//Regular expression for start time
var regex = /(Substitutes+Reports+Times:s+)([0-9_ ]*:[0-9_ ]*s+(AM|PM))/;
regex.lastIndex = 0;
var match = regex.exec(text)[2];
return match;
}
function getEndTime(text){
//Gets the end time from an assignment email
//Regular expression for end time
var regex = /(Substitutes+Reports+Times:s+[0-9_ ]*:[0-9_ ]*s+[A-Z_ ]*s+-s+)([0-9_ ]*:[0-9_ ]*s+(AM|PM))(r|n)/;
regex.lastIndex = 0;
Logger.log("End Time reset index...");
var match = regex.exec(text)[2];
Logger.log("End Time exec...");
return match;
}
function getTeacher(text){
//Gets the teacher name from an assignment email
//Regular expression for teacher name
var regex = /(Teachers+:s+)([a-zA-Z0-9_ ]*,[a-zA-Z0-9_ ]*)(r|n)/;
regex.lastIndex = 0;
var match = regex.exec(text)[2];
return match;
}
function getLocation(text){
//Gets the location from an assignment email
//Regular expression for location
var regex = /(Address:s+)(.*)(r|n)/;
regex.lastIndex = 0;
var match = regex.exec(text)[2];
return match;
}
这是我收到的典型电子邮件:
You have been assigned as a substitute for a job starting on 9/21/2017.
The following are the details of the job:
*************
Job Summary
*************
Starting On : 9/21/2017
School : School Site
Title : Pre School Teacher
Teacher : Name, Teacher
Substitute : Name, Substitute
Confirmation # : 123456
**********
Job Days
**********
School
---------------------------------------
School Site
Date: 9/21/2017
Employee Times: 8:00 AM - 3:30 PM
Substitute Report Times: 8:00 AM - 3:30 PM
***********************************
School Contact Information
***********************************
School Site
-----------------------------------------------------------
Address: 123 Main Ave Anytown , USA 555555
Phone: 5555555555
-----------------------------------------------------------
**********************
Special Instructions
**********************
Please do not reply to this system generated message. If you need help or have additional questions, please send an email to abc@abc.com
Thank you for using the substitute assignment system. Powered by Aesop
您使用的模式似乎过于复杂。我不能确定是什么原因导致它失败了,但是我的猜测是结尾处的(r|n)
(请注意,如果您真的想这样做,则可以键入[rn]
)。
尝试一下:
Substitute Report Times:.+ - (d{1,2}:d{1,2} [AP]M)
这假设结束时间始终是连字符和空间之前的,从您提供的示例文本中看起来就是这种情况。