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

如何用Google Apps Script批量替换多份文档中的文本

批量替换多份Google文档指定文本的实现方案

我有多份作为模板的Google文档,复用这些文档时需要逐个编辑替换指定文本。目前已经用Google Apps Script实现了单份文档内多段文本的替换,现在想通过Google表格中的文档ID列表,批量替换多份文档中的多段文本。以下是我编写的脚本:

function replaceText() {
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheetIDList = spreadsheet.getSheetByName('RENAME');
 const colId = 4;
 const firstRowID = 2;
 const lastRowId = 17;
 const n = lastRowId - firstRowID;
 let startRow = firstRowID     // Baris awal data DOC ID

 var values = sheetIDList.getRange(startRow, colId, n).getDisplayValues();

 values.forEach(([docId]) => {
    if (!docId) return;
    var doc = DocumentApp.openById(docId);
    var body = doc.getBody();

 body.replaceText("Kepala SMK Negeri 7 Semarang", "Kepala SMK Negeri 3 Jepara");
 body.replaceText("SMK Negeri 7 Semarang", "SMK Negeri 3 Jepara");
 body.replaceText("Haris Wahyudi, S.Pd., M.Pd.", "SUSWANTO DJONY PURNAWAN, S.Pd., M.Pd");
 body.replaceText("19751222 200003 1 002", "19700531 200401 1 001");
 body.replaceText("Pembina Tk. I", "Pembina");
 body.replaceText("SEKOLAH MENENGAH KEJURUAN NEGERI 7 SEMARANG", "SEKOLAH MENENGAH KEJURUAN NEGERI 3 JEPARA");
          
  });
}

脚本说明与优化建议

你的脚本已经实现了核心批量替换逻辑:读取表格RENAME工作表第4列、第2-17行的文档ID,逐个打开文档并执行指定文本替换。以下是几个优化方向,让脚本更灵活易用:

  1. 动态获取数据范围
    不用硬编码最后一行ID的行号,自动读取表格中最后一行数据,后续新增文档ID无需修改代码:
const firstRowID = 2;
const lastRowId = sheetIDList.getLastRow();
const n = lastRowId - firstRowID + 1; // 修正行数计算,确保包含所有数据行
  1. 抽离替换规则为配置数组
    把替换文本对整理成数组,后续修改或新增替换规则只需调整数组,不用重复修改replaceText调用:
// 定义替换规则数组
const replacePairs = [
  ["Kepala SMK Negeri 7 Semarang", "Kepala SMK Negeri 3 Jepara"],
  ["SMK Negeri 7 Semarang", "SMK Negeri 3 Jepara"],
  ["Haris Wahyudi, S.Pd., M.Pd.", "SUSWANTO DJONY PURNAWAN, S.Pd., M.Pd"],
  ["19751222 200003 1 002", "19700531 200401 1 001"],
  ["Pembina Tk. I", "Pembina"],
  ["SEKOLAH MENENGAH KEJURUAN NEGERI 7 SEMARANG", "SEKOLAH MENENGAH KEJURUAN NEGERI 3 JEPARA"]
];

// 循环执行替换
replacePairs.forEach(([oldText, newText]) => {
  body.replaceText(oldText, newText);
});
  1. 添加错误处理与显式保存
    避免单个文档处理出错导致整个脚本中断,同时显式保存文档确保修改生效:
values.forEach(([docId]) => {
  if (!docId) return;
  try {
    const doc = DocumentApp.openById(docId);
    const body = doc.getBody();
    
    // 执行替换逻辑
    replacePairs.forEach(([oldText, newText]) => {
      body.replaceText(oldText, newText);
    });
    
    doc.saveAndClose(); // 显式保存并关闭文档
  } catch (error) {
    console.error(`处理文档ID ${docId} 失败:${error.message}`);
  }
});

优化后的完整脚本

function batchReplaceText() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheetIDList = spreadsheet.getSheetByName('RENAME');
  const colId = 4;
  const firstRowID = 2;
  const lastRowId = sheetIDList.getLastRow();
  const n = lastRowId - firstRowID + 1;

  // 替换规则配置
  const replacePairs = [
    ["Kepala SMK Negeri 7 Semarang", "Kepala SMK Negeri 3 Jepara"],
    ["SMK Negeri 7 Semarang", "SMK Negeri 3 Jepara"],
    ["Haris Wahyudi, S.Pd., M.Pd.", "SUSWANTO DJONY PURNAWAN, S.Pd., M.Pd"],
    ["19751222 200003 1 002", "19700531 200401 1 001"],
    ["Pembina Tk. I", "Pembina"],
    ["SEKOLAH MENENGAH KEJURUAN NEGERI 7 SEMARANG", "SEKOLAH MENENGAH KEJURUAN NEGERI 3 JEPARA"]
  ];

  const values = sheetIDList.getRange(firstRowID, colId, n).getDisplayValues();

  values.forEach(([docId]) => {
    if (!docId) return;
    try {
      const doc = DocumentApp.openById(docId);
      const body = doc.getBody();

      replacePairs.forEach(([oldText, newText]) => {
        body.replaceText(oldText, newText);
      });

      doc.saveAndClose();
      console.log(`文档ID ${docId} 替换完成`);
    } catch (error) {
      console.error(`处理文档ID ${docId} 失败:${error.message}`);
    }
  });
}

内容的提问来源于stack exchange,提问作者PSAB Plalangan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:50