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

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}`);
    // 可添加错误通知逻辑(如发送邮件)
  }
}

配置步骤

  1. 绑定可安装触发器

    • 打开Apps Script编辑器,点击左侧「触发器」图标
    • 点击「添加触发器」,选择函数onEditHandler,事件源选「电子表格」,事件类型选「编辑时」,完成保存
  2. 替换关键配置项

    • 将代码中的你的数据表名替换为实际工作表名称
    • 你的Google Doc模板ID:从Doc模板地址栏提取(如https://docs.google.com/document/d/XXXXXX/edit中的XXXXXX)
    • 你的Drive目标文件夹ID:从目标文件夹地址栏提取(如https://drive.google.com/drive/folders/XXXXXX中的XXXXXX)
  3. 设置Doc模板占位符

    • 在Google Doc模板中,使用{{姓名}}、{{身份证号}}这类格式的占位符,确保与代码中replaceText的第一个参数完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:35:36