Created
November 24, 2021 17:14
-
-
Save kell18/c920044f5754bd2c39fe4d455abb6f7a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* При событии 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