HtmlService/HtmlTemplate自动解码&问题求助
我来帮你解决这个HtmlService处理字符串转义的问题——之前用UiApp正常运行的脚本,换成HtmlService/HtmlTemplate后出现&自动转换的异常,本质是因为HtmlService的安全转义机制和UiApp的文本处理逻辑不一样,咱们一步步理清楚解决方案:
问题根源
UiApp是直接将内容作为纯文本渲染,而HtmlService默认会对HTML特殊字符(<、>、&、"等)进行自动转义,同时会解析HTML实体。你之前手动把&替换成&来适配Android格式,但在HtmlService中,这些实体又会被浏览器解析回原始字符,或者未转义的标签会被当成HTML元素处理(比如<string>标签被隐藏)。
解决方案
1. 使用HtmlService.createHtmlOutput的正确写法
需要先对完整的content内容做HTML全转义,确保所有特殊字符都被转换成HTML实体,这样浏览器才会把它们当成纯文本显示在textarea里:
// 对content进行全量HTML转义,覆盖所有特殊字符 var escapedContent = content .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); var htmlOutput = HtmlService.createHtmlOutput() .setWidth(800) .setHeight(600); htmlOutput.append(`<textarea style="width: 100%; height: 100px;" id="${id}">${escapedContent}</textarea>`);
这样处理后,textarea里会正确显示你需要的Android格式字符串,比如<string name="terms">Terms & Privacy</string>。
2. 使用HtmlTemplate的正确写法
不要手动拼接模板字符串,而是把数据传递给模板,用自动转义的<?= ?>语法渲染内容——它会自动处理所有HTML特殊字符转义,避免标签被解析、实体被转换:
// 定义模板内容(推荐单独存为HTML文件,这里用字符串示例) var templateHtml = ` <? for(let i = 0; i < texts.length; i++) { ?> <textarea style="width: 100%; height: 100px;" id="export_<?= i ?>"> <?= texts[i] ?> </textarea> <? } ?> `; // 创建模板并传入数据 var template = HtmlService.createTemplate(templateHtml); template.texts = texts; // 把你的字符串数组传递给模板 // 渲染输出 var htmlOutput = template.evaluate().setWidth(800).setHeight(600);
这种方式下,<?= texts[i] ?>会自动把<转成<、&转成&,确保textarea里显示的是完整的原始字符串内容,不会丢失<string>标签,也不会把&转换成&。
为什么之前的写法不对?
- 直接用
HtmlOutput.append()拼接未转义的content:HtmlService会只转义部分字符,导致<string>被当成HTML标签隐藏,或者&被解析回&。 - 使用
<?!= ?>强制输出:这种语法会跳过转义,<string>标签会被浏览器当成HTML元素处理(不显示),同时&会被解析成&,完全不符合你的需求。
内容的提问来源于stack exchange,提问作者Kevin van Mierlo




