Блог

Генератор документов Google Apps Script с журналом учёта созданных документов

Эта статья является продолжением другой, более ранней статьи Как автоматически вставлять данные в Google Docs, используя Google Apps Script?, в который описывается алгоритм создания копии шаблона документа Google Doc и вставки в него новых данных, полученных из листа Google Spreadsheet.

Здесь мы рассмотрим новую версию программы генерации документов, которая претерпела ряд существенных изменений.

В первую очередь изменения связаны с тем, что в любом мало-мальски приличном делопроизводстве рано или поздно неизбежно встаёт вопрос об учёте созданных документов. Поэтому в новой редакции программы был добавлен журнал регистрации созданных (сгенерированных) документов, где появилось 2 новых поля: номер документа {document_id} и дата документа {document_date}. (В этой версии программы данные новых полей изменяются вручную). Разумеется, при желании этот список может быть существенно дополнен. Главное, не забывать аккуратно копировать уникальные символы новых полей в соответствующие места вставки шаблонов Google Docs.


Журнал регистрации было решено сделать на главном листе ("Main"). Что существенно изменило интерфейс программы. Данные контрагентов переместились на новый лист "Clients":

А поля с чек-боксами для выбора "ОТ КОГО" (FROM) и "КОМУ" (TO) были заменены полями со списком контрагентов, связанным с листом "Clients".

Добавлен также ещё один вариант запуска скрипта - из пользовательского меню (My menu), которое создаётся автоматически при открытии документа.

Перед запуском скрипта теперь необходимо выбрать в новой строке контрагентов FROM и TO, наименование шаблона Google Docs, номер документа и дату документа. И самое главное помнить, что в новом скрипте генерируется тот документ, в строке которого находится активная ячейки.

Полностью обновлённый скрипт программы представлен ниже:

//create user's menu
function onOpen() {
  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("My menu")
    .addItem('Create Document', 'DocGenerator')
    .addToUi()
}

 //main function
function DocGenerator() {

  var sm = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Main");
     
  //find clients info
  var row_active = sm.getActiveCell().getRow();
  var principal_shart_name = sm.getRange(row_active, 1).getValue();
  var attorney_shart_name = sm.getRange(row_active, 2).getValue();
  var principal = getClientData(principal_shart_name);
  var attorney = getClientData(attorney_shart_name);
  
  //find documents info
  var document = {
    id:sm.getRange(row_active, 4).getValue(),
    date:sm.getRange(row_active, 5).getValue(),
    }
  
  // find template
  var docName = sm.getRange(row_active, 3).getValue();
  var docID = getTemlateID(docName);
  var docNameCopy = docName +"_" + document.id +"_" + document.date + "_" + principal.name + "_" + attorney.name;
  var file = DriveApp.getFileById(docID);
  file.makeCopy(docNameCopy);
  var fileCopy = DriveApp.getFilesByName(docNameCopy).next();
  var fileCopyID = fileCopy.getId();
  
  // replacement
  var body = DocumentApp.openById(fileCopyID).getBody();
  body.replaceText('{document_id}', document.id);
  body.replaceText('{document_date}', document.date);
  
  body.replaceText('{principal_name}', principal.name);
  body.replaceText('{principal_id}', principal.id);
  body.replaceText('{principal_id_dateOfIssue}', principal.id_dateOfIssue);
  
  body.replaceText('{attorney_name}', attorney.name);
  body.replaceText('{attorney_id}', attorney.id);
  body.replaceText('{attorney_id_dateOfIssue}', attorney.id_dateOfIssue);
  
  Browser.msgBox("Completed!");    
  
}

function getClientData(sh_name) {

  var sc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Clients");
  var iMax = sc.getLastRow();
  
  for(var i=2; i <= iMax; i++) {
    
    if(sc.getRange(i, 1).getValue() == sh_name) {
      break;    
    }
  }

  var client = {
    short_name: sc.getRange(i, 1).getValue(),
    name: sc.getRange(i, 2).getValue(),
    id: sc.getRange(i, 3).getValue(),
    id_dateOfIssue: sc.getRange(i, 4).getValue(),
    };
  return client;
}

function getTemlateID(docName) {

  var st = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Templates');
  var iMax = st.getLastRow();
  
  for(var i=2; i <= iMax; i++) {
    
    if(st.getRange(i, 1).getValue() == docName) {
      var docId = st.getRange(i, 2).getValue();
      return docId;    
    }
 
  }

}

Более подробные объяснения о работе скрипта Вы сможете получить, ознакомившись с данным видео: