6 проектів Google Apps Script, які покращать вашу роботу з Gmail

Знову вітаю! Сьогодні ми заглибимося у світ продуктивності та автоматизації в Gmail, використовуючи потужність Google Apps Script на вашому комп’ютері. Готуйтеся вивести свою роботу з Gmail на новий рівень!

Хоча Gmail пропонує ряд вбудованих налаштувань для автоматизації та підвищення ефективності, їх можливості обмежені. Для тих, хто прагне більшої гнучкості та налаштування, Google Apps Script стає ідеальним рішенням.

Завдяки цьому інструменту ви можете створювати власні скрипти, здатні виконувати унікальні завдання, недоступні у стандартному Gmail. Більше того, використовуючи тригери на основі часу, ви можете автоматизувати виконання цих скриптів.

Щоб ви могли швидко розпочати роботу, я підготував кілька корисних сценаріїв, які точно покращать ваш досвід Gmail. Кожен з них розроблений для автоматичного вирішення типових проблем, таких як усунення дублікатів або автоматичне створення нових папок, тому їх розмір може бути дещо більшим, ніж очікується.

Створення скрипту в Google Apps Script

Перш ніж ми перейдемо до застосування та налаштування скриптів, необхідно зрозуміти, як створити скрипт в Google Apps Script і як його запустити. Ось простий покроковий гайд:

Відкрийте Google Apps Script та натисніть “Новий проект” у лівій панелі.

Видаліть весь код, що є в редакторі, та скопіюйте/вставте скрипт, який я вам надам. Потім натисніть кнопку “Зберегти” для збереження вашого скрипту.

Для виконання скрипту, натисніть кнопку “Виконати”, яка розташована поруч з “Зберегти”. Вам потрібно буде надати необхідні дозволи, та ви можете проігнорувати попередження про неперевірений скрипт, оскільки ви використовуєте його для персонального користування, і Google не перевіряв його.

Ось і все! Скрипт почне виконуватися, а в журналі виконання ви зможете побачити, чи був він успішним, чи ні.

Налаштування Тригерів

Багато з цих скриптів стають найбільш ефективними, коли вони запускаються автоматично. На щастя, Google Apps Script пропонує розділ для створення таймерних тригерів, які дозволяють скриптам виконуватись автоматично.

Але перед тим, як я розкажу про створення тригерів, вам потрібно знати, що Google Apps Script має певні обмеження залежно від того, чи підписані ви на Google Workspace Plan чи ні. Занадто часте та одночасне виконання скриптів може призвести до досягнення щоденної квоти, через що робота служби тимчасово припиниться.

Навіть якщо ви маєте можливість виконувати скрипти щохвилини, це значно вичерпає вашу щоденну квоту. Тому, встановлюйте таймер лише тоді, коли це дійсно потрібно.

Щоб створити тригер, натисніть на “Тригери” в лівій панелі, коли скрипт відкрито, а потім на кнопку “Додати тригер”.

Тут ви можете вибрати часовий інтервал від хвилин до місяців. Також є можливість вибрати фіксовану дату і час для одноразового запуску скрипту. Після вибору, натисніть “Зберегти”, щоб створити тригер.

Якщо ви не надали дозволи для виконання скрипту, як я згадував раніше, вам потрібно буде це зробити перед створенням тригера.

Після налаштування тригер працюватиме безперервно. У разі виникнення помилки, ви отримаєте сповіщення разом з описом помилки.

Тепер давайте розглянемо декілька практичних прикладів того, як Google Apps Script може допомогти вам автоматизувати ваші завдання в Gmail.

Надсилання Повторюваних листів

function sendRecurringEmail() {
  var recipient = "[email protected]";
  var subject = "Тут вкажіть тему";
  var message = "Тут вкажіть ваше повідомлення";

  GmailApp.sendEmail(recipient, subject, message);
}

Gmail має функцію планування листів, але не підтримує повторювані повідомлення. Цей скрипт допоможе вам надіслати повторювані листи на вказану адресу з заданою темою та повідомленням. Просто налаштуйте повторюваний тригер за допомогою розділу “Тригери”.

У скрипті, змініть одержувача, тему та текст повідомлення на необхідні вам дані. Переконайтеся, що лапки навколо прикладу тексту залишаються. Наприклад, тема повинна виглядати так:

var subject = "Важливе нагадування";

