Как извлечь адреса электронной почты, помеченные определенным ярлыком Gmail
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Extract Emails')
.addItem('Extract Emails...', 'extractEmails')
.addToUi();
}
// extract emails from label in Gmail
function extractEmails() {
// get the spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var label = sheet.getRange(1,2).getValue();
// get all email threads that match label from Sheet
var threads = GmailApp.search("label:" + label);
// get all the messages for the current batch of threads
var messages = GmailApp.getMessagesForThreads(threads);
var emailArray = [];
// get array of email addresses and subjects
messages.forEach(function(message) {
message.forEach(function(d) {
emailArray.push([d.getFrom(), d.getTo(), d.getSubject()]);
});
});
// de-duplicate the array based on email addresses
var uniqueEmailArray = emailArray.filter(function(item, pos, self) {
return self.findIndex(e => e[0] === item[0] && e[1] === item[1]) === pos;
});
var cleanedEmailArray = uniqueEmailArray.map(function(el) {
var name = "";
var email = "";
var subject = el[2];
var matches = el[0].match(/\s*"?([^"<>]*)"?\s+<(.+)>/);
if (matches) {
name = matches[1];
email = matches[2];
} else {
name = "N/k";
email = el[0];
}
return [name, email, subject];
}).filter(function(d) {
if (
d[1] !== "annaoleks88@gmail.com" &&
d[1] !== "_casper_1983@inbox.ru"
) {
return d;
}
});
// clear any old data
sheet.getRange(4,1,sheet.getLastRow(),3).clearContent();
// paste in new names, emails, and subjects and sort by email address A - Z
sheet.getRange(4,1,cleanedEmailArray.length,3).setValues(cleanedEmailArray).sort(2);
}
1. Добавление настраиваемого меню в Google Sheets
function onOpen() {
let ui = SpreadsheetApp.getUi();
ui.createMenu('Extract Emails')
.addItem('Extract Emails...', 'extractEmails')
.addToUi();
}
onOpen() – это функция, которая выполняется автоматически при открытии Google Таблицы.
SpreadsheetApp.getUi() – получает объект пользовательского интерфейса (UI) Google Таблицы.
createMenu('Extract Emails') – создаёт новое меню с именем Extract Emails в Google Sheets.
.addItem('Extract Emails...', 'extractEmails') – добавляет в меню пункт Extract Emails..., при выборе которого вызывается функция extractEmails().
.addToUi() – добавляет созданное меню в пользовательский интерфейс Google Sheets.
2. Функция extractEmails(): Извлечение email-адресов из Gmail
function extractEmails() {
Функция extractEmails() будет извлекать email-адреса из почты и вставлять их в таблицу.
2.1. Получение активного листа и ярлыка Gmail
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let label = sheet.getRange(1,2).getValue();
SpreadsheetApp.getActiveSpreadsheet() – получает активную электронную таблицу.
ss.getActiveSheet() – получает текущий (активный) лист.
sheet.getRange(1,2).getValue() – получает значение из ячейки B1 (первая строка, второй столбец). В этой ячейке пользователь должен указать название ярлыка Gmail, из которого нужно извлечь email-адреса.
2.2. Поиск писем в Gmail по ярлыку
let threads = GmailApp.search("label:" + label);
GmailApp.search("label:" + label) – выполняет поиск писем в Gmail по указанному ярлыку. Возвращает массив объектов “почтовый поток” (threads).
2.3. Получение всех сообщений из найденных потоков
let messages = GmailApp.getMessagesForThreads(threads);
GmailApp.getMessagesForThreads(threads) – получает все сообщения для каждого потока из массива threads.
Возвращает массив массивов, где каждый подмассив содержит сообщения из одного почтового потока.
2.4. Извлечение email-адресов
let emailArray = [];
messages.forEach(function(message) {
message.forEach(function(d) {
emailArray.push([d.getFrom(), d.getTo(), d.getSubject()]);
});
});
let emailArray = []; – создаётся пустой массив для хранения email-адресов.
messages.forEach(function(message) {...}) – проходим по каждому массиву сообщений в messages.
message.forEach(function(d) {...}) – проходим по каждому сообщению внутри одного почтового потока.
d.getFrom() – получает email-адрес отправителя.
d.getTo() – получает email-адрес получателя.
d.getSubject() – получаем тему письма.
emailArray.push(d.getFrom(), d.getTo()); – добавляем оба email-адреса в массив emailArray.
2.5. Удаление дубликатов
let uniqueEmailArray = emailArray.filter(function(item, pos, self) {
return self.findIndex(e => e[0] === item[0] && e[1] === item[1]) === pos;
});
emailArray.filter(function(item, pos) {...}) – фильтруем массив emailArray.
filter()– стандартный метод JavaScript, который создаёт новый массив, содержащий только элементы, удовлетворяющие условию. Аргументыfilter():item– текущий элемент массива.pos– индекс текущего элемента в массиве.self– это сам массив (emailArray), чтобы иметь доступ ко всем его элементам.
self.findIndex(e => e[0] === item[0] && e[1] === item[1]) === pos – Этот код проверяет, является ли текущий элемент (item) первым появлением в массиве.
self.findIndex(e => e[0] === item[0] && e[1] === item[1])findIndex()ищет первый индекс вemailArray, где:e[0] === item[0]→ совпадает email отправителя (from).e[1] === item[1]→ совпадает email получателя (to).
=== pos- Если найденный индекс (
findIndex()) совпадает с текущей позицией (pos), значит, это первое появление комбинацииfrom+to, и мы оставляем этот элемент. - Если индекс отличается (
pos > findIndex()), значит, этот элемент уже встречался раньше, и мы его отбрасываем.
- Если найденный индекс (
2.6. Очистка email-адресов (отделение имени и email-а)
let cleanedEmailArray = uniqueEmailArray.map(function(el) {
let name = "";
let email = "";
let subject = el[2];
let matches = el[0].match(/\s*"?([^"<>]*)"?\s+<(.+)>/);
if (matches) {
name = matches[1];
email = matches[2];
}
else {
name = "N/k";
email = el[0];
}
return [name, email, subject];
}).filter(function(d) {
.map(function(el) {...}) – обрабатываем каждый email в uniqueEmailArray.
Регулярное выражение /\s*"?([^"]*)"?\s+<(.+)>/:
- Ищет email в формате
"Имя Фамилия" <email@domain.com>. ([^"]*)– захватывает имя (если есть).<(.+)>– захватывает email.
matches[1] – имя. matches[2] – email.
Если email записан без имени (example@gmail.com), записываем N/k в поле имени.
2.7. Фильтрация ненужных email-адресов
if (
d[1] !== "annaoleks88@gmail.com" &&
d[1] !== "_casper_1983@inbox.ru"
) {
return d;
}
});
Исключаем email-адреса, которые не нужны в итоговом списке.
2.8. Очистка старых данных и вставка новых email-адресов
sheet.getRange(4,1,sheet.getLastRow(),3).clearContent();
getRange(4,1,sheet.getLastRow(),3) – выбираем диапазон от строки 4 до последней строки во втором столбце.
.clearContent() – очищаем старые данные.
sheet.getRange(4,1,cleanedEmailArray.length,3).setValues(cleanedEmailArray).sort(2);
getRange(4,1,cleanedEmailArray.length,3) – выбираем диапазон для вставки данных.
.setValues(cleanedEmailArray) – вставляем новые email-адреса.
.sort(2) – сортируем по второму столбцу (email) в алфавитном порядке.
Итоговый разбор кода
- При открытии таблицы добавляется меню
"Extract Emails". - При выборе
"Extract Emails..."запускаетсяextractEmails(). - Функция получает название ярлыка Gmail из ячейки
B1. - Из Gmail загружаются все email-адреса отправителей и получателей по этому ярлыку.
- Удаляются дубликаты email-адресов.
- Из email-адресов выделяются имена и email.
- Удаляются нежелательные email-адреса.
- В Google Таблицу вставляются новые email-адреса (начиная с
A4), старые данные очищаются.


