Кирилл Соппа, финансовый консультант
Продолжая тему автоматизации с помощью сервисов Google, в канун Нового года подготовил для Вас легкий праздничный материал. О том, как я с помощью скриптов сделал поздравительную рассылку для своих клиентов и партнеров.
Итак, у нас есть на Google Диске праздничная открытка и список клиентов в Google Таблице, которым надо разослать поздравление, например, в таком формате:
№ | Название компании | Фамилия | Имя | Отчество | Почта |
1 | Индивидуальный предприниматель | Соппа | Кирилл | Михайлович | This email address is being protected from spambots. You need JavaScript enabled to view it. |
2 | Крутая компания | Петров | Евгений | Алексеевич | This email address is being protected from spambots. You need JavaScript enabled to view it. |
Жмем кнопку “Создать” в Google Диске, выбираем в меню “Еще/Google Apps Script”. Открывается редактор скриптов. Меняем название проекта кликнув мышью на само название или в меню “Файл/Переименовать” на “Sending mails”. Удаляем заготовку function myFunction() {}
и начинаем создавать свой код. Сначала создадим переменные ADDRESS_BOOK
и PICTURE
и присвоим им значения идентификаторов файлов списка клиентов и открытки:
// идентификаторы адресной книги и картинки var ADDRESS_BOOK='1CrYN4w8gpwIfxNI7tx580YuqxCJjPDM2g96etxEb7Hk'; var PICTURE='0B5dfvgXy_O9QY3JnYnVoT0FZU0k';
После двойного слеша //
в тексте кода можно вставлять любые комментарии. Узнать значения идентификаторов можно выбрав в контекстном меню (кликнув правой кнопкой мыши на файле) пункт “Показать ссылку”. В открывшемся окне будет ссылка вида:
https://drive.google.com/open?id=0B5dfvgXy_O9QY3JnYnVoT0FZU0k
Все что после символов "...id=" и есть идентификатор файла на Google Диске. Копируем и вставляем в наш код. Дальше нам надо вставить текст письма. В письме должно быть обращение, поздравительная открытка и ссылка для перехода на наш сайт (это же наш клиент).
// текст письма в HTML-формате var TEXT_EMAIL='<font size="4 face=fantasy" color="blue">’+ ‘Здравствуйте, #NAME#!</font><br>'+ '<img src="cid:imageHappyNewYear"><br>'+ '<a href="/google.ru"><font size="4 face=fantasy" color="blue">’+ ‘посетить наш сайт</font></a>';
Это текст в HTML-разметке. Кратко его прокомментирую. В первой строке задаются параметры обращения. Во второй строке стоит само обращение. На место #NAME#
мы будем вставлять адресата письма. В следующей строке мы задаем контейнер для нашего рисунка imageHappyNewYear
. А в последних двух строках задается ссылка на наш сайт (в данном примере указан сайт Google).
Теперь создадим функцию отправки писем:
function sendMails() { }
и дальше код будем вставлять между операторных скобок {}
. Переносим наш рисунок из файла на Google Диске в контейнер:
// загружаем картинку из файла в Blob-хранилище var imageBlob=DriveApp.getFileById(PICTURE).getBlob() .setName("imageBlob");
Доступ к файлу с картинкой мы получили через идентификатор файла, который записан в переменной PICTURE
с помощью функции getFileById
объекта DriveApp
. Дальше нам надо получить доступ к списку адресов:
// открываем список адресов, сохраняем его в addressTable, узнаем его размер var sh=SpreadsheetApp.open(DriveApp.getFileById(ADDRESS_BOOK)) .getSheetByName('List'); var addressTable=sh.getDataRange().getValues(); var numRows=sh.getDataRange().getNumRows()-1;
Объект SpreadsheetApp
дает доступ к функциям работы с Google Таблицами. Доступ к нужной таблице опять же осуществляется через ее идентификатор ADDRESS_BOOK
. Функция getSheetByName
возвращает нужный лист, функция getDataRange
возвращает прямоугольную область, в которой есть какие-либо значения. Функция getValues
возвращает значения в диапазоне. Функция getNumRows
возвращает количество строк в диапазоне. Таким образом, у нас в массиве addressTable
значения списка клиентов, а в переменной numRows
их количество. Вставляем код дальше:
// создаем файл отчета с именем "REPORT дата и время отправки" var curDate=new Date(); var ss=SpreadsheetApp.create('REPORT '+curDate.getDate()+'/' +(curDate.getMonth()+1)+'-' +curDate.getHours()+':'+curDate.getMinutes()); var shr=ss.getSheets()[0];
Это необязательная часть — создание таблицы с отчетом об отправке писем. Нужна мне была в основном для отработки навыков работы с таблицами и выявления случайных ошибок в написании электронной почты в большом списке клиентов. Строка var curDate=new Date()
создает переменную curDate
с текущими датой и временем. Дальше мы создаем таблицу с именем вида “REPORT 26/12 17-12”. Функции getDate, getMonth, getHours, getMinutes
как видно из их названия возвращают соответствующую часть даты. Тут стоит только отметить функцию getMonth
. Она отличается тем, что нумерация месяцев в отличие от дней начинается с нуля. Ну и в последней строке мы получаем ссылку на первый лист таблицы (листы тоже нумеруются с нуля). Все готово, можно запускать цикл по рассылке писем:
// цикл по всем записям из списка адресов for (var index=1; index=numRows; index++) { // меняем #NAME# на ФИО контакта var html_text=TEXT_EAIL.replace('#NAME#', addressTable[index][2]+' ' +addressTable[index][3]+' '+addressTable[index][4]); // формируем сообщение var mail={ htmlBody: html_text, name: 'Наша компания', to: addressTable[index][5], subject: 'С Новым Годом!', inlineImages: {imageHappyNewYear: imageBlob} }; // пытаемся отправить, результат пишем в отчет try { MailApp.sendEmail(mail); shr.getRange(index, 3).setValue('Отправлено'); } catch (err) { shr.getRange(index, 3).setValue('Ошибка: '+err.message); }; // заполняем остальные колонки отчета shr.getRange(index, 1).setValue(addressTable[index][0]); shr.getRange(index, 2).setValue(addressTable[index][1]); shr.getRange(index, 4).setValue(MailApp.getRemainingDailyQuota()); }
Код содержит комментарии, но все же дам краткие пояснения. Объект MailApp
дает доступ к отправке писем, функция sendMail
отправляет письмо, заданное структурой mail
. В структуре письма параметры name, to, subject
соответствуют своим обиходным значениям: имя отправителя, адресат, тема письма. Параметр htmlBody
содержит текст письма в HTML-разметке. Параметр inlineImages
— это структура, которая показывает соответствие между ссылкой на контейнер картинки в HTML-тексте письма и самим контейнером. Конструкция try {} catch (err) {}
позволяет не прерывать выполнение скрипта при возникновении ошибки. Если ошибка возникает при выполнении кода в секции try {}
, то выполнение передается секции catch (err) {}
. Если ошибки не возникает, секция catch (err) {}
не выполняется вообще. Функция getRange
возвращает диапазон (в данном случае одну ячейку), функция setValue
помещает в указанный диапазон значение. Наконец, функция getRemainingDailyQuota
возвращает остаток от дневного лимита на отправку сообщений.
Код готов. Необходимо выполнить его авторизацию. Это делается просто — запускаем функцию sendMails
(меню “Выполнить/sendMails”), Google сам напоминает нам, что нужна авторизация. Жмем “Далее”, видим следующее окно:
“Просмотр и изменение таблиц на Google Диске” нам нужно для доступа к списку клиентов, “Храните файлы пользователей на Google Диске” необходимо для сохранения файла отчета, “Рассылка почты от вашего имени” - собственно, для рассылки от Вашего имени.
Жмем “Разрешить”, скрипт выполняется. Находим на Google Диске (в корне) таблицу REPORT с текущим временем. Открываем, видим примерно следующее:
1 | Индивидуальный предприниматель | Отправлено | 96 |
2 | Крутая компания | Отправлено | 95 |
В завершении скажу несколько слов о своем опыте использования данного скрипта.
Также, если Вас заинтересовали возможности, предоставляемые сервисами Google для автоматизации бизнес-процессов, есть сообщество в Google+. Там очень отзывчивые ребята, собственно, по мотивам их публикаций я и написал данный скрипт.
Ссылки на документы из блога:
Список клиентов
Скрипт
Картинка