Dev 4 лайфхака Gmail и Google Apps Script

Ирина Чернова avatar | 35
FavoriteLoading В закладки
4 лайфхака Gmail и Google Apps Script

Как автоматизировать процессы GMail, даже не зная ничего про программирование.

Google Apps Script —  это усеченная версия JavaScript дополненная классами и методами для работы с сервисами Google. Для Gmail и Google Документов этот язык служит тем же, чем Visual Basic for Application для Outlook, Word, Excel и PowerPoint. Эта статья первая в цикле рецептов для решения повседневных проблем. Фишки, описанные ниже, внедряются за считанные минуты и смогут сэкономить ваше личное время несчетное число раз. Чтобы применить на практике информацию из этой статью не нужно знать ни Google Apps Script, ни даже JavaScript. Достаточно четко следовать инструкциям.

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

  1. Заходим на Google Docs
  2. Авторизируемся под своим аккаунтом;
  3. В соседней вкладке открываем Gmail и убеждаемся, что выбрали нужный почтовый ящик;
  4. Создаем новую электронную таблицу;
  5. Выбираем пункт меню Инструменты -> Редактор скриптов. В результате должно открыться вот такое окно:
  6. Редактор-скриптов
  7. Вставляем исходный код в редактор скриптов;
  8. Редактируем его в соответствии с комментариями;
  9. Нажимаем кнопку «Запустить» на панели инструментов;
  10. Если перед выполнением скрипт попросит авторизации и разрешений на действия, соглашаться

Организуем групповую рассылку;

Существует множество онлайн сервисов для  организации групповых рассылок. Их бесплатный функционал зачастую весьма ограничен, в некоторой степени рискованно разрешать какому-то левому сайта отсылать почте от своего имени и быстрее будет воспользоваться Google Apps Script.

Подготовка:

  1. В первый столбец заносим емейлы получателей.  Пример: «[email protected]»;
  2. Во второй столбец заносим обращения к получателям получателей. Пример: «Анатолий Катц»;

Код:

[jscript]
function groupDelivery() {
// Число 5 надо заменить на число адресатов в таблице
var rowsAmount = 5 ;
// Здесь надо указать тему писем
var messageSubject = "Приглашение";
var currentSheet = SpreadsheetApp.getActiveSheet();
var dataRange = currentSheet.getRange(1, 1, rowsAmount, 2);
var data = dataRange.getValues();
for (i in data) {
var row = data[i];
var emailAddress = row[0];
// Поддкорректируйте обращение и текст письма под свои нужды
var messageText = row[1] + ", " + "мы рады Вас пригласить…"; 
MailApp.sendEmail(emailAddress, messageSubject, messageText);
}
}
[/jscript]

Warnings: очень внимательно проверьте адреса и имена получателей и проследите чтобы список начинался с ячейки A1.

Отвечаем на все письма за один прием;

Когда человек уходит в отпуск, то он настраивает автоответ и всем, кто пишет ему сразу приходит: «Я на море, ждите ответа 15 числа».  Но бывает ситуации, когда нет возможности отвечать на почту некоторое время, автоответчик предварительно не был настроен и сотни писем ждут своей очереди. Как не умереть от стресса вызванного десятками часов непрерывного ответа на почту и не обидеть своих коллег?  Можно скриптом за пару минут отправить им всем письмо: «Извините, у меня форс-мажор, несколько дней был в отлучке. Внимательно ознакомлюсь с Вашим письмом и отвечу в ближайшую неделю.  Если дело срочное, позвоните мне пожалуйста».

Код:

[jscript]
function autoReply() {
// Здесь надо указать количество сообщений для ответа, не забыв вычесть из него единицу
amountMessageforReply=1;
// Здесь должен быть красивый вежливый текст
replyText="Был в отпуске. Сорри. Скоро отпишусь. Если срочняк, то набери.";
var threads = GmailApp.getInboxThreads(0, amountMessageforReply);
for (var i = 0; i <= threads.length; i++) {
threads[i].reply(replyText);
}
}
[/jscript]

Warnings: подумайте о том, всем ли корреспондентам корректно посылать составленный вами текст автоответа. Не стоит ли немного модифицировать скрипт и исключить некоторых адресатов из рассылки?

Собираем вложения в папку на Google Drive;

Многие люди хранят в почте море важных файлов: фотографии, образцы документов,  заполненные анкеты, статьи и т.д.  Разобрать эти авгиевы конюшни руками выше сил человека с нормальным уровнем лени. Но можно воспользоваться простейшим скриптом.  Он соберет все вложения из писем в папку на Google Drive, которую потом можно перенести к себе на компьютер и молниеносно находить нужные файлы с помощью Spotlight.

