выберите одно электронное письмо вместо целого потока

#google-apps-script #google-sheets #gmail

#google-apps-script #google-sheets #gmail

Вопрос:

У меня есть скрипт, который вводит текст моего письма из Gmail в ячейку Google-sheet, в основном я ищу помеченное электронное письмо и ввожу его в конце, когда я его отменяю (оно не должно появляться снова при запуске в следующий раз).). Однако у меня возникла проблема, связанная с тем, что это приводит ко всей теме письма. Для уточнения: в моих настройках gmail установлено значение «Просмотр разговора выключен», и именно так я вижу это в своем почтовом ящике, каждое сообщение отдельно, но похоже, что в API Gmail оно все еще хранится как один длинный поток… Как я могу импортировать только одно сообщение без всего потока? (Поток — это не настоящий разговор, это просто автоматическое электронное письмо от того же отправителя и той же темы, поэтому Gmail рассматривает его как поток, поэтому, если есть способ остановить это, это также поможет.)

Мой код приведен ниже.

 var SEARCH_QUERY = "label:web is:unread to:me is:starred";

function getEmails_(q) {
var emails = [];
emails.length = 0;
var threads = GmailApp.search(q);
for (var i in threads) {
var msgs = threads[i].getMessages();
for (var j in msgs) {
emails.push([msgs[j].getPlainBody().replace(/<.*?>/g, 'n')
.replace(/^s*n/gm, '').replace(/^s*/gm, '').replace(/s*n/gm, 'n')]);

msgs[j].unstar().refresh();
}
}
return emails; 
}




function appendData_(sheet, array2d) {

sheet.getRange(sheet.getLastRow()   1, 1, array2d.length, 
array2d[0].length).setValues(array2d);
}



function saveEmails() {
var array2d = getEmails_(SEARCH_QUERY);
if (array2d) {
appendData_(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Web 
Email'), array2d);
}
}
 

Ответ №1:

Взгляните на документацию GmailApp — в ней содержится объяснение доступных методов и типа объекта, который они возвращают. Вы пытаетесь получить объект GmailMessage, но GmailApp.search() возвращает массив объектов GmailThread по дизайну. Я не верю, что в Gmail можно выполнить поиск определенного сообщения — как показывает ваш код, вы можете получить массив потоков, возвращаемых поиском, и перебирать их, используя GetMessages() для получения определенных сообщений.

Комментарии:

1. Итак, возможно ли получить только последнее сообщение потока, поэтому я в основном устанавливаю триггер при поступлении нового сообщения электронной почты, и каждый раз он будет принимать только последнее сообщение потока,

2. Вам все равно нужно будет сначала получить все сообщения в потоке, но тривиально получить последнее сообщение после этого, выбрав 0-е сообщение; Я не уверен, является ли эта сортировка по дате частью спецификации, но она, по крайней мере, достаточно надежна, чтобы документация подразумевала ее использование .