Оскільки тригери мають максимальний ліміт в один місяць, вам доведеться надсилати повторюване повідомлення раз на місяць. На жаль, цей скрипт не підходить для надсилання привітань до подій, що відбуваються щороку.

Фільтрування листів з посиланнями та мітка

function processUnreadEmailsWithLinks() {
  var labelName="Листи з посиланнями";
  var label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    label = GmailApp.createLabel(labelName);
  }
  var threads = GmailApp.search('is:unread');
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var body = message.getBody();
      if (bodyContainsLinks(body)) {
        label.addToThread(threads[i]);
      }
    }
  }
}

function bodyContainsLinks(body) {
  var regex = /https?:\/\/[^\s<>"']+/g;
  return regex.test(body);
}

Листи з посиланнями в тілі тексту часто мають велике значення. Класифікація листів з посиланнями може бути корисною, незалежно від того, чи отримуєте ви звіти від колег, чи підписані на інформаційні розсилки.

Цей скрипт переглядає усі непрочитані листи у вашому Gmail та позначає ті, що містять посилання, новою міткою під назвою “Листи з посиланнями”. За замовчуванням, він шукатиме листи по всьому Gmail, але ви можете змінити параметр пошуку, відредагувавши рядок `threads = GmailApp.search(‘is:unread’);`. Ось кілька прикладів, як це можна зробити.

Пошук лише у Вхідних: `var threads = GmailApp.search(‘in:inbox is:unread’);`

Пошук в інших мітках: `var threads = GmailApp.search(‘in:inbox is:unread OR in:promotions is:unread OR in:important is:unread’);`

Пошук усіх прочитаних/непрочитаних листів у Вхідних: `var threads = GmailApp.search(‘in:inbox’);`

Пошук листів від конкретного відправника: `var threads = GmailApp.search(‘from:[email protected]‘);`

Ці приклади повинні дати вам уявлення про те, як можна редагувати скрипт для звуження діапазону пошуку листів з посиланнями. Я вважаю, що щоденний тригер буде достатнім для таких типів листів.

Автоматичне Видалення Старих листів

function deleteOldEmails() {
  var threads = GmailApp.search('older_than:30d');
  for (var i = 0; i < threads.length; i++) {
    threads[i].moveToTrash();
  }
}

Якщо ви не бажаєте зберігати старі листи, цей скрипт допоможе вам видалити ті, що старші за певний період часу. Даний скрипт шукає всі листи в Gmail, які старші 30 днів, та переміщує їх у кошик. Ви можете змінити значення `’older_than:30d’` на інше, наприклад `’older_than:180d’`.

Якщо ви хочете видалити листи з конкретної мітки, ви можете відредагувати рядок `Gmail.App.search`, щоб включити в нього цю мітку. Ось приклад:

`var threads = GmailApp.search(‘in:inbox older_than:30d’);`

Щоб автоматизувати процес, створіть тригер, який автоматично запускатиме скрипт кожні кілька днів. Щотижневий або навіть щомісячний тригер буде достатнім в залежності від того, скільки старих листів ви хочете видаляти.

Збереження Адрес Електронної Пошти в Google Таблицях

function getEmailAddresses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "Адреси Електронної Пошти";
  var sheet = ss.getSheetByName(sheetName);
  
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
    sheet.appendRow(["Адреса Електронної Пошти"]);
  }
  
  var threads = GmailApp.getInboxThreads();
  var emailAddresses = [];
  
  var existingData = sheet.getDataRange().getValues();
  if (existingData.length > 1) {
    var existingEmailAddresses = existingData.slice(1).flat();
  } else {
    var existingEmailAddresses = [];
  }
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var emailAddress = messages[j].getFrom();
      if (emailAddresses.indexOf(emailAddress) === -1 && existingEmailAddresses.indexOf(emailAddress) === -1) {
        emailAddresses.push(emailAddress);
      }
    }
  }
  
  for (var k = 0; k < emailAddresses.length; k++) {
    sheet.appendRow([emailAddresses[k]]);
  }
}

Цей скрипт переглядає ваш Gmail, копіює імена та електронні адреси відправників/одержувачів, та зберігає їх в Google Таблицях. Це корисно для створення списку розсилки або для обліку контактів.

