Google Apps Script替换{{}}占位符为JSON数据失效问题
问题描述
基于Google Apps Script实现模板替换功能:将模板字符串中被{{}}包裹的占位符,替换为JSON文件内同名字段对应的数值。
- 预期效果:
Hello my name is {{First Name}} {{Last Name}}.替换后输出Hello my name is Sherlock Holmes. - 对应JSON数据源结构:
[ { "First Name": "Sherlock", "Last Name": "Holmes" } ]
原有代码与故障表现
初始实现代码如下,入参template为模板字符串,data为传入的JSON数据:
function fillInTemplateFromObject(template, data) { let template_string = template; // Token replacement template_string = template_string.replace(/{{[^{}]+}}/g, key => { return escapeData_(data[key.replace(/[{}]+/g, "")] || ""); }); return JSON.parse(template_string); } function escapeData_(str) { return str .replace(/[\\]/g, '\\\\') .replace(/[\"]/g, '\\\"') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t'); };
运行后未正确替换占位符内容,仅移除了花括号,实际输出为:Hello my name is .
故障原因
代码存在3个核心问题:
- 数据源结构匹配错误:传入的
data是包裹了对象的数组,代码直接在数组上取键值,数组本身不存在First Name这类自定义属性,取值结果永远是undefined,最终返回空字符串。 - 键名匹配存在空格问题:正则匹配到的完整占位符是
{{First Name}},替换掉{}字符后得到的字符串是First Name(键名前后带有空格),和JSON里无前后空格的键名无法匹配。 - 多余的JSON解析逻辑:替换完成的结果是普通文本字符串,不是合法JSON格式,调用
JSON.parse()本身就会抛出语法错误,属于完全多余的逻辑。
修复方案
修正后的可运行代码如下:
function fillInTemplateFromObject(template, data) { let template_string = template; // 适配数组格式的数据源,取数组第一个元素为实际取值对象 const sourceData = Array.isArray(data) ? data[0] : data; // 占位符替换 template_string = template_string.replace(/{{([^{}]+)}}/g, (match, content) => { // 去除占位符内容前后的空格,避免多余空格导致匹配失败 const key = content.trim(); return escapeData_(sourceData[key] ?? ""); }); // 直接返回替换后的字符串,无需JSON解析 return template_string; } function escapeData_(str) { // 先强转为字符串,避免传入数字、布尔值等非字符串类型时报错 return String(str) .replace(/[\\]/g, '\\\\') .replace(/[\"]/g, '\\\"') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t'); }
修复点说明
- 增加数组类型判断:传入数据是数组时自动取第一个元素作为取值源,兼容给出的JSON结构。
- 优化正则匹配逻辑:用捕获组直接提取
{{}}内部的内容,对提取到的键名做首尾去空格处理,解决空格导致的键名不匹配问题。 - 移除多余的
JSON.parse()调用,替换完成后直接返回文本结果。 - 转义函数增加字符串强转逻辑,兼容非字符串类型的字段值,避免调用替换方法时报错。
- 用空值合并运算符
??替代||,避免字段值为0、false这类假值时被错误替换为空字符串。
内容的提问来源于stack exchange,提问作者user19455700
相关产品推荐
相关产品推荐

