我正在处理一个使用电子邮件的脚本,它需要获取电子邮件的时间戳,发件人,收件人和主题。 Google脚本项目在单独的脚本文件中有几个函数,所以我不会在这里列出所有内容,但主要是main函数执行查询并将其传递给一个获取数据的函数:
queriedMessages = Gmail.Users.Messages.list(authUsr.mail, {'q':query, 'pageToken':pageToken});
dataOutput_double(sSheet, queriedMessages.messages, queriedMessages.messages.length);
所以这会将一个对象发送到函数 dataOutput_double 和数组的大小(如果我试图在输出数据的函数内获取数组的大小我收到一个错误,这就是为什么这里传递的原因)。输出数据的函数如下所示:
function dataOutput_double(sSheet, messageInfo, aLenght) {
var sheet = sSheet.getSheets()[0],
message,
dataArray = new Array(),
row = 2;
var i, dateCheck = new Date;
dateCheck.setDate(dateCheck.getDate()-1);
for (i=aLenght-1; i>=0; i--) {
message = GmailApp.getMessageById(messageInfo[i].id);
if (message.getDate().getDate() == dateCheck.getDate()) {
sheet.insertRowBefore(2);
sheet.getRange(row, 1).setValue(message.getDate());
sheet.getRange(row, 2).setValue(message.getFrom());
sheet.getRange(row, 3).setValue(message.getTo());
sheet.getRange(row, 4).setValue(message.getSubject());
}
}
return;
};
这些代码中的一部分将被删除,因为其他类型的处理剩余部分。
我注意到的问题是,有些消息需要花费很长时间才能获得getMessageById()方法(确切地说大约需要4秒),并且当脚本每天处理大约1500封邮件时,这会使其拖动很长一段时间迫使谷歌停止剧本,因为它花了太长时间。
关于如何解决这个问题的任何想法,或者这只是我必须忍受的事情?
答案 0 :(得分:0)
这是我掀起的事情:
function processEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var messages = Gmail.Users.Messages.list('me', {maxResults:200, q:"newer_than:1d AND label:INBOX NOT label:PROCESSED"}).messages,
headers,
headersFields = ["Date","From","To","Subject"],
outputValue=[],thisRowValue = [],
message
if(messages.length > 0){
for(var i in messages){
message = Gmail.Users.Messages.get('me', messages[i].id);
Gmail.Users.Messages.modify( {addLabelIds:["Label_4"]},'me',messages[i].id);
headers = message.payload.headers
for(var ii in headers){
if(headersFields.indexOf(headers[ii].name) != -1){
thisRowValue.push(headers[ii].value);
}
}
outputValue.push(thisRowValue)
thisRowValue = [];
}
var range = ss.getRange(ss.getLastRow()+1, ss.getLastColumn()+1, outputValue.length, outputValue[0].length);
range.setValues(outputValue);
}
}
注意:这是作为触发器运行的。这将在200条消息中批量触发调用。您需要将标签PROCESSED添加到gmail。同样在线:
Gmail.Users.Messages.modify( {addLabelIds:["Label_4"]},'me',messages[i].id);
显示Label_4
。在我的Gmail帐户中,“已处理”是我的第四个自定义标签。