Код;

[jscript]
function saveToGoogleDrive() {
var driveFolder  = "Папка для вложений"; // Здесь надо указать имя папки куда сохранять вложения
amountMail = 1 ; // Количество писем из которых будем забирать вложения
var threads = GmailApp.getInboxThreads(0, amountMail);
var folder = DriveApp.getFoldersByName(driveFolder);
if (folder.hasNext()) {
folder = folder.next();
} else {
folder = DriveApp.createFolder(driveFolder);
}
for (var x=0; x<=threads.length; x++) {
var message = threads[x].getMessages()[0];
var att    = message.getAttachments();
for (var z=0; z<=att.length; z++) {
file = folder.createFile(att[z]);
}
}
}
[/jscript]

Warning: проконтролируйте чтобы у вас было достаточно места на Google Диске. В соответствии с располагаемым свободным пространством надо выбирать число писем для обработки.

Собираем письма от одного отправителя в текстовый файл;

Иногда переписка с человеком растягивается на несколько десятков или сотен писем, которые разбиты по разным цепочкам тем.  И свести смысловые концы с концами в такой ситуации бывает трудоемко.  Особенно когда читаешь переписку имевшую место быть некоторое время назад. В этой ситуации поможет скрипт, собирающий все интересующие письма в текстовый файл, который можно обозреть единым взором (а не открывая письмо за письмом) и быстро найти нужную информацию.

Код:

[jscript]
function writeToFile() {
var doc = DocumentApp.create(‘Переписка’); // Новый файл появится в корневой папке Google диска
var senderAdress = "[email protected]"; // Адрес, переписку с которым надо сохранить
var finalText = "";
var body = doc.getBody();
var threads = GmailApp.search(senderAdress);
for (var x=0; x<=threads.length; x++) {
var messages = threads[x].getMessages();
for (i=0;i<=messages.length-1;i++) {
finalText=finalText + messages[i].getSubject() + messages[i].getPlainBody() + "";
}
body.appendParagraph(finalText);
}
}
[/jscript]

Warning: некоторые личности имеют привычку общаться сразу с нескольких адресов, в лучшем случае с личного и рабочего:-) Для таких ситуаций надо немного переписать скрипт или запустить его несколько раз.

 

Прокомментировать

