Продолжение моего предыдущего поста Извлечение писем из ярлыка Gmail в Google Sheet
Я пытаюсь извлечь электронные письма с одной метки Gmail на лист Google, используя Google App Script, данные в листе Google должны иметь метку времени, из электронной почты, в электронную почту, тему и тело электронной почты, сценарий ниже кредитует @Cooper
Приведенный ниже сценарий работает, и я могу извлечь 527 электронных писем из ярлыка Gmail, но я не могу извлечь все электронные письма из этого ярлыка, поскольку у меня в нем около 5000+ электронных писем. Может ли Google Appscript сделать это за один раз?
function ExtractingEmails(query = "Label:Test") {
let o = [["TimeStamp", "From", "To", "Subject", "Body"]];
const ts = GmailApp.search(query);
ts.forEach(t => {
let ms = t.getMessages();
ms.forEach(m => {
o.push([m.getDate(), m.getFrom(), m.getTo(), m.getSubject(), m.getPlainBody()])
})
})
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
if (o && o.length > 1) {
sh.clearContents();
sh.getRange(1, 1, o.length, o[0].length).setValues(o);
ss.toast(`${o.length - 1} messages found for Query: ${query}`)
} else {
ss.toast(`No messages found for Query: ${query}`)
}
}
Привет @Tanaike Мне нужно получить около 5000+ писем с одного ярлыка. Извините за мою плохую английскую грамматику, я отредактировал свой пост, чтобы исправить это.
Спасибо за ответ. Я должен извиниться за мое плохое знание английского языка. Если в вашем скрипте возникает ошибка, можете ли вы предоставить сообщение об ошибке?
@Tanaike Предоставленный скрипт хорошо работает для извлечения до 527 электронных писем на лист Google, но я не могу понять, как получить все 5000+ электронных писем на лист Google, текущий скрипт после извлечения 527 электронных писем выдает сообщение об ошибке [Исключение: невозможно вызвать SpreadsheetApp.showNotification() из этого контекста]
Спасибо за ответ. Что касается вашего сообщения об ошибке [Exception: Cannot call SpreadsheetApp.showNotification() from this context], к сожалению, я не могу понять связь между вашим сообщением об ошибке и вашим сценарием показа. Могу я спросить вас о деталях этого?
@Tanaike Какие детали вам потребуются?
Если вы вызываете свою функцию непосредственно из редактора сценариев приложений, я предлагаю вам заменить ss.toast на console.info, чтобы вы видели журналы на том месте, где вы находитесь. Вы на 100 % уверены, что у вас более 500 писем с этим ярлыком?
Спасибо за ответ. Теперь я заметил, что обсуждение уже зашло. В этом случае я хотел бы уважать существующую дискуссию.
Как указано в документации для GmailApp.search, это не работает, когда нужно получить много потоков.
Поэтому вам нужно перебирать их, пока с вариантом search больше не останется.
Адаптация вашей функции, что бы сделать
function ExtractingEmails(query = "Label:Test") {
let o = [["TimeStamp", "From", "To", "Subject", "Body"]];
const PAGE_SIZE = 500;
let index = 0;
console.info(`Getting threads from ${index} to ${index + PAGE_SIZE}`)
let ts = GmailApp.search(query, index, PAGE_SIZE);
while(ts.length > 0) {
console.info(`Retrieved ${ts.length} threads`)
ts.forEach(t => {
let ms = t.getMessages();
ms.forEach(m => {
o.push([m.getDate(), m.getFrom(), m.getTo(), m.getSubject(), m.getPlainBody()])
})
})
index += PAGE_SIZE
console.info(`Getting threads from ${index} to ${index + PAGE_SIZE}`)
ts = GmailApp.search(query, index, PAGE_SIZE);
}
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
if (o && o.length > 1) {
sh.clearContents();
sh.getRange(1, 1, o.length, o[0].length).setValues(o);
console.info(`${o.length - 1} messages found for Query: ${query}`)
} else {
console.info(`No messages found for Query: ${query}`)
}
}
Это сработало!!!! он извлек все 5000+ электронных писем, спасибо
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять extract all emails from the label approximately 5000 emails. В вашем вопросе вы хотите получить электронные письма с 5000 ярлыков? Или вы хотите получить 5000 писем с одного ярлыка? Кстати, в вашей ситуации вы можете предоставить сообщение об ошибке?