Regex 用GAS从Gmail消息中提取数据
我一直在努力从自动Gmail邮件中自动提取数据。每天都有多封带有同一标签的电子邮件,所以理想情况下,我希望循环浏览每封电子邮件,并提取一些数据。我已经将它设置为使用一些正则表达式来获取数据,并且它适用于第一封电子邮件。但是,它不会正确循环以查找下一封带有标签的电子邮件。以下是我目前掌握的代码:Regex 用GAS从Gmail消息中提取数据,regex,email,google-apps-script,google-sheets,gmail,Regex,Email,Google Apps Script,Google Sheets,Gmail,我一直在努力从自动Gmail邮件中自动提取数据。每天都有多封带有同一标签的电子邮件,所以理想情况下,我希望循环浏览每封电子邮件,并提取一些数据。我已经将它设置为使用一些正则表达式来获取数据,并且它适用于第一封电子邮件。但是,它不会正确循环以查找下一封带有标签的电子邮件。以下是我目前掌握的代码: function parseEmailMessages (start) { var label = GmailApp.getUserLabelByName("Bounce"); var threads =
function parseEmailMessages (start) {
var label = GmailApp.getUserLabelByName("Bounce");
var threads = label.getThreads();
var sheet = SpreadsheetApp.getActiveSheet();
var tmp = [];
var messages = GmailApp.getMessagesForThreads(threads);
var bodies = [];
for (var i =0; i < threads.length; i++) {
var bodies = [];
for(k in threads[i].getMessages()) {
bodies.push(threads[i].getMessages()[i].getPlainBody());
var content = bodies.toString();
if (content) {
tmp = content.match(/[\n\r].*First Name\s*:\s*([^\n\r]*)/);
var firstname = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';
tmp = content.match(/[\n\r].*Last Name\s*:\s*([^\n\r]*)/);
var lastname = (tmp && tmp[1]) ? tmp[1].trim() : 'No Lastname';
tmp = content.match(/[\n\r].*Customer ID\s*:\s*([^\n\r]*)/);
var customerID = (tmp) ? tmp[1].trim() : 'No CustomerID';
tmp = content.match(/[\n\r].*Invoice\s*:\s*([^\n\r]*)/);
var invoice = (tmp) ? tmp[1].trim() : 'No Invoice';
sheet.appendRow([firstname, lastname, customerID, invoice]);
Logger.log([firstname,lastname, customerID, invoice]);
}
}
}
};
函数解析电子邮件(开始){
var label=GmailApp.getUserLabelByName(“Bounce”);
var threads=label.getThreads();
var sheet=SpreadsheetApp.getActiveSheet();
var tmp=[];
var messages=GmailApp.getMessagesForThreads(线程);
var主体=[];
对于(var i=0;i
它第一次正确地循环,然后给了我一个错误:TypeError:cannotcallmethod“getPlainBody”of undefined
任何帮助都将不胜感激 您看到了这个错误,因为您应该在for循环中使用k变量来获取该标签的每条消息。请勾选下面这一行:
threads[i].getMessages()[k].getPlainBody()
尝试在for循环中更改此行,它对我有效
希望有帮助 在简化代码后,我能够让脚本在电子邮件中正确循环。这是对我有用的代码:
function processInboxToSheet() {
// Have to get data separate to avoid google app script limit!
//var start = 0;
var label = GmailApp.getUserLabelByName("Bounce");
var threads = label.getThreads();
var sheet = SpreadsheetApp.getActiveSheet();
var result = [];
var newLabel = GmailApp.getUserLabelByName("Done");
var oldLabel = GmailApp.getUserLabelByName("Bounce");
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
var content = messages[0].getPlainBody();
// implement your own parsing rule inside
if (content) {
var tmp;
tmp = content.match(/[\n\r].*First Name\s*:\s*([^\n\r]*)/);
var firstname = (tmp && tmp[1]) ? tmp[1].trim() : 'No username';
tmp = content.match(/[\n\r].*Last Name\s*:\s*([^\n\r]*)/);
var lastname = (tmp && tmp[1]) ? tmp[1].trim() : 'No Lastname';
tmp = content.match(/[\n\r].*Customer ID\s*:\s*([^\n\r]*)/);
var customerID = (tmp) ? tmp[1].trim() : 'No CustomerID';
tmp = content.match(/[\n\r].*Invoice\s*:\s*([^\n\r]*)/);
var invoice = (tmp) ? tmp[1].trim() : 'No Invoice';
sheet.appendRow([firstname, lastname, customerID, invoice]);
}
Utilities.sleep(500);
threads[i].addLabel(newLabel).removeLabel(oldLabel).refresh();
}
};
函数processInboxToSheet(){
//必须单独获取数据以避免谷歌应用程序脚本限制!
//var start=0;
var label=GmailApp.getUserLabelByName(“Bounce”);
var threads=label.getThreads();
var sheet=SpreadsheetApp.getActiveSheet();
var结果=[];
var newLabel=GmailApp.getUserLabelByName(“完成”);
var oldlab=GmailApp.getUserLabelByName(“Bounce”);
对于(var i=0;i
谢谢你的提示,它确实消除了错误。但是,循环找不到带有该标签的第二封电子邮件。在我的收件箱里,我有两封标签为“Bounce”的电子邮件。但是,我的电子表格填充了两行相同的数据。有什么想法吗?