Google App Script Regex exec()仅在一个函数中返回null

时间:2017-09-25 18:15:38

标签: javascript regex google-apps-script null

我正在撰写Google Apps脚本,根据我收到的自动发送的电子邮件创建日历活动。我正在使用正则表达式来提取我需要在Google日历中填充事件的信息。到目前为止,除了一个函数getEndTime()之外,我的所有功能都按预期运行,它应该找到作业的结束时间,但是在它被调用的任何时候都会返回null。使用exec()的所有其他函数都可以正常工作。

我已经阅读了许多关于exec()返回null的其他问题并且修复了常见问题,例如删除了''在调用exec()之前标记并将lastIndex重置为0。我还使用regex101.com和Javascript选项检查了我的正则表达式,该选项显示了我对文本的期望。

我的正则表达式适用于regex101,但不在我的代码中:

/(Substitute\s+Report\s+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 = /(School\s+:\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 = /(Substitute\s+Report\s+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 = /(Substitute\s+Report\s+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 = /(Teacher\s+:\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

1 个答案:

答案 0 :(得分:0)

您使用的模式似乎过于复杂。我无法确定导致其失败的原因,但最后我的猜测是(\r|\n)(请注意,如果您真的想要,可以输入[\r\n]这样做。)

尝试使用此模式:

Substitute Report Times:.+ - (\d{1,2}:\d{1,2} [AP]M)

这假设结束时间总是以连字符和空格开头,从您提供的示例文本看来就是这种情况。