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

如何用Google Sheets Apps Script循环执行replaceText批量替换Docs模板字段?

自动读取Google Sheet合并域批量替换Google Docs内容

我用Google Docs制作了录用信模板,将合并域设置为{{FirstName}}、{{StartDate}}这类格式。同时配套了Google Sheet和Google Form,其中名为Fields的工作表中,D列存储合并域,E列对应替换值。

目前我只能逐行编写replaceText代码来替换字段,每次新增合并域都需要修改代码。之前尝试过Stack Overflow上的循环方案,但始终无法正常运行。希望编写一段Apps Script,自动读取Sheet中的所有合并域并完成替换操作。

原代码如下:

const sheet = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName('Form')
  
    //Copy template documents in our destinationFolder
    const copy = googleDocTemplate.makeCopy(sheet.getRange('Fields!E3').getValues()+' '+sheet.getRange('Fields!E4').getValues()+` - Offer Letter` , destinationFolder)
    
    //Once we have the copy, we then open it using the DocumentApp
    const doc = DocumentApp.openById(copy.getId())
    
    //Create constants for the Google Doc Body and Header so we can use replaceText
    const body = doc.getBody();
    const docHeader = doc.getHeader().getParent();

    //Replace text in Headers of Google Doc
    docHeader.replaceText(sheet.getRange('Fields!D3').getValues(), sheet.getRange('Fields!E3').getValues()); //First Name
    docHeader.replaceText(sheet.getRange('Fields!D4').getValues(), sheet.getRange('Fields!E4').getValues()); //Last Name

//Replace body text
    body.replaceText(sheet.getRange('Fields!D2').getValues(), sheet.getRange('Fields!E2').getValues());
    body.replaceText(sheet.getRange('Fields!D3').getValues(), sheet.getRange('Fields!E3').getValues());
    body.replaceText(sheet.getRange('Fields!D4').getValues(), sheet.getRange('Fields!E4').getValues());
    body.replaceText(sheet.getRange('Fields!D5').getValues(), sheet.getRange('Fields!E5').getValues());
    body.replaceText(sheet.getRange('Fields!D6').getValues(), sheet.getRange('Fields!E6').getValues());
    body.replaceText(sheet.getRange('Fields!D7').getValues(), sheet.getRange('Fields!E7').getValues());
    body.replaceText(sheet.getRange('Fields!D8').getValues(), sheet.getRange('Fields!E8').getValues());

优化后的代码

以下代码会自动读取Fields工作表中所有非空的合并域与对应值,通过循环完成正文和页眉的替换,新增字段无需修改代码:

// 获取Fields工作表实例
const fieldsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Fields');
// 一次性读取D、E列所有有效数据(假设第1行是表头,从第2行开始读取)
const fieldData = fieldsSheet.getRange(2, 4, fieldsSheet.getLastRow() - 1, 2).getValues();

// 复制模板文档,用姓名生成文件名
const firstName = fieldData.find(row => row[0] === '{{FirstName}}')[1];
const lastName = fieldData.find(row => row[0] === '{{LastName}}')[1];
const copy = googleDocTemplate.makeCopy(`${firstName} ${lastName} - Offer Letter`, destinationFolder);

// 打开复制后的文档
const doc = DocumentApp.openById(copy.getId());
const body = doc.getBody();
const docHeader = doc.getHeader().getParent();

// 遍历所有合并域,完成替换
fieldData.forEach(row => {
  const placeholder = row[0];
  const replacement = row[1];
  
  // 跳过空的合并域或替换值
  if (!placeholder || !replacement) return;
  
  // 替换正文和页眉中的内容
  body.replaceText(placeholder, replacement);
  docHeader.replaceText(placeholder, replacement);
});

// 保存并关闭文档,确保修改生效
doc.saveAndClose();

代码说明

  • 一次性读取所有有效数据,避免多次调用getRange降低脚本效率
  • 通过find方法定位姓名生成文档名,无需硬编码单元格位置
  • 自动遍历所有合并域,空行自动跳过,新增字段无需调整代码
  • 最后调用saveAndClose()确保所有替换操作被保存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:50:38