2017-09-25 3 views
0

Google Appsスクリプトを作成して、ジョブ用に受け取った自動メールに基づいてカレンダーイベントを作成しています。正規表現を使用して、Googleカレンダーでイベントを取り込むために必要な情報を抽出しています。これまでは、ジョブの終了時刻を見つけるはずのgetEndTime()という1つの関数を除き、期待通りに機能していましたが、呼び出されるたびにnullを返します。 exec()を使っている私の他の関数はすべて正常に動作します。Google App Script Regex exec()は1つの関数でのみnullを返します

exec()がnullを返すことに関して他にも多くの質問があり、exec()を呼び出す前に 'g'タグを削除しlastIndexを0にリセットするなどの一般的な問題が修正されています。私はregex101.comを使ってJavascriptオプションを使って正規表現をチェックしました.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 [email protected] 

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

答えて

0

使用しているパターンはあまりにも複雑に思えます。私はそれが失敗する原因を確かめることはできませんが、私の推測は最後に(\r|\n)となるでしょう(実際にこれをしたい場合は[\r\n]と入力してください)。

は、このパターンを試してみてください:これは、終了時間は常にハイフンと指定されたサンプルテキストからケースになりそうだスペースが先行していることを前提としてい

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

+0

あなたのお手伝いがうまくいった!インデックスを2から1に変更する必要がありましたが、うまくいきました。好奇心のために、私は(\ r | \ n)を[\ r \ n]に置き換えようとしましたが、私はまだ同じエラーがあります。私はあなたの交換パターンを少し勉強して、それから他に何が学べるかを見ます。ありがとう! –

+0

申し訳ありませんが、私は '(\ r \ n)'が '(\ r | \ n)'の原因となった問題を修正するとは言いませんでした。一致させる点では同義語ですが、前者はキャプチャグループを作成しないため、シンプルで低コストです。あなたが1文字のセットのうちの1つを照合するときはいつでも、角括弧が(いくつかの例外を除いて)行く方法です。 – CAustin

+0

よろしくお願いします。私はまだ私の以前のパターンの問題が何であるか把握することができませんでしたが、少なくともそれは今働いており、正規表現をフォーマットするためのより良い方法について学ぶことができました。再度、感謝します! –

関連する問題