Google Sheet编辑触发:更新Google Doc模板并保存至Drive指定文件夹
实现Google Sheet编辑触发Google Doc模板更新的解决方案
核心功能说明
当指定Google Sheet的内容被编辑时,自动提取该行22列完整数据,复制预设的Google Doc模板并替换占位符,以指定变量+当前日期作为文件名,保存到Drive指定文件夹中。
完整代码整合
以下代码包含补全后的现有函数,以及新增的编辑触发处理逻辑:
// 返回HTML模板(原函数补全) function doGet() { return HtmlService.createHtmlOutputFromFile('WebAppBoot'); } // 更新Sheet记录(原函数补全) function UpdateRecord(seq_id, name, personId, curr_degree, up_curr_court) { const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的数据表名"); // 替换为实际工作表名称 dataSheet.getRange(seq_id+1, 2).setValue(name); dataSheet.getRange(seq_id+1, 3).setNumberFormat('@STRING@').setValue(personId); dataSheet.getRange(seq_id+1, 4).setValue(curr_degree); dataSheet.getRange(seq_id+1, 5).setValue(up_curr_court); // 可继续扩展为22列的赋值逻辑 } // 搜索记录(原函数补全) function searchRecords(personId, password) { const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("你的数据表名"); const lastRow = dataSheet.getLastRow(); let returnRows = []; // 可补充密码验证逻辑,此处保留原变量定义 let passcode = 0; if (personId === '') { return returnRows; } const readIds = dataSheet.getRange("C2:C" + lastRow).getValues(); for (let i = 0; i < readIds.length; i++) { if (readIds[i][0] === personId) { // 获取匹配行的22列完整数据 const rowData = dataSheet.getRange(i+2, 1, 1, 22).getValues()[0]; returnRows.push(rowData); } } return returnRows; } // 编辑触发的Doc更新核心函数(需绑定可安装触发器) function onEditHandler(e) { // 仅处理指定工作表的编辑事件 const targetSheetName = "你的数据表名"; if (e.source.getSheetName() !== targetSheetName) return; const editedRow = e.range.getRow(); // 跳过表头行(假设表头在第1行) if (editedRow <= 1) return; // 获取编辑行的22列完整数据 const dataSheet = e.source.getSheetByName(targetSheetName); const rowData = dataSheet.getRange(editedRow, 1, 1, 22).getValues()[0]; // 提取文件名变量(示例用第3列的personId,可根据需求替换) const fileNameVar = rowData[2]; // 生成日期格式:YYYY-MM-DD const currentDate = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd"); const newFileName = `${fileNameVar}_${currentDate}`; // 配置模板和目标文件夹ID(替换为实际ID) const templateDocId = "你的Google Doc模板ID"; const targetFolderId = "你的Drive目标文件夹ID"; try { // 复制模板到目标文件夹 const templateDoc = DriveApp.getFileById(templateDocId); const newDoc = templateDoc.makeCopy(newFileName, DriveApp.getFolderById(targetFolderId)); // 替换Doc模板中的占位符 const docBody = DocumentApp.openById(newDoc.getId()).getBody(); // 根据22列数据对应替换,示例如下: docBody.replaceText("{{姓名}}", rowData[1]); // 对应Sheet第2列 docBody.replaceText("{{身份证号}}", rowData[2]); // 对应Sheet第3列 docBody.replaceText("{{当前学历}}", rowData[3]); // 对应Sheet第4列 docBody.replaceText("{{所属法院}}", rowData[4]); // 对应Sheet第5列 // 继续补充剩余22列对应的占位符替换逻辑 // 保存文档 DocumentApp.getActiveDocument().saveAndClose(); console.log(`文档生成成功:${newFileName}`); } catch (error) { console.error(`文档生成失败:${error.message}`); // 可添加错误通知逻辑(如发送邮件) } }
配置步骤
绑定可安装触发器
- 打开Apps Script编辑器,点击左侧「触发器」图标
- 点击「添加触发器」,选择函数
onEditHandler,事件源选「电子表格」,事件类型选「编辑时」,完成保存
替换关键配置项
- 将代码中的
你的数据表名替换为实际工作表名称 你的Google Doc模板ID:从Doc模板地址栏提取(如https://docs.google.com/document/d/XXXXXX/edit中的XXXXXX)你的Drive目标文件夹ID:从目标文件夹地址栏提取(如https://drive.google.com/drive/folders/XXXXXX中的XXXXXX)
- 将代码中的
设置Doc模板占位符
- 在Google Doc模板中,使用
{{姓名}}、{{身份证号}}这类格式的占位符,确保与代码中replaceText的第一个参数完全匹配
- 在Google Doc模板中,使用
内容的提问来源于stack exchange,提问作者user20795119
相关产品推荐
相关产品推荐

