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

