Skip to content

Instantly share code, notes, and snippets.

@cooltables
Last active December 14, 2020 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cooltables/1b83e7a4ef1ff57b8631254e3076b8cc to your computer and use it in GitHub Desktop.
Save cooltables/1b83e7a4ef1ff57b8631254e3076b8cc to your computer and use it in GitHub Desktop.
// ************************************************************************************************************************************
// ** Добро пожаловать в пример скрипта! **
// ** Скрипт создаёт отчёты по шаблону. Cкопируйте себе шаблон: **
// ** https://docs.google.com/spreadsheets/d/1aRfj-7Ytl9dTCN_nRK7WfxJNgbrLDCCr_enhtLAzQ2M/copy **
// ************************************************************************************************************************************
//
// ↓ Далее идут настройки, необходимые для правильной работы скрипта
function getTeplateSettings_() {
var sets = {
// ------------------------------ Н А С Т Р О Й К И ------------------------------------
// ↓ Айди файла-шаблона. Можно заменить на айди вашего шаблона
id: '1aRfj-7Ytl9dTCN_nRK7WfxJNgbrLDCCr_enhtLAzQ2M',
//
// ↓ Айди папки, в которую планируете вставить отчёты
// ↓ Оставьте пустым чтобы создать отчёты в корне диска
folder: '',
managers: {
sheet: 'Менеджеры', // Лист где храниться информация о менеджерах
names: 'B7:B', // Диапазон где хранятся имена менеджеров
emails: 'C7:C' // Диапазон, где хранятся адреса электронных почт менеджеров
},
out: {
sheet: 'Отчёт', // Лист на котором скрипт меняет имя менеджера
range: 'B1' // Адрес ячейки, в которую надо записать имя менеджера
}
// -------------------------------------------------------------------------------------
};
return sets;
}
//
// ↓ Основная функция, которая в цикле запускает создание отчётов менеджеров
function createReportsByTemplate() {
var sets = getTeplateSettings_(); // получить настройки
var set = {}; // переменная, в которой мы будем хранить настройки для создания одного шаблона менеджеру
var template = SpreadsheetApp.openById(sets.id); // файл шаблона
var managersSheet = template.getSheetByName(sets.managers.sheet); // лист, на котором хранится информация о менеджерах
var managerNamesData = managersSheet.getRange(sets.managers.names).getValues(); // имена менеджеров в виде двумерного массива данных
var managerMailsData = managersSheet.getRange(sets.managers.emails).getValues(); // почты менеджеров в виде двумерного массива данных
//
// [ 1 ]. Определить папку, куда копируем файлы
var folder; // пустое хранилище для папки
if (sets.folder === '') { folder = DriveApp.getRootFolder(); } // корневая папка
else { folder = DriveApp.getFolderById(sets.folder); } // папка по заданному айди
//
// [ 2 ]. ЦИКЛ. Пройдёмся по перечню менеджеров, получим настройки, и запустим скрипт на создание шаблона
var result = [];
for (var i = 0; i < managerNamesData.length; i++) {
// ============================= Настройка для одного запуска функции, создающей отчёт по шаблону
set = {
name: managerNamesData[i][0], // имя менеджера
email: managerMailsData[i][0], // электронная почта менеджера
folder: folder, // папка, куда складываем копии
id: sets.id, // айди файла-шаблона, чтобы создать копию
out: sets.out // информация о том, на какаом листе менять ключ отчёта -- имя менеджера
// =============================
}
if (set.name !== '') { // если имя менеджера не пустое
result.push(createReportByTemplate_(set)); // запуск функции, которая сделает отчёт по шаблону
}
}
Logger.log(result);
}
//
// ↓ Функция, которая создаст один отчёт по настройкам
// Она запускается в цикле несколько раз
//
// set:
// {
// name: 'Иванов Иван',
// email: 'email@email.com',
// template: {Файл-шаблон},
// out: {
// sheet: 'Отчёт', // Лист на котором скрипт меняет имя менеджера
// range: 'B1' // Адрес ячейки, в которую надо записать имя менеджера
// }
// }
function createReportByTemplate_(set) {
// [ 0 ]. Проверки
if (!set) { return -1; } // завершить скрипт, если нет настроек
if (!set.id) { return -2; } // нет айди файла
if (!set.name) { return -3; } // нет имени менеджера
if (set.name === '') { return -4; } // не указано имя менеджера
//
// [ 1 ]. Создать копию шаблона
var copy = DriveApp.getFileById(set.id).makeCopy(set.name, set.folder); // файл-копия
// ^^^ Называем файл так же как менеджера
//
// Примечание: Файл copy является объектом сервися диска Google: DriveApp.
// Этот объект можно копировать, менять его имя, и прочее.
// Чтобы получить доступ к copy как к таблице, мы должны
// получить новый объект -- таблицу sheet
var sheet = SpreadsheetApp.openById(copy.getId()); // это объект: таблица, которую мы создали
//
// [ 2 ]. Изменить ключ -- имя менеджера
sheet.getSheetByName(set.out.sheet).getRange(set.out.range).setValue(set.name);
//
// Последние действия -- только если указана почта менеджера
if (set.email) {
// [ 3 ]. Дать доступ на редактирование
copy.addEditor(set.email); // тут опять удобно опять использовать объект диска
//
// [ 4 ]. Отправить на почту уведомление
GmailApp.sendEmail(set.email, "Новый отчёт для вас", "Вы получили новый отчёт " + sheet.getUrl());
}
return 0; // вернуть 0 -- успех
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment