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

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个核心问题:

  1. 数据源结构匹配错误:传入的data是包裹了对象的数组,代码直接在数组上取键值,数组本身不存在First Name这类自定义属性,取值结果永远是undefined,最终返回空字符串。
  2. 键名匹配存在空格问题:正则匹配到的完整占位符是{{First Name}},替换掉{}字符后得到的字符串是First Name(键名前后带有空格),和JSON里无前后空格的键名无法匹配。
  3. 多余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:42:09