Google Apps Script批量删文本异常:选Nil时无法删除指定文本
问题修复与功能实现方案
一、修复Nil选项无法删除两行文本的问题
问题根源
- 变量名错误:代码中复制文件时使用了未定义的
customerFirstName变量,实际应为personFirstName,导致脚本执行到此处静默失败(无报错但后续删除逻辑未执行)。 - 文本删除逻辑缺陷:原函数仅删除文本内容,未删除整个段落,易出现段落残留;且删除后继续查找的索引逻辑容易出错。
修复步骤
- 修正变量名错误:将
var copy = templateFile.makeCopy(customerFirstName, templateFolder);改为var copy = templateFile.makeCopy(personFirstName, templateFolder);。 - 改进
deleteTextIfFound函数,直接删除包含目标文本的整个段落(更符合信件排版需求):
function deleteTextIfFound(body, searchText) { var searchResult = body.findText(searchText); while (searchResult) { var element = searchResult.getElement(); var parent = element.getParent(); // 删除包含目标文本的段落 if (parent.getType() === DocumentApp.ElementType.PARAGRAPH) { parent.removeFromParent(); } // 删除元素后重置查找起点 searchResult = body.findText(searchText); } }
二、实现余额数值判断与填入功能
实现逻辑
- 获取表单提交的余额数值并转换为数字类型。
- 根据数值正负/零,替换模板中对应占位符,并删除无关段落。
代码添加与修改
假设表单中余额数值为第5项(itemResponses[4]),模板中对应占位符为{{POSITIVE_BALANCE}}、{{NEGATIVE_BALANCE}}、{{NIL_BALANCE}},在原代码中添加以下逻辑:
// 获取余额数值并转换为数字 var closingBalanceAmount = parseFloat(itemResponses[4].getResponse()); // 定义模板占位符 var positivePlaceholder = "{{POSITIVE_BALANCE}}"; var negativePlaceholder = "{{NEGATIVE_BALANCE}}"; var nilPlaceholder = "{{NIL_BALANCE}}"; // 根据数值判断处理 if (closingBalanceAmount > 0) { body.replaceText(positivePlaceholder, closingBalanceAmount.toFixed(2)); deleteTextIfFound(body, negativePlaceholder); deleteTextIfFound(body, nilPlaceholder); } else if (closingBalanceAmount < 0) { // 显示绝对值,避免负号格式混乱 body.replaceText(negativePlaceholder, Math.abs(closingBalanceAmount).toFixed(2)); deleteTextIfFound(body, positivePlaceholder); deleteTextIfFound(body, nilPlaceholder); } else { body.replaceText(nilPlaceholder, "余额为零"); deleteTextIfFound(body, positivePlaceholder); deleteTextIfFound(body, negativePlaceholder); }
完整修改后的代码
function autoFillGoogleDocFromForm(e) { if (!e || !e.response) { return; } var formResponse = e.response; var itemResponses = formResponse.getItemResponses(); var personFirstName = itemResponses[0].getResponse(); var personSurname = itemResponses[1].getResponse(); var date = itemResponses[2].getResponse(); var whatIsTheClosingBalance = itemResponses[3].getResponse(); // 获取余额数值(假设为第5项,索引4) var closingBalanceAmount = parseFloat(itemResponses[4].getResponse()); var templateFile = DriveApp.getFileById("FILEID"); var templateFolder = DriveApp.getFolderById("FOLDERID"); // 修正变量名错误 var copy = templateFile.makeCopy(personFirstName, templateFolder); var doc = DocumentApp.openById(copy.getId()); var body = doc.getBody(); // 替换基础信息 body.replaceText("{{FIRST NAME}}", personFirstName); body.replaceText("{{SURNAME}}", personSurname); body.replaceText("{{DATE}}", date); var searchText1 = "BODY OF TEXT 1."; var searchText2 = "BODY OF TEXT 2"; // 根据选项删除对应文本 if (whatIsTheClosingBalance == "Positive") { deleteTextIfFound(body, searchText1); } else if (whatIsTheClosingBalance == "Negative") { deleteTextIfFound(body, searchText2); } else if (whatIsTheClosingBalance == "Nil") { deleteTextIfFound(body, searchText1); deleteTextIfFound(body, searchText2); } // 处理余额数值填入 var positivePlaceholder = "{{POSITIVE_BALANCE}}"; var negativePlaceholder = "{{NEGATIVE_BALANCE}}"; var nilPlaceholder = "{{NIL_BALANCE}}"; if (closingBalanceAmount > 0) { body.replaceText(positivePlaceholder, closingBalanceAmount.toFixed(2)); deleteTextIfFound(body, negativePlaceholder); deleteTextIfFound(body, nilPlaceholder); } else if (closingBalanceAmount < 0) { body.replaceText(negativePlaceholder, Math.abs(closingBalanceAmount).toFixed(2)); deleteTextIfFound(body, positivePlaceholder); deleteTextIfFound(body, nilPlaceholder); } else { body.replaceText(nilPlaceholder, "余额为零"); deleteTextIfFound(body, positivePlaceholder); deleteTextIfFound(body, negativePlaceholder); } doc.saveAndClose(); } function deleteTextIfFound(body, searchText) { var searchResult = body.findText(searchText); while (searchResult) { var element = searchResult.getElement(); var parent = element.getParent(); // 删除包含目标文本的整个段落 if (parent.getType() === DocumentApp.ElementType.PARAGRAPH) { parent.removeFromParent(); } // 重置查找起点 searchResult = body.findText(searchText); } }
内容的提问来源于stack exchange,提问作者Ambrose Bierce
相关产品推荐
相关产品推荐

