Сложная автоматическая Email рассылка Google таблиц
Создаем сложную автоматическую Email рассылку Google таблиц, с помощью Apps Script
Код для создания скрипта в Apps Script:
// Подставляем имя
function myFunction() {
var list = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Получаем активную книгу и активный лист
if(list.getName() === "Список заказчиков"){ // Проверяем имя активного листа, и если имя совпадает, то
list.getRange('C2:C900').activate(); //Выделяем диапазон
list.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); //Очищаем выделенный диапазон
list.getRange("C2").setFormula("=IFERROR(VLOOKUP(A2;'Email адреса'!A:C;3;0);\"\")"); // Обращаемся к конкретному диапазону и подставляем туда формулу
var ks = list.getLastRow(); // Определяем последнюю строку, т.е. количество строк для заполнение формулой
var diap = list.getRange(2, 3, ks-1); // Определяем диапазон для заполнения формулой (строка, столбец, количество строк, количество столбцов)
list.getRange("C2").copyTo(diap); // Копируем формулу из определенной ячейки в выбранный диапазон
};
};
// Подставляем почту
function myFunction1() {
var list = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Получаем активную книгу и активный лист
if(list.getName() === "Список заказчиков"){ // Проверяем имя активного листа, и если имя совпадает, то
list.getRange('D2:D900').activate(); //Выделяем диапазон
list.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); //Очищаем выделенный диапазон
list.getRange("D2").setFormula("=IFERROR(VLOOKUP(A2;'Email адреса'!A:C;2;0);\"\")"); // Обращаемся к конкретному диапазону и подставляем туда формулу
var ks = list.getLastRow(); // Определяем последнюю строку, т.е. количество строк для заполнение формулой
var diap = list.getRange(2, 4, ks-1); // Определяем диапазон для заполнения формулой (строка, столбец, количество строк, количество столбцов)
list.getRange("D2").copyTo(diap); // Копируем формулу из определенной ячейки в выбранный диапазон
};
};
// Делаем рассылку - отправляем определенный лист таблицы вложением в формате ПДФ
function myFunction2() {
let spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // Обращаемся к активной таблице
let sheet = spreadsheet.getSheetByName('Список заказчиков') // Указываем лист, с которого берем данные клиента
let file = DriveApp.getFileById('1p9htVkm6d6PbNss8PwE6pe-JwDkovxpkLLDjRfIXHIw'); // Указываем код таблицы, которую будем конвертировать в ПДФ и отправлять
let ks = sheet.getLastRow(); // Определяем последнюю строку таблицы, т.е. количество строк
let dataRage = sheet.getRange(2,1,ks,4).getValues(); // Указываем диапазон, с которого берем информацию (с какой строки, с какого столбца, количество строк, количество столбцов)
// Скрываем ненужные нам листы
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Email адреса'), true);
spreadsheet.getActiveSheet().hideSheet();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Список заказчиков'), true);
spreadsheet.getActiveSheet().hideSheet();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('данные'), true);
spreadsheet.getActiveSheet().hideSheet();
// Задаем цикл, условие и делаем рассылку
for(let i =0;i < dataRage.length; i++){
// Подготавливаем сводную таблицу:
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Сводная'), true); // Активируем лист со сводной таблицей, и устанавливаем следующие настройки сводной таблицы:
var sourceData = spreadsheet.getRange('\'данные\'!A:L'); // Указываем диапазон данных для построения сводной таблицы
var pivotTable = spreadsheet.getRange('A2').createPivotTable(sourceData); // Указываем ячейку на которой располагается левый верхний угол сводной таблицы
var pivotValue = pivotTable.addPivotValue(2, SpreadsheetApp.PivotTableSummarizeFunction.COUNTA); // Указываем значение для сводной таблицы
pivotValue.setDisplayName('Количество'); // Меняем название колонки со значением сводной таблицы
var pivotGroup = pivotTable.addRowGroup(5); // Выводим колонку в строки сводной таблицы
pivotGroup = pivotTable.addRowGroup(2); // Выводим колонку в строки сводной таблицы
pivotGroup.showTotals(false); // Отключаем строку итогов столбца
pivotGroup = pivotTable.addRowGroup(7); // Выводим колонку в строки сводной таблицы
pivotGroup = pivotTable.addRowGroup(11); // Выводим колонку в строки сводной таблицы
pivotGroup.showTotals(false); // Отключаем строку итогов столбца
var criteria = SpreadsheetApp.newFilterCriteria() // Задаем фильтр для сводной таблицы
.setVisibleValues(['В работе'])
.build();
pivotTable.addFilter(6, criteria);
criteria = SpreadsheetApp.newFilterCriteria() // Задаем фильтр для сводной таблицы
.setVisibleValues([dataRage[i][0]])
.build();
pivotTable.addFilter(5, criteria);
criteria = SpreadsheetApp.newFilterCriteria() // Дублируем предыдущий участок кода. Не знаю почему, но без этого в письме отправляется сводная таблица без последнего фильтра. Лучше решения не нашел
.setVisibleValues([dataRage[i][0]])
.build();
pivotTable.addFilter(5, criteria);
// Подготавливаем и отправляем письмо:
let adress = dataRage[i][2] + "<" + dataRage[i][3] + ">"
let name = dataRage[i][2]
let theme = "Текущее положение дел по заявкам на новые договора"
let body = name + ", дня доброго! Во вложении еженедельный отчет по работе отдела снабжения. Письмо сформировано автоматически. Хорошего дня!<br />" + "<br />" + "С уважением, Снабжение"
if(dataRage[i][0] != ""){ // Ставим условие: если в 1 колонке ячейка не пустая, то отправляем письмо:
MailApp.sendEmail({
to: adress,
subject: theme,
name: "Авторассылка от снабжения",
htmlBody: body,
attachments:[file.getAs('application/pdf')]
});
};
};
// Возвращаем скрытые листы на место
spreadsheet.getSheetByName('Email адреса').showSheet()
.activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Email адреса'), true);
spreadsheet.getSheetByName('Список заказчиков').showSheet()
.activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Список заказчиков'), true);
spreadsheet.getSheetByName('данные').showSheet()
.activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('данные'), true);
};