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.

  1. 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).
  2. === 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

  1. Kui tabel avatakse, lisatakse menüü “Extract Emails”.
  2. Kui valitakse “Extract Emails…”, käivitatakse funktsioon extractEmails().
  3. Funktsioon saab Gmaili otsetee nime lahtrist B1.
  4. Gmailist laaditakse alla kõik selle otsetee saatja ja saaja e-posti aadressid.
  5. Dubleerivad e-posti aadressid eemaldatakse.
  6. E-posti aadressidest eraldatakse nimed ja e-posti aadressid.
  7. Eemaldatakse soovimatud e-posti aadressid.
  8. Google’i tabelisse sisestatakse uued e-posti aadressid (alates A4-st), vanad andmed kustutatakse..