If This Then That — отличный онлайн-инструмент, который поможет вам автоматизировать работу. Это сервис с почти десятилетней историей, который упрощает взаимодействие сервисов и устройств. Вот как IFTTT описывает себя:

…бесплатный способ заставить все ваши приложения и устройства общаться друг с другом.

Ранее в этом году Google внесла изменения в свою политику API. Эти изменения привели к прекращению работы большинства триггеров Gmail. Апплеты, зависящие от триггеров Gmail, оказались бесполезными.

Сегодня то, что осталось от действий, связанных с Gmail, в IFTTT — это просто апплеты, которые отправляют электронные письма по все еще совместимым триггерам.

В основном я использовал эти триггеры Gmail, и для меня это был большой успех, когда я понял, что не смогу делегировать свои черные задачи машине.
Вот мой пример использования: команда университета, я часть проводит несколько онлайн-конкурсов, в которых участники отправляют свои работы по электронной почте с некоторыми текстовыми деталями и вложением своих работ. Это вложение сохраняется на Google Диске с их именем, их данные вводятся в электронную таблицу, и все это впоследствии планируется опубликовать в наших социальных сетях.

Самое смешное, что его можно сделать в скромной форме без потери функциональности. Это еще не сделано.

Я автоматизировал большую часть этого через IFTTT. Мне не нравились такие задачи, выполняемые вручную, и я отправился искать решение.

Единственное практическое решение — скрипт Google Apps.

Сценарий Google Apps сводится к JS, что ясно видно из его синтаксиса, похожего на JavaScript. Поднять его несложно, и у него есть удивительная справочная информация по API. Файлы кода Google Apps Script сохраняются в формате GS.

Вот рабочий процесс, который я хотел:

Приходит электронное письмо › Отфильтруйте и пометьте их › Отправьте на Диск вложения с соответствующим названием › Готовьте ответы на сообщения электронной почты

Первая часть находится внутри самого Gmail. Мы создаем фильтр для выбора нужных нам писем и помещаем их под ярлык. Я буду классифицировать письма по двум созданным мною ярлыкам: «KTT19» и его подметка «Необработанные». Для этого просто откройте Gmail и раскрывающийся список поиска, создав фильтр для электронных писем с темой «KTT» и применив к нему метку «KTT19/Unprocessed».

Как только это будет сделано, мы переходим к части скрипта Google Apps. Перейдите в G Suite Developer Hub, где вы можете создавать свои скрипты. На этом этапе Google, скорее всего, попросит вас подтвердить свою личность. Пройдите формальности, и вы окажетесь на приборной панели.

Открыв новый проект, вы увидите редактор кода с заголовком, похожим на службы на основе Google Диска, и боковой панелью. Редактор будет содержать функцию myFunction(), с которой вы сможете начать работу.

В отличие от большинства языков, в GS нет функции-входа, эквивалентной «основной». Вы выбираете функцию для запуска, и GS запускает только ее, когда вы нажимаете кнопку Run, а затем следует инструкциям, как и на любом другом языке. Это отлично подходит для отладки.

Чтобы регистрировать операторы, используйте Logger.log(). Вы можете просмотреть журнал, нажав Crtl+Enter.

Сценарии Google Apps взаимодействуют со службами Google через соответствующие классы, все они выделены в справке по API.

Мы получим доступ ко всем электронным письмам с пометкой «KTT19/Необработанные». Для этого нам нужно создать объект GmailLabel, указывающий на эту метку. Получив этот ярлык, мы можем использовать его для доступа ко всем помеченным электронным письмам. GmailApp предоставляет удобную функцию для получения метки.

var lbl = GmailApp.getUserLabelByName(“KTT19/Unprocessed”);
var unprocessedThreads = lbl.getThreads();

Когда вы отвечаете или пересылаете электронное письмо, это новое электронное письмо становится частью вашей ветки электронной почты. Хотя электронная почта в своем классическом виде несколько дискретна и не имеет состояния — она не связана с ответами, большинство современных веб-почтовых рассылок хранят переписку по электронной почте в аккуратно классифицированных цепочках.

Мы перебираем эти потоки с переменной i, чтобы получить две необходимые нам части данных:

  • Имя отправителя
    Мы найдем данные отправителя в самом первом отправленном им сообщении. Итак, подбираем первое сообщение в ветке. Функция .getFrom() для объекта GmailMessage выдает сведения об отправителе в следующем формате: Fname Lname <[email protected]>. Мы используем функцию разделения, чтобы получить нужную нам часть — ту, что до < в начале адреса электронной почты.
var firstMessage = unprocessedThreads[i].getMessages()[0];
var sendersName = firstMessage.getFrom().split(“ <”)[0];
  • Вложения с электронной почтой
    Чтобы иметь возможность отправлять вложения на Google Диск, нам сначала нужно выяснить, есть ли они. Если они есть, мы итеративно обращаемся к ним как к объектам blob.
