Как използвах Google Suite за автоматизиране на създаването на договори

В свят, в който основните думи са изкуствен интелект, машинно обучение, дълбоко обучение, блокчейн и други все по-малко причудливи думи, понякога има място за много прости решения.

Това е принципът KISS (Keep It Simple Stupid) и все още го използвам каквото мога.

TLTR:

Исках да използвам Google Формуляр за събиране на данни от нашите клиенти и след това автоматично да получа PDF документ (вземете от набор от вече подготвени шаблони за договор на Google Docs), изпълнен с предоставените данни.

И така, ето какво направих:

  • Отворете моя акаунт в Google Диск и създайте нов формуляр на Google;
  • Въведете въпроси и полета;
  • Създайте свързан Google Sheet;
  • Създайте един или повече шаблони на Google Doc, като използвате удобни задържатели (например , , и т.н.)
  • Създайте скрипт в Google Sheet, който създадох по-рано
  • Поставете логиката на създаването на документ в удобна функция
  • Създайте задействане в Google Suite, така че функцията да се стартира всеки път, когато се изпраща нов формуляр

Генериране на документи

След като създадох Google Формуляр и го настроих, за да съхранявам отговорите на формуляра в електронна таблица, трябва да имам Google Sheet, където имената на колоните са въпросите на формуляра.

Всеки път, когато се изпраща формуляр, се създава нов ред с отговора на потребителя.

Сега можем да отворим редактора на скриптове на листа (инструменти → редактор на скриптове) и да започнем да кодираме.

Първото нещо, което трябва да направите, е да асоциирате имената на колони с използваните заместители в шаблони и след това да изградите JSON обект с двойника заместител / стойност. Смятам, че това е важно. Разбира се, можем директно да използваме имената на формулярите като задържатели на шаблони, но ще трябва да променяме всеки шаблон всеки път, когато трябва да променим нещо във формата си.

// този обект преобразува колоната GSheet в удобни заместители, използвани в шаблоните на GDocs
var columns_placeholder_map = {
  "хронологична информация": "{{date_time}}", // заставките имат формата на {{името на заместителя}},
  „Моля, въведете името на компанията“: „{{company_name}}“,
  „Име на директора на компанията“: „{{first_name}}“,
  "Фамилно име на директора на компанията": "{{фамилия}}",
  "Цена (в $)": "{{цена}}"
  // ...
  // ...
 }

Нека напишем проста процедура, за да картографираме стойностите на ред със съответния заместител:

/ *
Връща обект, имащ ключове, като стойностите на колони_placeholder_map, а стойностите са равни на дадения ред
* /
функция transformRowInJSON (row_number) {
  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var sheet = ss.getSheets () [0];
  var cols = sheet.getLastColumn ();
  // получаваме първия ред като имена на поле на формуляр (етикет)
  var labels = sheet.getRange (1, 1, 1, cols) .getValues ​​() [0]
  
  // сега получаваме стойностите на дадения ред
  var dataRange = sheet.getRange (row_number, 1, 1, cols);
  var data = dataRange.getValues ​​();
  var row_data = данни [0];
  
  // сега имаме етикети и row_data, нека да изградим крайния JSON обект, който да се върне
  var result = {}; // това е върнатият обект
  
  за (var i = 0; i 

Сега трябва да изберем шаблона, да направим копие от него и след това да заменим заместителите с правилните стойности.

var templateId = ".......";
var docId = DriveApp.getFileById (templateId) .makeCopy (). getId ();

Идентификаторът на шаблона може да се намери, като отворите документа на шаблона и копирате / поставите неговия идентификатор от URL:

Как да изтеглите идентификатора на шаблона

Разбира се, бихме могли да имаме повече от един шаблон и можем да приложим някаква бизнес логика, за да изберем правилния в зависимост от отговора, даден чрез формата.

В този момент можем да заменим стойностите. За да направите това, можем да използваме метода substituText () на обекта body:

var doc = DocumentApp.openById (docId);
doc.setName ("foo" / * поставете изчисленото си име на крайния документ * /);
var body = doc.getBody ();
// данните са обектът, върнат от transformRowInJSON ()
за (var ключ в данните) {
  body.replaceText (ключ, данни [ключ]);
}
doc.saveAndClose (); // промийте промените

Експорт в PDF

Сега можем да запишем изчисления документ в PDF формат.

Това може да бъде полезно, ако трябва да изпратим / споделим крайния резултат с някой като клиенти или бизнес партньори.

var doc = DocumentApp.openById (docId);
var docPdf = doc.getAs ('application / pdf'). setName (doc.getName () + ".pdf");
var pdf = DriveApp.createFile (docPdf);

За да споделим документа, трябва да зададем правилните разрешения:

pdf.setSharing (DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

Изпратете резултата по имейл

Защо не изпратите PDF файла или връзката му по имейл?

Можем да поискаме имейл, на когото да попълним формуляра или да изпратим документа сами.

Да предположим, че имаме много просто имейл съдържание, можем да имаме заместител вътре в него и да заменим връзката и / или да прикачим PDF директно към имейла.

var EMAIL_CONTENT = "Създаден е нов PDF файл, моля, вижте прикачения файл или щракнете върху следната връзка {{pdf_link}}"; var var primaentEmail = "me@example.com";
var content = EMAIL_CONTENT.replace ("{{pdf_link}}", "http://drive.google.com/uc?export=download&id=" + pdf.getId ());
MailApp.sendEmail (получателEmail, „Ново генерирано PDF:“ + pdf.getName (), съдържание,
  {
    noReply: вярно,
    прикачени: [PDF]
  });

Да се ​​автоматизираме!

Трябва да напишем функция, която ще бъде входната точка на автоматизацията.

Тогава ще инструктираме GSuite да изпълнява функцията всеки път, когато се изпраща нов набор от отговори.

Функцията може да бъде нещо подобно:

функция изчисляване () {
  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var sheet = ss.getSheets () [0];
  // това е редът, който има стойностите, предоставени от потребителя
  var lastRow = sheet.getLastRow ();
  // да започнем с Магията!
  вар данни = transformRowInJSON (lastRow);
  // заредете шаблона
  // ...
  // създаване на копие на шаблона
  // ...
  // замени запълващите стойности със стойности на реда (съхранявани в обект с данни)
  // ...
  // подготвя и съхранява PDF файла
  // ...
  // изпращайте PDF по имейл
  // ...

}

За да определите спусъка:

  • От редактора на сценарии отидете на Редактиране → Текущи задействания на проекта
Отворете таблото за задействане на текущия проект
  • Кликнете върху Добавяне на спусъка
  • Изберете функцията за изпълнение
  • Изберете „От електронната таблица“ като източник на събитието
  • Изберете „При изпращане на формуляр“ като вид събитие
  • Запази

И това е.

Разбира се, има много място за подобрения като под-шаблони, генериране на таблици и така нататък, но за момента това е достатъчно за моите цели.