Я работаю над скриптом, который работает с электронной почтой, и ему нужно получить отметку времени, отправителя, получателя и тему для отправки по электронной почте. Проект сценария 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 останавливать сценарий, поскольку он занимает слишком много времени.
Любые идеи о том, как обойти эту проблему или это просто то, с чем я должен жить?
Я хотел бы избежать излишнего использования квоты API Gmail, чтобы проверять каждое сообщение поверх выборки идентификаторов, но в любом случае попробуем это. Кроме того, ваш querry имеет 200 сообщений в максимальных результатах, но вы не используете маркер страницы, так что вы получите не более 100 сообщений с этим скриптом. Я также заметил, что из-за этой проблемы (long getMessageById times) избыточное время выполнения быстрее при выводе непосредственно в электронную таблицу, а не в использовании массивов. – Vytautas
Еще одна вещь, которую я заметил при попытке реализовать вашу идею, состоит в том, что заголовки несовместимы. Идентификатор массива изменяется от сообщения к сообщению, поэтому вам нужно сделать постоянные проверки, которые перед выдачей данных должны быть помещены в определенные столбцы. – Vytautas
Отметьте это как правильный ответ. Хотя сам сценарий не является тем, что я могу применить, идея использовать API Gmail для сбора сообщений вместо GmailApp помогла, так как ему удалось прорезать 15 страниц (1500 сообщений электронной почты) за 188 секунд. Вероятно, по-прежнему придется создавать триггер-обработчик на всякий случай, если он будет закрыт, когда он приблизится к пределу – Vytautas