使用 Google Apps 脚本,我创建了一个系统,该系统根据 Google 表中输入的数据创建 Google 文档和 PDF 文档。我需要这样做,以便在创建 PDF 文档后,将其通过链接发送到 webhook。我通过“UrlFetchApp.fetch”方法实现了这一点,但是当我将数据输入表并运行脚本时,此方法没有任何作用,甚至不想创建文档。我尝试了所有可能的方法,但没有任何效果,请帮忙。
function onEdit(e) {
if (!e) {
Logger.log("Script run manually or event object missing.");
return;
}
const sheet = e.source.getActiveSheet();
if (sheet.getName() !== 'Заключение') return;
const row = e.range.getRow();
const column = e.range.getColumn();
if (row === 1 || column < 1 || column > 13) return;
const rowData = sheet.getRange(row, 1, 1, 13).getValues()[0];
if (sheet.getRange(row, 14).getValue()) return;
const googleDocTemplate = DriveApp.getFileById('1mlrBqdDpziTCT3JbSbX-RdvGjwyt4Me4TYR4FkVAFTQ');
const destinationFolder = DriveApp.getFolderById('1cdzw03Zt1BtPEXLWFUWsir1YEylkpgNd');
// Создание копии документа
const copy = googleDocTemplate.makeCopy(`Заключение ${rowData[3]} ${rowData[4]} ${rowData[5]}`, destinationFolder);
const doc = DocumentApp.openById(copy.getId());
const body = doc.getBody();
const formattedDate = Utilities.formatDate(new Date(rowData[2]), Session.getScriptTimeZone(), 'dd.MM.yyyy');
// Замена текста шаблона
body.replaceText("{{stuff_id}}", rowData[0]);
body.replaceText("{{lead_id}}", rowData[1]);
body.replaceText("{{currentdate}}", formattedDate);
body.replaceText("{{Surname}}", rowData[3]);
body.replaceText("{{Name}}", rowData[4]);
body.replaceText("{{Patronymic}}", rowData[5]);
body.replaceText("{{debtamount}}", rowData[6]);
body.replaceText("{{contract}}", rowData[7]);
body.replaceText("{{loan}}", rowData[8]);
body.replaceText("{{paymentsize}}", rowData[9]);
// Обработка ключевых слов и замена их на соответствующие тексты
const imvoKeywords = {
"Авто (не сохр)": "Имеющийся у вас в собственности автомобиль, на который уже наложены обеспечительные меры или залог будет реализован в любом случае: вы ограничены в праве сделать это самостоятельно." + "\n",
"ЮЛ (ООО и пр.)": "Юридические лица, а так же доля в них являются имуществом. Даже если предприятие 'пустое' или убыточное, оно подлежит оценке и последующей реализации." + "\n",
"Доп жильё": "Объекты недвижимости, не являющиеся единственным жильём, о которых вы сообщили в ходе консультации будут подлежать реализации. К сожалению, Закон предоставляет право сохранить только один объект недвижимости." + "\n",
"Комм помещение": "Нежилые помещения, в т.ч. коммерческие помещения так же подлежат реализации - вне зависимости от их фактического состояния. К таким помещениям относятся офисные помещения, магазины, ларьки, гаражи и иные нежилые помещения." + "\n",
"Спецтехника": "Вообще, любое имущество, которое подлежит обязательной государственной регистрации (специальная техника, суда, оружие и пр.) будет реализовано в процедуре банкротства. Поскольку такое имущество стоит на государственном учёте - на него могут быть наложены обеспечительные меры, а значит оно может быть реализовано в ходе процесса взыскания задолженности." + "\n"
};
const imvoSohr = {
"Ед жильё": "Единственное жильё, в соответствии с действующим Законодательством, не подлежит реализации в ходе процедуры банкротства физического лица. Оно будет исключено из конкурсной массы и не будет подлежать реализации." + "\n",
"Авто (сохр)": "Порядок действий по поводу автомобиля с отсутствующими обеспечительными мерами вам сообщит ваш персональный юрист в ходе начала работы." + "\n"
}
const deals = {
"Продажа (риск)": "Осуществленная вами сделка по отчуждению имущества имеет признаки оспаривания, однако, мы подготовим и заявим в Суд правовую позицию, подтверждающую законность сделки. Иные сделки (в случае их наличия и документального подтверждения) не имеют признаков оспаривания." + "\n",
"Продажа (не риск)": "Совершенные вами сделки не имеют признаков оспаривания, а значит ваша процедура не будет затянутой по причине рассмотрения обособленных споров." + "\n",
"Дарение": "Сделки дарения, осуществленные в 3-х летний срок оспариваются в обязательном порядке. Таким образом, осуществленная вами сделка дарения будет оспорена в рамках процедуры банкротства: имущество или право требования на него будет реализовано в ходе процедуры банкротства." + "\n"
}
const imvoValue = rowData[10]; // Значение из столбца 'imvo(real)'
const imvosohrValue = rowData[11]; // Значение из столбца 'imvo(save)'
const dealsValue = rowData[12]; // Значение из столбца 'deals'
const keywordsArray = imvoValue.split(", ").map(word => word.trim());
const keywordsSohrArray = imvosohrValue.split(", ").map(word => word.trim());
const keywordsDealsArray = dealsValue.split(", ").map(word => word.trim());
// Функция для замены текста по ключевым словам, с удалением переменной, если слово не указано
function replaceKeywords(keywordsArray, keywordDict, prefix, totalCount) {
for (let i = 1; i <= totalCount; i++) {
const variableName = `{{${prefix}_${i}}}`;
const keyword = keywordsArray[i - 1]; // Получаем ключевое слово (если оно есть)
if (keyword && keywordDict[keyword]) {
body.replaceText(variableName, keywordDict[keyword]); // Заменяем переменную на текст
} else {
body.replaceText(variableName, "-"); // Удаляем переменную, если ключевое слово отсутствует
const paragraphs = body.getParagraphs();
paragraphs.forEach(paragraph => {
if (paragraph.getText().trim() === "-") {
paragraph.removeFromParent(); // Удаляем абзац, если он пустой
}
});
}
}
}
// Определяем общее количество переменных для каждой категории
const totalImvoCount = 5;
const totalSohrCount = 2;
const totalDealsCount = 3;
// Заменяем ключевые слова для IMVO, SOHR и DEALS
replaceKeywords(keywordsArray, imvoKeywords, 'imvo', totalImvoCount);
replaceKeywords(keywordsSohrArray, imvoSohr, 'imvoSohr', totalSohrCount);
replaceKeywords(keywordsDealsArray, deals, 'deals', totalDealsCount);
// Дополнительный текст
let includeAdditionalText = keywordsArray.some(keyword => imvoKeywords[keyword]);
const imvoReplace = "На указанные выше объекты имущества в любом случае будут наложены обеспечительные меры, из-за которых реализовать или сохранить имущество самостоятельно не представляется возможным. Либо указанные объекты будут изъяты и реализованы с торгов ФССП, либо, в случае если объекты находятся в залоге - будут переданы залоговому кредитору. Поскольку суммарная стоимость вашего имущества не покрывает общую сумму долга, то в этом случае имеет смысл реализовать имущество в ходе процедуры банкротства. Как правило, такие торги наступают и проходят быстрее, чем долги у приставов. От выполнения обязательств на оставшуюся сумму вас освободит Суд. В случае, если имущество реализуется на торгах ФССП - оставшаяся сумма долга подлежит дальнейшему взысканию." + "\n";
if (includeAdditionalText) {
body.replaceText("{{imvo_replace}}", imvoReplace);
} else {
body.replaceText("{{imvo_replace}}", "-"); // Удаляем переменную, если ключевое слово отсутствует
const paragraphs = body.getParagraphs();
paragraphs.forEach(paragraph => {
if (paragraph.getText().trim() === "-") {
paragraph.removeFromParent(); // Удаляем абзац, если он пустой
}
});
}
// Сохранение документа
doc.saveAndClose();
// Небольшая задержка
Utilities.sleep(500);
// Создание PDF
const pdfBlob = DriveApp.getFileById(copy.getId()).getAs('application/pdf');
const pdfFile = destinationFolder.createFile(pdfBlob);
pdfFile.setName(`Заключение ${rowData[3]} ${rowData[4]} ${rowData[5]}.pdf`);
// Сохранение ссылок на документ и PDF в ячейках
const docUrl = doc.getUrl();
const pdfUrl = pdfFile.getUrl();
sheet.getRange(row, 14).setValue(docUrl); // Ссылка на Google Документ в 14-й столбец
sheet.getRange(row, 15).setValue(pdfUrl); // Ссылка на PDF в 15-й столбец
Logger.log("Document and PDF created successfully: " + pdfUrl);
const webhookUrl = 'https://webhook.site/cef34a00-844b-4f51-8c72-dae4bcf79239';
// Создание JSON-объекта с ссылкой на PDF
const payload = {
'pdfUrl': pdfBlob,
'message': "PDF created successfully"
};
const jsonpdf = JSON.stringify(payload);
// Параметры для запроса
const options = {
'method': 'post',
'contentType': 'application/json', // Устанавливаем тип контента как JSON
'payload': jsonpdf // Преобразуем объект в строку JSON
};
const response = UrlFetchApp.fetch(webhookUrl, options);
Logger.log(response.getContentText());
}
Blob
包含完整文件。改为发送网址 payload
:
const payload = {
'pdfUrl': pdfUrl/*removed pdfBlob*/,
'message': "PDF created successfully"
};