🙈 Комментарии 35

  1. D-wright avatar
    D-wright28 ноября 2015
    0

    Неужели спешка такая, что статью даже не перевести целиком? Нет русского эквивалента “Warning”?

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    1

    @D-wright, это не перевод.

    Naparnik avatar
    Naparnik28 ноября 2015
    0

    @Ирина Чернова, а почему бы не написать “Внимание”?

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    0

    @Naparnik, лучше уж тогда “Предупреждение”). Мне просто нравится слово Warning, оно вызывает у меня положительные ассоциации)

  2. pupzem avatar
    pupzem28 ноября 2015
    0

    Как сделать чтобы imap папки отображались внутри папки gmail которая во “входящих” в Mail app на OS X ? Никак не могу побороть.

    pupzem avatar
    pupzem28 ноября 2015
    0

    @pupzem, а то они не во “входящие” а внизу отдельным блоком. А в gmail они во входящих. Выручайте кто знает как плизззз

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    0

    @pupzem, если на iphones.ru не было про это статьи, то наверное стоит ее написать в ближайшее время, в двух словах не ответишь)

    pupzem avatar
    pupzem28 ноября 2015
    0

    @Ирина Чернова, Ирина, выручите плизз… Намекните хоть куда копать, правда важно, почты много :-( гуглил гуглил ничего не нагуглилось. Префиксы пробовал и так и сяк ничего не получилось пока что. В родной программе все ок – в яблочной Mail именно gmail не получается, хотя остальные ящики получились.

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    0

    @pupzem, может лучше не копать (раз Вы уже все перепробовали), а написать на JXA скрипт, который будет перемещать эти письма во входящии. И настроить его запуск при каждом открытии Mail?

    pupzem avatar
    pupzem28 ноября 2015
    0

    @Ирина Чернова, нет, я создал кучу имап папок в входящих и распределяю все письма по этим папкам по мере прихода. И неудобно что в Mail OS X почему-то эти вложенные имап папки отображаются отдельно от папки gmail во “входящих” – при этом в web gmail все окей и в почтовой программе Google тоже все правильно отображается :-(

  3. Sergey avatar
    Sergey28 ноября 2015
    0

    Подскажите. А как сделать что бы каждый понедельник отправлялось одно и то же письмо двум людям? Спасибо

    kbarabas avatar
    kbarabas28 ноября 2015
    0

    @Sergey, Сам не пробовал, но может это то что вам нужно? Поищите в Google: How to Schedule Gmail Messages with a Google Sheet

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    0

    @Sergey,очень просто! В Редакторе скриптов открываешь Ресурсы-> Триггеры текущего проекта -> Добавить новый триггер.

    Sergey avatar
    Sergey29 ноября 2015
    0

    @Ирина Чернова, При этом письмо не нужно создавать каждую неделю, если оно не меняется?

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    1

    @Sergey, создайте вот такую функцию и настройте ее еженедельное выполнение.
    function mondayMessages()
    {
    MailApp.sendEmail(“[email protected]”, “Тема письма”, “Текст письма”);
    MailApp.sendEmail(“[email protected]”, “Тема второго письма”, “Текст второго письма”);
    }

    Sergey avatar
    Sergey29 ноября 2015
    0

    @Ирина Чернова, протестировал через триггер, действительно работает)
    Спасибо.

  4. kbarabas avatar
    kbarabas28 ноября 2015
    0

    Ирина!

    В вашем “Flowlab.io — веб-сервис для создания игр” как мне кажется невозможно оставить комментарий. Вероятно потому их там и нет.
    Если конечно это не by some reason.

    Ирина Чернова avatar
    Ирина Чернова28 ноября 2015
    0

    @kbarabas, да у меня тоже не получилось оставить коммент( с утра спрошу у Артура почему так(

  5. Sergey avatar
    Sergey29 ноября 2015
    0

    Ирина, добрый день.

    Еще вопросик. А как файл к письму прикрепить через скрипт рассылки, например из Google Drive. В интернете ответа не нашел. Или это вообще не возможно

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    1

    @Sergey, возможно;-)
    Код проверила, мне письмо пришло с вложением, ID файла легко найти в Google Drive.
    function addAttachments()
    {
    var file = DriveApp.getFileById(‘1BF5EWijdjKjW1ooOcYLS-wvqHzs-YCQIUWLkJd7txAE’);
    MailApp.sendEmail(‘[email protected]’, ‘Тема письма’, ‘Текст письма’, {
    name: ‘Имя файла’,
    attachments: [file.getAs(MimeType.PDF)]
    });
    }

    Yuri28 avatar
    Yuri2815 декабря 2015
    0

    @Ирина Чернова, Добрый день!

    Мне тоже ОЧЕНЬ надо отправлять технологической рассылкой файлик бинарник, но не PDF. Как быть в таком случае? Покопал тему, там только разжевывают про PDF и HTML. Скажем я файлик хотел бы отправлять в таком виде как он есть или завернуть в архив…

    ЗАРАНЕЕ СПАСИБО!

    Ирина Чернова avatar
    Ирина Чернова16 декабря 2015
    1

    @Yuri28, вот код для отправки файла, упакованного в архив:
    function addAttachments()
    {
    var file = DriveApp.getFileById(“0ByNftQqMheCPR0s4UndvQlJ6ek0”);
    MailApp.sendEmail(“[email protected]”, “Архив”, “См. вложение”, {
    name: “Архив”,
    attachments: [file.getAs(MimeType.ZIP)]
    });
    }

    Ирина Чернова avatar
    Ирина Чернова16 декабря 2015
    1

    @Ирина Чернова, а если вы не боитесь спам фильтров и хотите отправлять бинарник как есть:
    function addAttachments()
    {
    var file = DriveApp.getFileById(“0ByNftQqMheCPR0s4UndvQlJ6ek0″);
    MailApp.sendEmail(“[email protected]”, “Архив”, “См. вложение”, {
    name: “Архив”,
    attachments: [file.getBlob()]
    });
    }

    Yuri28 avatar
    Yuri2816 декабря 2015
    0

    @Ирина Чернова,

    ИРИНА, СПАСИБО!
    ВСЁ ВЕЛИКОЛЕПНО ОТПРАВЛЯЕТСЯ!
    ВЫ ЛУЧШАЯ!

  6. Sergey avatar
    Sergey29 ноября 2015
    0

    Круто, надо попробовать. Понимаю, что опыт. Поискал Вас в интернете, много статей интересных пишете, действительно актуальных.
    MimeType.PDF – это название файла, а 1BF5EWijdjKjW1ooOcYLS-wvqHzs-YCQIUWLkJd7txAE его ID?

    А где информацию по примерам для GAS посмотреть?

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    0

    @Sergey, как ни странно мне не попадалось даже на английском языке адекватной качественной коллекции примеров кода или статей. Обычно я смотрю документацию официальную, она очень подробная, но некоторые абстрактные концепции в ней сложны для понимания сходу, так как требуют глубоких знаний о работе сервисов Google. Если есть какие-то вопросы конкретные можете писать их в комменты. Мне легко и интересно на них отвечать:-)

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    0

    @Sergey, MimeType.PDF – это расширение файла вложения)

  7. Sergey avatar
    Sergey29 ноября 2015
    0

    Что-то не то
    function groupDelivery() {
    // Число 5 надо заменить на число адресатов в таблице
    var rowsAmount = 5 ;
    // Здесь надо указать тему писем
    var messageSubject = “Приглашение”;
    var currentSheet = SpreadsheetApp.getActiveSheet();
    var dataRange = currentSheet.getRange(1, 1, rowsAmount, 2);
    var data = dataRange.getValues();
    var file = DriveApp.getFileById(’0B63n-qym5hMsYlVrRHFWdGVDbFU’);
    for (i in data) {
    var row = data[i];
    var emailAddress = row[0];
    // Поддкорректируйте обращение и текст письма под свои нужды
    var messageText = row[1] + “, ” + “мы рады Вас пригласить…”;
    MailApp.sendEmail(emailAddress, messageSubject, messageText, {name: ‘SMIT_PRESENTATION’, attachments: [file.getAs(MimeType.PDF)]});
    }
    }

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    0

    @Sergey, расшарь доступ к файлу на [email protected], я посмотрю, скорее всего дело в преобразовании презентации в PDF(

    Ирина Чернова avatar
    Ирина Чернова29 ноября 2015
    0

    @Sergey, я поправила кое-какие кавычки, они как-то криво копируются из-за плагина вордпресс. Убрала лишнии параметры вложения и заработало.
    function groupDelivery() {
    // Число 5 надо заменить на число адресатов в таблице
    var rowsAmount = 1 ;
    // Здесь надо указать тему писем
    var messageSubject = “Приглашение”;
    var currentSheet = SpreadsheetApp.getActiveSheet();
    var dataRange = currentSheet.getRange(1, 1, rowsAmount, 2);
    var data = dataRange.getValues();
    var file = DriveApp.getFileById(“0B63n-qym5hMsYlVrRHFWdGVDbFU”);
    for (i in data) {
    var row = data[i];
    var emailAddress = row[0];
    // Поддкорректируйте обращение и текст письма под свои нужды
    var messageText = row[1] + “, ” + “мы рады Вас пригласить…”;
    MailApp.sendEmail(emailAddress, messageSubject, messageText, {attachments: [file]});
    }
    }

  8. Sergey avatar
    Sergey6 декабря 2015
    0

    Ирина. А как это сделать на двух листах. Например, на первом листе берутся значения “Приветствие”, “текст письма” и ID файла, а на втором список адресатов?

    Ирина Чернова avatar
    Ирина Чернова6 декабря 2015
    1

    @Sergey, Принцип такой:

    tableDoc = SpreadsheetApp.openById(“1RzIv25ZnSEUI3cyu-h-x0JKnkScPEA5WwiEDqX-stEE”);
    bonjour = tableDoc.getSheetByName(“Лист с приветствиями”).getRange(“A1”).getValue();
    email = tableDoc.getSheetByName(“Лист с адресами”).getRange(“A1”).getValue();

    Подробнее про таблицы читайте здесь http://www.iphones.ru/iNotes/506236

  9. Sergey avatar
    Sergey6 декабря 2015
    0

    Принцип помог)

    Ирина Чернова avatar
    Ирина Чернова6 декабря 2015
    0

    @Sergey, очень хорошо)

  10. cowax avatar
    cowax3 января 2016
    0

    Бьюсь с распаковкой вложений (от определённого адресата) на Gdrive.
    попробовал способ из этой статьи, не получилось :(
    Не удается обнаружить метод createFile((class)). (строка 15, файл Код)

    Я бы хотел собирать счета от мтс в папки соответсвующие периодам.

    Помогите пожалуйста.
    Спасибо.

Вы должны авторизоваться или зарегистрироваться для комментирования.

Нашли орфографическую ошибку в новости?

Выделите ее мышью и нажмите Ctrl+Enter.

Как установить аватар в комментариях?

Ответ вот здесь