如何用AppScript替换文档标签为其他文档内容?tagText返回异常求助
问题:模板标签替换时无法正确获取标签文本内容
我开发了一个应用,可根据特定条件从多个模板文档生成新文档。但模板中存在大量重复文本块,修改时需逐一更新,效率低下。因此我计划用以@@开头的标签标记这些重复块,遇到标签时将其替换为对应名称文档的内容。例如遇到@@HELPFUL_LINKS标签时,替换为同名文件的内容。
我编写了如下代码:
// Find any '@@' tags and replace them with the correct block of text var blkTag = null; while(blkTag = cell.findText(TAG_INDICATING_INSERTION), blkTag) { var startTag = blkTag.getStartOffset(); var endTag = blkTag.getElement(); var tagText = blkTag.getElement().asText(); console.log(`Tag found is ${tagText}`); var newTextFileId = getFileByName_(PROJECT_FOLDER_NAME, tagText); if(newTextFileId != null) { var tagDoc = DocumentApp.openById(newTextFileId); var tagContentText = tagDoc.getBody().getText(); tagText.deleteText(startTag, endTag); tagText.insertText(start, tagContentText); } }
运行时发现,当识别到@@HELPFUL_LINKS标签时,预期tagText为该标签文本,实际却返回Text。
问题原因
你直接打印的tagText是Google Apps Script中的Text对象实例,而非字符串内容。当你将Text对象直接拼接进字符串时,JavaScript会输出它的类型名称Text,而不是标签的实际文本。此外代码还存在两个变量错误:
endTag被错误赋值为元素对象,而非标签文本的结束偏移量- 插入文本时使用了未定义的
start变量
修复方案
修改代码以正确提取标签文本内容,并修正变量错误:
const TAG_INDICATING_INSERTION = '@@'; // Find any '@@' tags and replace them with the correct block of text var blkTag = null; while((blkTag = cell.findText(TAG_INDICATING_INSERTION)), blkTag) { const startOffset = blkTag.getStartOffset(); const endOffset = blkTag.getEndOffsetInclusive(); const textElement = blkTag.getElement().asText(); // 提取标签的完整文本内容 const tagText = textElement.getText().substring(startOffset, endOffset + 1); console.log(`Tag found is ${tagText}`); var newTextFileId = getFileByName_(PROJECT_FOLDER_NAME, tagText); if(newTextFileId != null) { var tagDoc = DocumentApp.openById(newTextFileId); var tagContentText = tagDoc.getBody().getText(); // 删除原标签文本 textElement.deleteText(startOffset, endOffset); // 在原位置插入新内容 textElement.insertText(startOffset, tagContentText); // 重置查找上下文,避免重复处理当前标签 cell = textElement.getParent(); } }
关键修复点
- 获取真实标签文本:通过
textElement.getText().substring(startOffset, endOffset + 1)截取findText匹配到的具体文本内容 - 修正变量错误:将
endTag改为正确的结束偏移量endOffset,插入文本时使用定义好的startOffset变量 - 避免循环死锁:替换内容后将
cell重置为当前元素的父容器,确保下一次查找从新内容之后开始,不会重复匹配已处理的标签
内容的提问来源于stack exchange,提问作者Tom Sauder
相关产品推荐
相关产品推荐

