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
あなたのお手伝いがうまくいった!インデックスを2から1に変更する必要がありましたが、うまくいきました。好奇心のために、私は(\ r | \ n)を[\ r \ n]に置き換えようとしましたが、私はまだ同じエラーがあります。私はあなたの交換パターンを少し勉強して、それから他に何が学べるかを見ます。ありがとう! –
申し訳ありませんが、私は '(\ r \ n)'が '(\ r | \ n)'の原因となった問題を修正するとは言いませんでした。一致させる点では同義語ですが、前者はキャプチャグループを作成しないため、シンプルで低コストです。あなたが1文字のセットのうちの1つを照合するときはいつでも、角括弧が(いくつかの例外を除いて)行く方法です。 – CAustin
よろしくお願いします。私はまだ私の以前のパターンの問題が何であるか把握することができませんでしたが、少なくともそれは今働いており、正規表現をフォーマットするためのより良い方法について学ぶことができました。再度、感謝します! –