Skip to content

Instantly share code, notes, and snippets.

@kell18
Created November 24, 2021 17:14
Show Gist options
  • Save kell18/c920044f5754bd2c39fe4d455abb6f7a to your computer and use it in GitHub Desktop.
Save kell18/c920044f5754bd2c39fe4d455abb6f7a to your computer and use it in GitHub Desktop.
/**
* При событии formSubmit берёт шаблон документа и заменяет все переменные (строки между << и >>) на то что
* пришло с формы и ложит это в папку с названием МЕСЯЦ.ГОД (если не существует то создаёт новую папку)
* @param formSubmitE документация https://developers.google.com/apps-script/guides/triggers/events#form-submit
*/
function autoFillDocFromForm(formSubmitE) {
const patternOpenSymbols = '<<';
const patternCloseSymbols = '>>';
const arraySplitSymbol = ", "; // Некоторые поляи на формах имеют множественный выбор, склеиваем их в одну строку через этот символ
const timestamp = new Date();
const templateId = '17KRTlHAbs6qJz1lZovwfyQICmih2e8pmp55wprHzl7c';
const destParentFolderId = '1xWSHjpjiUBxCabK2SGtnHrlEGO3Kx0AF';
const templateFile = DriveApp.getFileById(templateId);
const destParentFolder = DriveApp.getFolderById(destParentFolderId);
// Создаём (или находим) папку по названию месяца чтобы потом туда генерировать документы
const destFolderName = (timestamp.getMonth() + 1) + "." + timestamp.getFullYear();
const destFolderItr = destParentFolder.getFoldersByName(destFolderName);
var destFolder = undefined;
if (destFolderItr.hasNext()) {
destFolder = destFolderItr.next();
} else {
destFolder = destParentFolder.createFolder(destFolderName);
}
// Генерируем имя документа
const fileNameFieldName = 'ФИО (полностью)'; // Поле с формы которое будет использованно как основная часть имени файла
const fileNamePrefix = formSubmitE.namedValues[fileNameFieldName];
const fileNameSuffix = formSubmitE.range ? formSubmitE.range.rowStart : ""; // "Запасная" часть - порядковый номер отправленной формы, чтобы имена в папке были уникальными
var fileName = undefined;
if (fileNamePrefix != undefined) {
fileName = formSubmitE.namedValues[fileNameFieldName].join(arraySplitSymbol) + " " + fileNameSuffix;
} else {
throw new Error(`Не могу найти поле ${fileNameFieldName} на форме, убедитесь что имя совпадает`)
}
var copy = templateFile.makeCopy(fileName, destFolder);
var copyDoc = DocumentApp.openById(copy.getId());
var body = copyDoc.getBody();
// Заменяем все пришедшие значения полей с формы на их значений (вместо <<ПОЛЕ>>)
for (const [key, values] of Object.entries(formSubmitE.namedValues)) {
const keyStr = escapeRegExp(patternOpenSymbols + key + patternCloseSymbols);
const valStr = values.join(arraySplitSymbol);
Logger.log(`Заменяем ${keyStr}: ${valStr}`);
const res = body.replaceText(keyStr, valStr);
Logger.log(`Результат замены: ${res}`)
}
// Удостоверимся что на форме не осталось незаменённых полей <<ПОЛЕ>>
const leftMarks = body.findText('<<.+>>');
if (leftMarks != undefined) {
Logger.log("Некоторые отметки в документе оставлены незаполненными (будут заменены пустой строкой): ", leftMarks);
body.replaceText('<<.+>>', '');
}
copyDoc.saveAndClose();
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment