Идея:
Автоматизация рутинных повторяющихся задач по подготовке набора документов при оформлении сотрудника на работу.
Для данного примера будут рассмотрены следующие документы:
- Личная карточка учета СиЗ;
- Личная карточка учета СоС;
- Лист ознакомления с внутренней документацией (в терминах ТК РФ ст.68: “с локальными нормативными актами, непосредственно связанными с трудовой деятельностью работника”).
Необходимые предварительные мероприятия:
- аккаунт google или google suit;
- в данном примере будет рассмотрена только часть по подбору данных в печатную форму, преобразование документа в pdf и отправка его по электронной почте, для этого использованы ранее подготовленные RACI-матрица по локальным нормативным актам, реестры СИЗ / СОС с соответствующей разрешительной документации.
Реализация:
1. Для старта процесса снова используем форму гугл / google form (далее - ФОРМА) с минимальным набором данных: ФИО, должность, дата приема. Должность целесообразно выбирать из стандартизованного выпадающего списка - вся идея сводится к подбору предустановленных атрибутов для конкретной должности.
2. Нажимаем “Посмотреть ответы в Таблицах”. Создаем необходимое количество листов (таблицы с основными данными и сами печатные формы) и настраиваем QUERY функции для сбора данных. Функция подбирает необходимые данные из соответствующих таблиц с учётом сроков действия документов для последнего значения переданного из ФОРМы. Пример функции:
=QUERY('СИЗ'!A:J; "select C WHERE A = '" & ДВССЫЛ("'Ответы на форму (1)'!E"&СЧЁТЗ('Ответы на форму (1)'!A:A))&"' and I > date '"& ТЕКСТ(ДВССЫЛ("'Ответы на форму (1)'!F"&СЧЁТЗ('Ответы на форму (1)'!C:C));"yyyy-MM-dd")&"' and G < date '"& ТЕКСТ(ДВССЫЛ("'Ответы на форму (1)'!F"&СЧЁТЗ('Ответы на форму (1)'!A:A));"yyyy-MM-dd")&"'";0)
3. Создаём скрипт, который будет конвертировать нужные листы в pdf документы и отправлять их по электронной почте. Использован этот скрипт с минимальными корректировками.
function startfunction() {
// Create a PDF containing all the tabs in the active spreadsheet, name it
// after the spreadsheet, and email it
// convertSpreadsheetToPdf('user@email.com')
// Create a PDF containing all the tabs in the spreadsheet specified, name it
// after the spreadsheet, and email it
// convertSpreadsheetToPdf('user@email.com', '1r9INcnsyvSQmeduJWVYAvznOOYei9jeAjsy0acA3G1k')
// Create a PDF just containing the tab 'Sheet2' in the active spreadsheet, specify a name, and email it
// convertSpreadsheetToPdf('user@email.com', null, 'Sheet2', 'PDF 3')
}
/*
* Save spreadsheet as a PDF
*
* @param {String} email Where to send the PDF [OPTIONAL]
* @param {String} spreadsheetId Or the active spreadsheet[OPTIONAL]
* @param {String} sheetName The tab to output [OPTIONAL]
* @param {String} PdfName [OPTIONAL]
*/
function convertSpreadsheetToPdf(email, spreadsheetId , sheetsName, sheetName, pdfName) {
var spreadsheet = spreadsheetId ? SpreadsheetApp.openById(spreadsheetId) : SpreadsheetApp.getActiveSpreadsheet();
spreadsheetId = spreadsheetId ? spreadsheetId : spreadsheet.getId()
var sheetId = sheetName ? spreadsheet.getSheetByName(sheetName).getSheetId() : null;
var ss = spreadsheet.getSheetByName('Ответы на форму (1)');
var pdfName = pdfName ? pdfName : ss.getRange(ss.getLastRow(), 2, 1).getValues();
var parents = DriveApp.getFileById(spreadsheetId).getParents();
var folder = parents.hasNext() ? parents.next() : DriveApp.getRootFolder();
var url_base = spreadsheet.getUrl().replace(/edit$/,'');
var sheet_to_send = {'Лист1':1, 'Лист2': 1, 'Лист3': 1}; //указываем все листы, который нужно оставить
var sheets = spreadsheet.getSheets(); //получаем список всех листов
// скрываем все листы кроме нужных
for(var i in sheets){
if (!(sheets[i].getName() in sheet_to_send)){
sheets[i].hideSheet();
}
}
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
// Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
+ (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))
// following parameters are optional...
+ '&size=A4' // paper size
+ '&portrait=true' // orientation, false for landscape
//+ '&fitw=true' // fit to width, false for actual size
+ '&scale=4' // 1 = Normal 100% -- 2 = Fit to width -- 3 = Fit to height -- 4 = Fit to Page
+ '&top_margin=0.50' //All four margins must be set!
+ '&bottom_margin=0.50' //All four margins must be set!
+ '&left_margin=0.50' //All four margins must be set!
+ '&right_margin=0.50' //All four margins must be set!
+ '&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+ '&gridlines=false' // hide gridlines
+ '&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
}
}
var response = UrlFetchApp.fetch(url_base + url_ext, options);
var blob = response.getBlob().setName(pdfName + '.pdf');
folder.createFile(blob);
if (email) {
var mailOptions = {
attachments:blob
}
MailApp.sendEmail(
email,
"RPA. Новый сотрудник " + pdfName,
"Печать документа на двух сторонах.",
mailOptions);
}
} // convertSpreadsheetToPdf()
4. Добавляем триггер по событию “При отправке формы”.
5. Пользуемся как показано на заглавной анимации.