Kuidas leida e-posti aadressid, mis on tähistatud konkreetse Gmaili otseteega
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. Kohandatud menüü lisamine Google Sheets’ile
function onOpen() {
let ui = SpreadsheetApp.getUi();
ui.createMenu('Extract Emails')
.addItem('Extract Emails...', 'extractEmails')
.addToUi();
}
onOpen()
– on funktsioon, mis käivitub automaatselt, kui avate Google Spreadsheet’i.
SpreadsheetApp.getUi()
– saab Google Tablesi kasutajaliidese (UI) objekti.
createMenu('Extract Emails')
– loob uue menüü nimega Extract Emails in Google Sheets.
.addItem('Extract Emails...', 'extractEmails')
– lisab menüüsse punkti Extract Emails…, selle valimine kutsub funktsiooni extractEmails().
.addToUi()
– lisab loodud menüü Google Sheetsi kasutajaliidesesse.
2. Funktsioon extractEmails(): Väljavõte e-posti aadressid Gmaili
function extractEmails() {
Funktsioon extractEmails() ekstraheerib meiliaadressid kirjadest ja sisestab need tabelisse.
2.1. Aktiivse lehe ja Gmaili otsetee saamine
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let label = sheet.getRange(1,2).getValue();
SpreadsheetApp.getActiveSpreadsheet()
– saab aktiivse tabeli.
ss.getActiveSheet()
– saab praeguse (aktiivse) lehe.
sheet.getRange(1,2).getValue()
– saab väärtuse lahtrist B1 (esimene rida, teine veerg). Selles lahtris peab kasutaja määrama selle Gmaili otsetee nime, kust e-posti aadressid välja otsitakse.
2.2. E-postide otsimine Gmailis sildi järgi
let threads = GmailApp.search("label:" + label);
GmailApp.search("label:" + label)
– otsib kirju Gmailis määratud otsetee järgi. Tagastab “mail threads” objektide (teemade) massiivi.
2.3. Kõikide sõnumite väljavõtmine leitud teemadest
let messages = GmailApp.getMessagesForThreads(threads);
GmailApp.getMessagesForThreads(threads)
– saab kõik sõnumid iga niidi jaoks niitide massiivi.
Tagastab massiivi, mille iga alamassiiv sisaldab sõnumeid ühest postivooga.
2.4. E-posti aadresside otsimine
let emailArray = [];
messages.forEach(function(message) {
message.forEach(function(d) {
emailArray.push([d.getFrom(), d.getTo(), d.getSubject()]);
});
});
let emailArray = [];
– luuakse tühi massiiv e-posti aadresside salvestamiseks.
messages.forEach(function(message) {...})
– käia läbi iga sõnumite massiivi sõnumid.
message.forEach(function(d) {...})
– läbida iga sõnum sama postivoo piires.
d.getFrom()
– saab saatja e-posti aadressi.
d.getTo()
– saab vastuvõtja e-posti aadressi.
d.getSubject()
– saame teemarida.
emailArray.push(d.getFrom(), d.getTo());
– lisada mõlemad e-posti aadressid massiivi emailArray.
2.5. Duplikaatide eemaldamine
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) {...})
– filtreerida emailArray massiivi.
filter()
– Standardne JavaScript-meetod, mis loob uue massiivi, mis sisaldab ainult tingimustele vastavaid elemente. Argumendid filter():item
– praegune massiivi element.pos
– praeguse elemendi indeks massiivis.self
– on massiiv ise (emailArray), et saada juurdepääs kõigile selle elementidele.
self.findIndex(e => e[0] === item[0] && e[1] === item[1]) === pos
– See kood kontrollib, kas praegune element on massiivi esimene esinemine.
self.findIndex(e => e[0] === item[0] && e[1] === item[1])
- findIndex() otsib esimest indeksit emailArray’s, kus:
e[0] === item[0]
→ vastab saatja e-posti aadressile (from).e[1] === item[1]
→ vastab saaja e-posti aadressile (to).
- findIndex() otsib esimest indeksit emailArray’s, kus:
=== pos
- Kui leitud indeks (findIndex()) vastab praegusele positsioonile (pos), siis on see kombinatsiooni from + to esimene esinemine ja me lahkume sellest elemendist.
- Kui indeks on erinev (pos > findIndex()), tähendab see, et see element on juba varem esinenud ja me jätame selle kõrvale.
2.6. E-posti aadressi puhastamine (nimi ja e-posti eraldamine)
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) {...})
– töödelda iga e-posti aadressi uniqueEmailArray.
Регулярное выражение /\s*"?([^"]*)"?\s+<(.+)>/
:
- Otsib e-kirju formaadis “Eesnimi Perekonnanimi” email@domain.com.
([^"]*)
– jäädvustab nime (kui see on olemas).<(.+)>
– jäädvustab e-kirja.
matches[1]
– nimi. matches[2]
– email.
Kui e-kiri on kirjutatud ilma nimeta (example@gmail.com), kirjutage nime väljale N/k.
2.7. Ebavajalike e-posti aadresside filtreerimine
if (
d[1] !== "annaoleks88@gmail.com" &&
d[1] !== "_casper_1983@inbox.ru"
) {
return d;
}
});
Jätke välja e-posti aadressid, mida ei ole lõplikus nimekirjas vaja.
2.8. Vanade andmete kustutamine ja uute e-posti aadresside sisestamine
sheet.getRange(4,1,sheet.getLastRow(),3).clearContent();
getRange(4,1,sheet.getLastRow(),3)
– valige vahemik reast 4 kuni teise veeru viimase reani.
.clearContent()
– vanade andmete kustutamine.
sheet.getRange(4,1,cleanedEmailArray.length,3).setValues(cleanedEmailArray).sort(2);
getRange(4,1,cleanedEmailArray.length,3)
– valige vahemik andmete sisestamiseks.
.setValues(cleanedEmailArray)
– sisestage uued e-posti aadressid.
.sort(2)
– sorteerida teise veeru (e-post) järgi tähestikulises järjekorras.
Lõplik koodi analüüs
- Kui tabel avatakse, lisatakse menüü “Extract Emails”.
- Kui valitakse “Extract Emails…”, käivitatakse funktsioon extractEmails().
- Funktsioon saab Gmaili otsetee nime lahtrist B1.
- Gmailist laaditakse alla kõik selle otsetee saatja ja saaja e-posti aadressid.
- Dubleerivad e-posti aadressid eemaldatakse.
- E-posti aadressidest eraldatakse nimed ja e-posti aadressid.
- Eemaldatakse soovimatud e-posti aadressid.
- Google’i tabelisse sisestatakse uued e-posti aadressid (alates A4-st), vanad andmed kustutatakse..

