2015-10-22 3 views
0

Я работаю над скриптом, который работает с электронной почтой, и ему нужно получить отметку времени, отправителя, получателя и тему для отправки по электронной почте. Проект сценария Google имеет несколько функций в отдельные файлы сценариев, так что я не буду перечислять здесь все, но по существу основной функцией выполняет запрос и передает его функции, которая извлекает данные:getMessageById() замедляется

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 почтами каждый день, это делает его перетащить на некоторое время, заставляя Google останавливать сценарий, поскольку он занимает слишком много времени.

Любые идеи о том, как обойти эту проблему или это просто то, с чем я должен жить?

ответ

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 «PROCESSED» - моя четвертая пользовательская метка.

+0

Я хотел бы избежать излишнего использования квоты API Gmail, чтобы проверять каждое сообщение поверх выборки идентификаторов, но в любом случае попробуем это. Кроме того, ваш querry имеет 200 сообщений в максимальных результатах, но вы не используете маркер страницы, так что вы получите не более 100 сообщений с этим скриптом. Я также заметил, что из-за этой проблемы (long getMessageById times) избыточное время выполнения быстрее при выводе непосредственно в электронную таблицу, а не в использовании массивов. – Vytautas

+0

Еще одна вещь, которую я заметил при попытке реализовать вашу идею, состоит в том, что заголовки несовместимы. Идентификатор массива изменяется от сообщения к сообщению, поэтому вам нужно сделать постоянные проверки, которые перед выдачей данных должны быть помещены в определенные столбцы. – Vytautas

+0

Отметьте это как правильный ответ. Хотя сам сценарий не является тем, что я могу применить, идея использовать API Gmail для сбора сообщений вместо GmailApp помогла, так как ему удалось прорезать 15 страниц (1500 сообщений электронной почты) за 188 секунд. Вероятно, по-прежнему придется создавать триггер-обработчик на всякий случай, если он будет закрыт, когда он приблизится к пределу – Vytautas

Смежные вопросы