var attachmentCount = firstMessage.getAttachments().length;
var attachments = firstMessage.getAttachments();
for(var j = 0; j < attachmentCount; j++) {
 var attachmentBlob = attachments[j].copyBlob();
}

Мы сохраняем эти BLOB-объекты в нашу названную папку на Google Диске с именем отправителя и индексом. Чтобы получить доступ к папке по имени, нам нужно создать итератор. Мы можем использовать этот итератор для доступа ко всем папкам с одинаковым именем, но поскольку у нас есть только одна, нам просто нужно получить доступ к «следующей».

var folder = DriveApp.getFoldersByName(“KTT19”).next();

Для BLOB-объектов на Google Диске расширение не требуется. Если вы загрузите одно из этих сохраненных изображений, оно появится на вашем компьютере с правильным расширением.

Поэтому мы просто называем наш большой двоичный объект именем отправителя и индексом вложения.

for(var j = 0; j < attachmentCount; j++) {
 var attachmentBlob = attachments[j].copyBlob();
 var sentFile = folder.createFile(attachmentBlob);
 sentFile.setName(sendersName + “-” + j);
}

Как только файл будет у нас в безопасности, мы составляем ответ участнику. Этот ответ будет изменен вручную с учетом любых комментариев в электронном письме. Вот функция для создания черновика в том же потоке:

function generateEmail(name, attachmentCount) {
 var content = “Hi “ + name + “!\n...”; // header content
 if(attachmentCount > 1) {
   content += “...”;            // message for excess attachments
 } else if(attachmentCount == 0) {
   content += “...”;            // message for missing attachments
 } 
 content += “...”;              // footer content
 return content;
}

Мы не хотим, чтобы скрипт повторно запускался в тех же потоках электронной почты, поэтому мы удаляем метку «KTT19/Unprocessed» и добавляем вместо нее «KTT19» — это позволяет нам по-прежнему фильтровать электронные письма, попадающие в ту же категорию, но не беспокоиться о избыточные пробеги.

var finalLbl = GmailApp.getUserLabelByName(“KTT19”);
unprocessedThreads[i].removeLabel(lbl).addLabel(finalLbl);

Собираем весь код вместе:

function generateEmail(name, attachmentCount) {
 // draft an email with the given data
 var content = “Hi “ + name + “!\n...”; // header content
 if(attachmentCount > 1) {
   content += “...”;            // message for excess attachments
 } else if(attachmentCount == 0) {
   content += “...”;            // message for missing attachments
 } // end if
 content += “...”;              // footer content
 return content;
}
function traverseEmails() {
 // get variables for labels we'll be using
 var lbl = GmailApp.getUserLabelByName(“KTT19/Unprocessed”); 
 var finalLbl = GmailApp.getUserLabelByName(“KTT19”);
 // get the email threads under this label
 var unprocessedThreads = lbl.getThreads();
 // iterate over these email threads
 for(var i = 0; i < unprocessedThreads.length; i++) {
   // pick the first message and salvage details from it 
   var firstMessage = unprocessedThreads[i].getMessages()[0];
   var sendersName = firstMessage.getFrom().split(“ <”)[0];
   var attachmentCount = firstMessage.getAttachments().length; 
   if(attachmentCount > 0) {
     var attachments = firstMessage.getAttachments();
     var folder = DriveApp.getFoldersByName(“KTT19”).next();
     for(var j = 0; j < attachmentCount; j++) {
       var attachmentBlob = attachments[j].copyBlob();
       var sentFile = folder.createFile(attachmentBlob);
       sentFile.setName(sendersName + “-” + j);
     } // end for
   } // end if
   var content = generateEmail(sendersName, attachmentCount);
   unprocessedThreads[i].createDraftReply(content);
   unprocessedThreads[i].removeLabel(lbl).addLabel(finalLbl);
 } // end for
}

Автоматизированное решение не нужно запускать вручную. Мы создадим триггер, чтобы этот скрипт запускался автоматически.

Просто вернитесь к панели инструментов, щелкните проект правой кнопкой мыши и выберите Триггеры. В зависимости от трафика электронной почты отрегулируйте частоту.

Для меня работающий каждый час триггер, управляемый временем, делает свою работу. Выберите правильную функцию для запуска, traverseEmails и соответствующую настройку уведомления в случае сбоя.

Обратитесь к квотам, предоставляемым для Служб Google Apps, чтобы понять, насколько часто это слишком часто для вашего варианта использования.

И это все.

Простое решение на основе сценариев для автоматизации действий с помощью триггеров на основе Gmail. Вы можете углубиться в записи журнала в Google Таблицах, сделав систему ближе к базе данных.

Сценарии Google Apps — это мощный инструмент, который объединяет все приложения G Suite с помощью простого API. Вы можете создавать подобные автономные сценарии, скрипты, встроенные в документы Google Диска, а также свои собственные веб-приложения. Он предлагает расширенный API для создания более сложных приложений.
Обязательно попробуйте, если вы хотите создавать инструменты с использованием G Suite.