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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:27:29