Очень часто возникает необходимость создавать однотипные документы, в которых изменяются только данные контрагентов: договора, доверенности, коммерческие предложения и т.д.
Совершенно логичное решение в подобной ситуации:
Сама идея определения места вставки и последующей вставки на это место нужного значения заключается в создании на листе 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 с журналом учёта созданных документов.