Google Apps Script按Sheet数据动态查找文件夹保存新建文档
场景说明
Google Sheet存储业务数据,需使用表内数据填充Google Doc模板,新生成的文档要根据姓名、月份两个字段值,保存到Google Drive对应的指定文件夹中。
问题描述
当前无法确定如何将文档保存到正确路径,不确定Google Apps Script/Google Drive是否支持该能力。表内有两列分别存储人员姓名和月份数据,目标存储逻辑:
- 第一步:根据姓名字段值匹配对应一级文件夹
- 第二步:在匹配到的一级文件夹内,根据月份字段值匹配二级子文件夹
- 第三步:将生成的文档存入对应姓名文件夹下的对应月份子文件夹中
当前实现状态
现有代码已经实现从Sheet拉取数据、替换模板占位符内容、按规则命名新文档的功能,此前通过硬编码文件夹ID的方式指定固定保存路径:
const destinationFolder = DriveApp.getFolderById('ID_GOES_HERE');
由于存在多姓名、多月份对应的多组文件夹,无法硬编码全部文件夹ID,需要代码根据表内的姓名、月份字段动态查找目标子文件夹。
原有代码片段(已隐去敏感ID信息)
/* 在Spreadsheet中创建触发文档生成的自定义菜单 */ function onOpen() { const ui = SpreadsheetApp.getUi(); const menu = ui.createMenu('AutoFill Template'); menu.addItem('Create New Document', 'createNewGoogleDocs'); menu.addToUi(); } /* 遍历表格行,若对应行没有文档链接则生成新文档 */ function createNewGoogleDocs() { const googleDocTemplate = DriveApp.getFileById('ID_GOES_HERE'); // 原有硬编码固定路径的逻辑 const destinationFolder = DriveApp.getFolderById('ID_GOES_HERE'); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Responses'); const rows = sheet.getDataRange().getValues(); rows.forEach(function(row, index) { if (index === 0) return; if (row[13]) return; const copy = googleDocTemplate.makeCopy(`QCP - ${row[4]} - ${row[2]}`, destinationFolder); const doc = DocumentApp.openById(copy.getId()); const body = doc.getBody(); body.replaceText('{{Title Name}}', row[4]); body.replaceText('{{Month}}', row[2]); body.replaceText('{{Name}}', row[3]); body.replaceText('{{Desired 1}}', row[5]); body.replaceText('{{Desired 2}}', row[6]); doc.saveAndClose(); const url = doc.getUrl(); sheet.getRange(index + 1, 14).setValue(url); }); }
实现方案
Google Apps Script原生Drive服务完全支持按名称层级查找文件夹,无需硬编码所有文件夹ID,只需删除原有代码中固定获取destinationFolder的硬编码逻辑,在遍历每行数据时动态查找对应层级的文件夹即可。
核心实现代码:
// 按当前行姓名查找一级文件夹 const parent_folder = DriveApp.getFoldersByName(row[3]).next(); // 在一级文件夹下按当前行月份查找二级子文件夹 const subfolder = parent_folder.getFoldersByName(row[2]).next(); // 二级子文件夹即为最终文档保存路径 const destinationFolder = subfolder;
注意事项:
- 如果Drive根目录存在多个同名的人员文件夹,建议将所有人员一级文件夹统一存放在一个固定根目录下,从该固定根目录发起查找,避免匹配到错误的同名文件夹导致文件存错位置
- 调用
next()方法前可先通过hasNext()判断对应名称的文件夹是否存在,避免脚本因找不到目标文件夹运行报错
内容的提问来源于stack exchange,提问作者Addy
相关产品推荐
相关产品推荐

