Automatyzacja w Google Apps Script

Rozwiązałem taki problem w moim Gmailu:

Problem.

Pobierałem pocztę z zewnętrznej skrzynki pocztowej i od razu nadawałem tej wiadomości jedną z moich Etykietek. Tutaj chodziło mi o to aby te e-maile z zewnątrz od razu były kategoryzowane w strukturze moich Etykiet (nie wpadały do głównego folderu Odebrane).

Jednocześnie miałem ustawiony filtr, który dla wybranego nadawcy dowolnej wiadomości nadawał tej wiadomości inną Etykietę. Moją intencją tutaj było aby pewne e-maile jakie dochodzą na tą zewnętrzną skrzynkę były grupowane pod odpowiednią nazwą Etykiety.

Cała idea nie była taka zła: miałem pod jedną Etykietą całą pocztę z zewnętrznej skrzynki oraz miałem e-maile od pewnego konkretnego nadawcy pod inną Etykietą.

Problem za to polegał na tym, że nie chciałem już mieć pod tą pierwszą Etykietą wiadomości jakie wpadły w filtr i miały drugą Etykietę! Wynikało to z tego, że Gmail musiał nadawać pierwszą Etykietę a potem w filtrze nie mogłem jej zdjąć.

I oto rozwiązanie!

Z pomocą przyszły skrypty w Google – https://script.google.com/

Od razu utworzyłem tam projekt i w pliku Kod.gs napisałem taką funkcję:

function removeLabelFromMessages()
{
  // Pobieranie etykiet "INT" i "Wyborcza"
  var labelInt      = GmailApp.getUserLabelByName('INT');
  var labelWyborcza = GmailApp.getUserLabelByName('Wyborcza');
  
  // Pobieranie wszystkich wiadomości, które mają obie etykiety
  var threads = GmailApp.search('label:INT label:Wyborcza');
  
  if (threads.length > 0) {

    Logger.log(threads.length + " new email(s) found!");

    // Iteracja po wątkach (threads) i usuwanie etykiety "INT"
    for (var i = 0; i < threads.length; i++) {
      var thread = threads[i];

      Logger.log("Subject: " + thread.getFirstMessageSubject());
      
      // Usuwanie etykiety "INT" z wątku
      thread.removeLabel(labelInt);
    }
  } else {
    // Logger.log("No new emails.");
  }
}

Funkcję można oczywiście skrócić wyrzucając podświetlone wiersze (Logger) oraz puste linie. Cały blok else także może być zbyteczny. Właściwie warunek if również nie jest konieczny bo pętla for dla threads.length równego zero w ogóle się nie wykona i nie obciąży działania skryptu.

Następnie stworzyłem Regułę o takich parametrach aby uruchamiała się np. co 5 minut.

Można ustawić częstotliwość co 1 minutę ale jakoś tak się bałem aż tak obciążać moją konsolę skryptową 😉

Ustawiłem też powiadomienia o niepowodzeniach działania mojego skryptu na natychmiastowe. Generalnie chodziło mi o to aby nie zapomnieć o tym skrypcie w tej konsoli i jak co to od razu się dowiedzieć że coś nie działa tak jak powinno. Ale pewnie w przyszłości zmienie to na opcję: „Powiadamiaj codziennie„.

Skrócona wersja funkcji:

function removeLabelFromMessages() {
  var labelInt = GmailApp.getUserLabelByName('INT');
  var threads  = GmailApp.search('label:INT label:Wyborcza');
  for (var i = 0; i < threads.length; i++) {
    threads[i].removeLabel(labelInt);
  }
}

Dodaj komentarz