求助:编写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; }
代码说明
- 全局配置:修改
CONFIG对象中的参数,匹配你的实际资源ID和Sheet名称。 - 自定义菜单生成:
onOpen函数在打开Sheet时自动读取C列所有非空值,创建名为「文档生成」的自定义菜单。 - 文档生成逻辑:
createDocument函数接收点击的菜单选项,先定位到对应的行数据;- 复制模板文档并将内容同步到新文档;
- 遍历表头和行数据,替换文档中
{{列标题}}格式的占位符; - 将新文档移动到指定目标文件夹,完成后弹出提示。
- 辅助函数:
findRowByMenuItem负责根据菜单选项定位Sheet中的对应行。
使用步骤
- 打开目标Google Sheet,点击「扩展程序」→「Apps脚本」;
- 清空默认代码,粘贴上述代码;
- 修改
CONFIG中的参数:- 模板文档ID:打开模板文档,URL中
d/和/edit之间的字符串; - 目标文件夹ID:打开目标文件夹,URL中
folders/后的字符串;
- 模板文档ID:打开模板文档,URL中
- 保存项目并命名,关闭脚本编辑器;
- 刷新Sheet,即可看到「文档生成」菜单,点击选项即可生成对应文档。
内容的提问来源于stack exchange,提问作者Mina Joseph
相关产品推荐
相关产品推荐

