Кирилл Соппа, финансовый консультант
Продолжая тему автоматизации с помощью сервисов 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+. Там очень отзывчивые ребята, собственно, по мотивам их публикаций я и написал данный скрипт.
Ссылки на документы из блога:
Список клиентов
Скрипт
Картинка