You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

HtmlService/HtmlTemplate自动解码&问题求助

我来帮你解决这个HtmlService处理字符串转义的问题——之前用UiApp正常运行的脚本,换成HtmlService/HtmlTemplate后出现&自动转换的异常,本质是因为HtmlService的安全转义机制和UiApp的文本处理逻辑不一样,咱们一步步理清楚解决方案:

问题根源

UiApp是直接将内容作为纯文本渲染,而HtmlService默认会对HTML特殊字符(<>&"等)进行自动转义,同时会解析HTML实体。你之前手动把&替换成&amp;来适配Android格式,但在HtmlService中,这些实体又会被浏览器解析回原始字符,或者未转义的标签会被当成HTML元素处理(比如<string>标签被隐藏)。

解决方案

1. 使用HtmlService.createHtmlOutput的正确写法

需要先对完整的content内容做HTML全转义,确保所有特殊字符都被转换成HTML实体,这样浏览器才会把它们当成纯文本显示在textarea里:

// 对content进行全量HTML转义,覆盖所有特殊字符
var escapedContent = content
  .replace(/&/g, "&amp;")
  .replace(/</g, "&lt;")
  .replace(/>/g, "&gt;")
  .replace(/"/g, "&quot;");

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 &amp; 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] ?>会自动把<转成&lt;&转成&amp;,确保textarea里显示的是完整的原始字符串内容,不会丢失<string>标签,也不会把&amp;转换成&

为什么之前的写法不对?

  • 直接用HtmlOutput.append()拼接未转义的content:HtmlService会只转义部分字符,导致<string>被当成HTML标签隐藏,或者&amp;被解析回&
  • 使用<?!= ?>强制输出:这种语法会跳过转义,<string>标签会被浏览器当成HTML元素处理(不显示),同时&amp;会被解析成&,完全不符合你的需求。

内容的提问来源于stack exchange,提问作者Kevin van Mierlo

火山引擎 最新活动