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.