2017-09-25 1 views
0

Je suis en train d'écrire un script Google Apps pour créer un événement de calendrier basé sur les e-mails automatisés que je reçois pour les tâches. J'utilise des expressions regex pour extraire les informations dont j'ai besoin pour remplir l'événement dans Google Agenda. Jusqu'à présent, tout fonctionne comme prévu, à l'exception d'une fonction, getEndTime(), qui devrait trouver l'heure de fin du travail, mais qui retourne actuellement la valeur null à chaque fois qu'elle est appelée. Toutes mes autres fonctions utilisant exec() fonctionnent bien. J'ai lu beaucoup d'autres questions concernant exec() retournant null et ont résolu les problèmes communs, tels que la suppression de la balise 'g' et la remise à 0 de lastIndex avant d'appeler exec(). J'ai également vérifié mon expression regex en utilisant regex101.com avec l'option Javascript, qui montre la correspondance que j'attends pour mon texte.Google App Script Regex exec() renvoie null uniquement dans une fonction

Mon expression regex qui fonctionne sur regex101, mais pas dans mon code est:

/(Substitute\s+Report\s+Times:\s+[0-9_ ]*:[0-9_ ]*\s+[A-Z_ ]*\s+-\s+)([0-9_ ]*:[0-9_ ]*\s+(AM|PM))(\r|\n)/ 

Mon code est:

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; 
} 

Voici un email typique que je reçois:

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 [email protected] 

Thank you for using the substitute assignment system. Powered by Aesop 

Répondre

0

Le motif que vous utilisez semble trop compliqué. Je ne peux pas dire avec certitude ce qui cause l'échec, mais je suppose que ce serait le (\r|\n) à la fin (notez que vous pouvez simplement taper [\r\n] à la place si vous voulez vraiment faire cela).

Donnez ce modèle un essai:

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

Cela suppose que l'heure de fin est toujours précédée d'un trait d'union et un espace, qui semble être le cas du texte de l'échantillon que vous avez fourni.

+0

Votre modèle a fonctionné! J'ai dû changer l'index de 2 à 1, mais cela a fonctionné! Juste par curiosité, j'ai essayé de remplacer (\ r | \ n) par [\ r \ n], mais j'ai quand même eu la même erreur. Je vais étudier un peu votre modèle de remplacement et voir ce que je peux en apprendre d'autre. Merci! –

+0

Désolé, je ne voulais pas dire que '[\ r \ n]' réglerait un problème causé par '(\ r | \ n)'; juste qu'ils sont synonymes en termes de ce qu'ils vont correspondre, mais le premier est plus simple et moins cher, car il ne crée pas un groupe de capture. Chaque fois que vous en faites correspondre un parmi un ensemble de caractères uniques, les crochets sont la solution (à quelques exceptions près). – CAustin

+0

Ok, j'ai compris! Je n'étais toujours pas capable de comprendre quel était le problème avec mon modèle précédent, mais au moins cela fonctionne maintenant et j'ai appris une ou deux choses sur de meilleures façons de formater les expressions régulières. Merci encore! –