使用content.match(regex)仅在链接搜索时返回null值



我一直在寻找这个问题的答案,到目前为止,我已经找到了它的一切,但没有什么可以帮助我找出我做错了什么。我每天早上都会收到一份oracle报告,它会发送一封电子邮件,将报告输出作为谷歌表单的链接。除了使用regex.101时匹配的链接值之外,我可以匹配我要查找的所有值。我使用的脚本是我在几篇文章中看到的脚本的修改版本,它可以工作,除非我试图匹配链接。

`function parseEm(start) {
start = start || 0;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Results");
var label = sheet.getRange('B2').getValue();
// var threads = GmailApp.getInboxThreads(start, 100);
//var sheet = SpreadsheetApp.getActiveSheet();
var threads = GmailApp.search("Label:" + label, 1, 5)
for (var i = 0; i < threads.length; i++) {
// Get messages in search thread
// Get the plain text body of the email message
var tmp,
message = threads[i].getMessages()[0],
subject = message.getSubject(),
content = message.getPlainBody();

// match each requirement using constant values paired with regex
if (content) {
//Request ID: 
tmp = content.match(/Request ID:s*([A-Za-z0-9s]+)(r?n)/);
var ID = (tmp && tmp[1]) ? tmp[1].trim() : 'No report id';
//Report Name: 
tmp = content.match(/Report Name: s*([A-Za-z0-9@.]+)/);
var Name = (tmp && tmp[1]) ? tmp[1].trim() : 'No report name';
//Report Link : 
tmp = content.match(/Report Link: (http|ftp|https)://[w-]+(.[w-]+)+([w.,@?^=%&amp;:/~+#-]*[w@?^=%&amp;/~+#-])?/);
Logger.log(tmp);
var link = (tmp && tmp[1]) ? tmp[1] : 'No link';
Logger.log(link)
//write information to sheet
//sheet.appendRow([ID, Name, subject, link]);
} // End if
} // End for loop
}`

要匹配的数据如下所示,只是为了安全起见,修改了报告名称和详细信息。我可以把其他一切都处理好,它会写入工作表,但链接返回为No链接,Logger返回null。

请求ID:854632157报告名称:报告名称和Invoice_Number_854632157报告链接:https://drive.google.com/open?id=id的文件存储在驱动器中

我可以将整个电子邮件内容放入Regex中,只要我不在前后添加所需的"/",它就会完美匹配。但当我在应用程序脚本中运行程序时,它会返回除最后一个值之外的所有值。~~编辑~~

发布修改后的工作脚本,以防其他人碰巧搜索到这个或类似的问题。希望我做的是正确的,如果不是,请告诉我。

function parseEm(start) {
start = start || 0;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Results");
var label = sheet.getRange('B2').getValue();
var threads = GmailApp.search("Label:" + label, 1, 5)
for (var i = 0; i < threads.length; i++) {
// Get the first email message of a thread
var tmp,
message = threads[i].getMessages()[0],
subject = message.getSubject(),
content = message.getPlainBody(),
str =  message.getRawContent();
// Get the plain text body of the email message
//  use getRawContent() to parse link from HTML
// match each requirement using constant values paired with regex
if (content) {
//Request ID:
tmp = content.match(/Request ID:s*([A-Za-z0-9s]+)(r?n)/);
var ID = (tmp && tmp[1]) ? tmp[1].trim() : 'No report id';
//Report Name: 
tmp = content.match(/Report Name: s*([A-Za-z0-9@.]+)/);
var Name = (tmp && tmp[1]) ? tmp[1] : 'No report name';//.trim()
//Report Link : 
var regex = /(Report Link : (http|ftp|https)://[w-]+(.[w-]+)+([w.,@?^=%&amp;:/~+#-]*[w@?^=%&amp;/~+#-])?)/;
tmp = str.match(regex);
var link = (tmp && tmp[1]) ? tmp[1] : 'No link';
//replace search value with blank 
var results = link.replace(/Report Link : /i, ' ');
Logger.log("Link" + link);
Logger.log("Results" + results);
Logger.log([ID, Name, subject, results]);
//write to sheet
sheet.appendRow([ID, subject, results]);
} // End if
} // End for loop
}

这将输出以下内容:来自所附谷歌表单的剪辑

我把它放在Regex测试工具(RegExr)中。它不匹配,但我发现Report Link:之间有一个空格。所以,假设你发布的输入是准确的,这应该是问题所在。

报告链接_:https://drive.google.com/open?id=id.

修改正则表达式后,它匹配。

/Report Link : (http|ftp|https)://[w-]+(.[w-]+)+([w.,@?^=%&amp;:/~+#-]*[w@?^=%&amp;/~+#-])?

最新更新