如何用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,逐个打开文档并执行指定文本替换。以下是几个优化方向,让脚本更灵活易用:
- 动态获取数据范围
不用硬编码最后一行ID的行号,自动读取表格中最后一行数据,后续新增文档ID无需修改代码:
const firstRowID = 2; const lastRowId = sheetIDList.getLastRow(); const n = lastRowId - firstRowID + 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); });
- 添加错误处理与显式保存
避免单个文档处理出错导致整个脚本中断,同时显式保存文档确保修改生效:
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
相关产品推荐
相关产品推荐

