You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script HTML强制打印脚本段(<?!= ... ?>)传递含单引号与URL的JSON对象时出现截断问题的排查与解决

问题拆解与解决方案

为什么会出现截断?

Google Apps Script(GAS)的HTML模板引擎有个容易踩坑的特性:它会把模板里的//(哪怕是在<script>标签内的JavaScript注释)当成模板单行注释的起始标记。

回到你的代码,服务端HTML里的这行:

const closingParagraphTag = `</p>`; // '

末尾的// '触发了模板引擎的注释逻辑,它会把从//开始的所有后续内容(包括你通过<?!= data ?>输出的JSON里的//)都当成模板注释处理,直接截断//之后的内容。另外,JavaScript模板字符串里的</p>也帮了倒忙——模板引擎错误地把它解析成了真实的HTML闭合标签,打乱了代码的上下文识别,进一步加剧了截断问题。

怎么解决?

这里有三种可靠的方法,按推荐程度排序:

1. 用自动转义的<?= ?>替代<?!= ?>(最推荐)

<?= ?>会自动转义HTML特殊字符,完全避免模板引擎误解析内容,同时保证JSON完整。你甚至不用提前在服务端stringify对象:

修改后的服务端GAS代码:

function doGet() {
  const template = HtmlService.createTemplateFromFile('fileName');
  // 直接传递原始对象,不用提前JSON.stringify
  template.data = {
    "propertyWithSingleQuote": "T'Challa",
    "url": "https://stackoverflow.com/users/23479790/brodblox09"
  };
  return template.evaluate();
}

修改后的服务端HTML代码:

<!DOCTYPE html>
<html>
<head>
  <base target="_top">
</head>
<body>
<script>
  const closingParagraphTag = `</p>`; // '
  // 用<?= ?>自动转义输出,确保内容完整
  const data = <?= JSON.stringify(data) ?>;
  console.log(data);
</script>
</body>
</html>

2. 把JavaScript单行注释改成多行注释

如果一定要保留<?!= ?>,只需要把代码里的// '单行注释换成/* ' */多行注释,就能避免模板引擎把//识别成模板注释:

修改后的服务端HTML代码片段:

<script>
  const closingParagraphTag = `</p>`; /* ' */
  console.log(<?!= data ?>);
</script>

3. 手动转义JSON中的特殊字符(不推荐)

如果坚持要用<?!= ?>,可以在服务端对JSON里的//进行转义,但这种方法容易遗漏其他特殊字符,仅作备选:

template.data = JSON.stringify(yourObject).replace(/\/\//g, "\\/\\/");

用以上任意一种方法,你都能确保传递到客户端的JSON完整无截断,前端JavaScript可以正常使用这些数据。

内容的提问来源于stack exchange,提问作者BrodBlox09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 10:44:08