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

求助:编写Google Apps Script实现Sheet数据填充Google Docs功能

Google Apps Script 实现Sheet菜单驱动的文档生成功能

以下是完整的实现代码,你只需替换代码中的模板文档ID、目标文件夹ID和Sheet名称(若不是默认Sheet1)即可使用:

// 全局配置,按需修改
const CONFIG = {
  SHEET_NAME: "Sheet1", // 你的Sheet名称
  TEMPLATE_DOC_ID: "你的模板文档ID", // 替换为模板Google文档的ID
  TARGET_FOLDER_ID: "你的目标文件夹ID" // 替换为保存新文档的文件夹ID
};

// 打开Sheet时自动创建自定义菜单
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.SHEET_NAME);
  // 获取C列所有非空值作为菜单选项
  const menuItems = sheet.getRange("C:C").getValues().flat().filter(item => item !== "");
  
  // 创建自定义菜单
  const menu = ui.createMenu("文档生成");
  menuItems.forEach(item => {
    menu.addItem(item, "createDocument");
  });
  menu.addToUi();
}

// 点击菜单选项时触发的核心函数
function createDocument(menuItem) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.SHEET_NAME);
  // 找到菜单选项对应的行
  const rowIndex = findRowByMenuItem(sheet, menuItem);
  if (!rowIndex) {
    SpreadsheetApp.getUi().alert("未找到对应数据,请检查C列内容");
    return;
  }

  // 复制模板文档
  const templateDoc = DocumentApp.openById(CONFIG.TEMPLATE_DOC_ID);
  const templateBody = templateDoc.getBody();
  const newDoc = DocumentApp.create(menuItem); // 用菜单选项作为新文档名称
  const newBody = newDoc.getBody();

  // 复制模板内容到新文档
  newBody.appendParagraph(templateBody.getText());

  // 获取表头和对应行的数据
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  const rowData = sheet.getRange(rowIndex, 1, 1, sheet.getLastColumn()).getValues()[0];

  // 替换文档中的占位符
  headers.forEach((header, index) => {
    const placeholder = `{{${header}}}`;
    const value = rowData[index] || "";
    newBody.replaceText(placeholder, value);
  });

  // 保存并移动文档到目标文件夹
  newDoc.saveAndClose();
  const file = DriveApp.getFileById(newDoc.getId());
  DriveApp.getFolderById(CONFIG.TARGET_FOLDER_ID).addFile(file);
  DriveApp.getRootFolder().removeFile(file);

  SpreadsheetApp.getUi().alert(`文档已生成:${menuItem}`);
}

// 辅助函数:根据菜单选项查找对应的行号
function findRowByMenuItem(sheet, menuItem) {
  const values = sheet.getRange("C:C").getValues();
  for (let i = 0; i < values.length; i++) {
    if (values[i][0] === menuItem) {
      return i + 1; // 返回行号(从1开始)
    }
  }
  return null;
}

代码说明

  1. 全局配置:修改CONFIG对象中的参数,匹配你的实际资源ID和Sheet名称。
  2. 自定义菜单生成:onOpen函数在打开Sheet时自动读取C列所有非空值,创建名为「文档生成」的自定义菜单。
  3. 文档生成逻辑:
    • createDocument函数接收点击的菜单选项,先定位到对应的行数据;
    • 复制模板文档并将内容同步到新文档;
    • 遍历表头和行数据,替换文档中{{列标题}}格式的占位符;
    • 将新文档移动到指定目标文件夹,完成后弹出提示。
  4. 辅助函数:findRowByMenuItem负责根据菜单选项定位Sheet中的对应行。

使用步骤

  1. 打开目标Google Sheet,点击「扩展程序」→「Apps脚本」;
  2. 清空默认代码,粘贴上述代码;
  3. 修改CONFIG中的参数:
    • 模板文档ID:打开模板文档,URL中d/和/edit之间的字符串;
    • 目标文件夹ID:打开目标文件夹,URL中folders/后的字符串;
  4. 保存项目并命名,关闭脚本编辑器;
  5. 刷新Sheet,即可看到「文档生成」菜单,点击选项即可生成对应文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:52:44