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
相关产品推荐
相关产品推荐