Створення цього скрипту відрізняється від інших, оскільки вам потрібно відкрити Google Apps Script в Google Таблицях, щоб він міг ідентифікувати документ. Це необхідно зробити лише один раз. Ось інструкція:

Відкрийте нову таблицю в Google Таблицях. Натисніть “Розширення” у верхньому меню, а потім виберіть “Сценарій програм”. Це відкриє Google Apps Script, де ви зможете додати скрипт і запустити його, як я показував раніше.

Скрипт створить новий лист під назвою “Адреси Електронної Пошти”, де імена та адреси електронної пошти будуть записані в окремих клітинках. Повторно відкривати таблицю в майбутньому не потрібно. Будь-яка нова адреса електронної пошти буде додана до листа в кінці без дублікатів.

Щоденний або щотижневий тригер буде достатнім, залежно від частоти отримання листів від нових відправників.

Автоматичне Збереження Вкладень на Google Диск

function onNewEmail(e) {
  var threads = GmailApp.getInboxThreads(0, 1);
  var messages = threads[0].getMessages();
  
  var folderName = "Вкладення Електронної Пошти";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;

  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }
  
  for (var i = 0; i < messages.length; i++) {
    var message = messages[i];
    
    if (message.getAttachments().length > 0) {
      var attachments = message.getAttachments();
      
      for (var j = 0; j < attachments.length; j++) {
        var attachment = attachments[j];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();

        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

Цей скрипт є дуже зручним, якщо ви часто отримуєте важливі вкладення електронною поштою. Він не тільки зберігає вкладення, але й групує їх в зручному інтерфейсі.

Цей скрипт призначений для роботи з новими листами, які ви отримаєте після його першого запуску. Він автоматично створить папку “Вкладення Електронної Пошти” на Google Диску, якщо її не існує. Для перевірки дублікатів файлів я використовував MD5 хеш, який є унікальним на основі вмісту файлу.

Якщо ви бажаєте зберегти вкладення з уже отриманих листів, а не лише нових, ось модифікований скрипт, що виконує те ж завдання, але зберігає вкладення з існуючих листів. Збереження всіх вкладень займе деякий час, залежно від їх кількості.

function saveAllAttachmentsToDrive() {
  var folderName = "Вкладення Електронної Пошти";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;
  
  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }

  var threads = GmailApp.getInboxThreads();

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var attachments = message.getAttachments();
      
      for (var k = 0; k < attachments.length; k++) {
        var attachment = attachments[k];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();
        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

Отримання Щоденних Надихаючих Цитат

function sendDailyQuoteEmail() {
  var apiKey = 'YOUR_API_KEY';
  var endpoint="https://quotes.rest/qod";

  var response = UrlFetchApp.fetch(endpoint, {
    headers: {
      'X-TheySaidSo-Api-Secret': apiKey
    }
  });

  var data = JSON.parse(response.getContentText());
  var quoteContents = data.contents.quotes[0];
  var quote = quoteContents.quote;
  var author = quoteContents.author;

  var recipient="[email protected]";
  var subject="Цитата Дня";
  var message = `Ось ваша щоденна цитата:\n\n"${quote}"\n\n- ${author}`;

  GmailApp.sendEmail(recipient, subject, message);
}

Цей скрипт не має прямого застосування для вашої роботи, але він чудовий для натхнення. Якщо правильно налаштувати, цей скрипт використовуватиме API They Said So для відправлення щоденної надихаючої цитати на вашу пошту. Ось як це зробити:

По-перше, вам потрібен персональний API ключ від They Said So. На сайті They Said So API ви можете зареєструвати безкоштовний обліковий запис і отримати ключ. Він надає 5 безкоштовних запитів, чого більш ніж достатньо для щоденної цитати.

Отримавши ключ, замініть `YOUR_API_KEY` на фактичний ключ. Також потрібно замінити `[email protected]` на вашу електронну адресу або на адресу іншої людини, якщо ви хочете налаштувати цю функцію для когось.

Після цього налаштуйте тригер, який буде виконуватися щодня, оскільки виконання раніше того ж дня призведе до повторного надсилання поточної цитати.

Заключні слова

У мене не виникало проблем з одночасним виконанням всіх цих скриптів, і я також не досягав щоденної квоти. Я впевнений, що у вас також все буде гаразд, якщо ви не будете використовувати занадто агресивні тригери. Також варто регулярно перевіряти роботу цих скриптів на виявлення помилок.