Очень часто возникает необходимость создавать однотипные документы, в которых изменяются только данные контрагентов: договора, доверенности, коммерческие предложения и т.д.
Совершенно логичное решение в подобной ситуации:
Сама идея определения места вставки и последующей вставки на это место нужного значения заключается в создании на листе Google Doc уникального набора символов, который можно было бы однозначно идентифицировать и заменить с помощью метода замены текста replaceText:
body.replaceText("{unique label}", "klient data");
Начнём с таблицы. В нашем примере мы сделали три "информационных столбца": имя клиента, номер ID, дата издания ID. Чтобы облегчить редактирование шаблона имена столбцов мы назовем их также, как и имена меток в Google Docs. И, поскольку это - метки (места вставок), то сразу определим для себя, что метки мы всегда будем заключать в фигурные скобки.
Помимо информационных столбцов здесь также находятся "вспомогательные столбцы", с помощью которых реализован интерфейс нашей программы: КТО выдаёт (кто заключает договор), КОМУ выдаёт (с кем заключает договор) и какой ШАБЛОН документа при этом используется.
В качестве шаблона документа, к которому обращается скрипт, был использован следующий вариант доверенности.
Для того, чтобы различить метки доверителя и поверенного, к меткам доверителя был добавлен элемент текста - [principal_], а к меткам поверенного - [attorney_].
Скрипт, представленный ниже, реализует следующие задачи:
function DocGenerator() {
var sc = SpreadsheetApp.getActiveSheet();
//find clients info
var principalIndex = getClientIndx(1);
var attorneyIndex = getClientIndx(2);
var principal = getClientData(principalIndex);
var attorney = getClientData(attorneyIndex);
// find template
var docName = sc.getRange(principalIndex, 3).getValue();
var docID = getTemlateID(docName);
var docNameCopy = docName + "_" + 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('{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 getClientIndx(col) {
var sc = SpreadsheetApp.getActiveSheet();
var iMax = sc.getLastRow();
var found = false;
for(var i=2; i <= iMax; i++) {
if(sc.getRange(i, col).getValue() == true) {
found = true;
break;
}
}
if(found == true) {
return i;
} else {
Browser.msgBox("Please select at least one client!")
}
}
function getClientData(indx) {
var sc = SpreadsheetApp.getActiveSheet();
var client = {
name: sc.getRange(indx, 4).getValue(),
id: sc.getRange(indx, 5).getValue(),
id_dateOfIssue: sc.getRange(indx, 6).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;
}
}
}
Более подробные объяснения о работе скрипта Вы сможете получить, ознакомившись с данным видео:
Продолжнение смотрите в статье:
Генератор документов Google Apps Script с журналом учёта созданных документов.