如何实现批量创建主文件夹、子文件夹并复制指定表格至子文件夹?
问题描述
需要通过Google Apps Script完成以下操作:
- 根据指定表格标签页的A列名称,在指定Drive文件夹下创建不重复的主文件夹(已完成该部分代码)
- 根据表格B列名称,在对应主文件夹内创建子文件夹
- 将预设的表格复制到每个子文件夹中
目前已实现第一部分,但第二、三部分开发遇到瓶颈,寻求技术建议。
已实现的第一部分代码
/* Create new folder if same folder does not exist */ function createFolder(folderID, folderName){ var parentFolder = DriveApp.getFolderById(folderID); var subFolders = parentFolder.getFolders(); var doesntExist = true; var newFolder = ''; // Check if folder already exists. while(subFolders.hasNext()){ var folder = subFolders.next(); //If the name exists return the id of the folder if(folder.getName() === folderName){ doesntExist = false; newFolder = folder; return newFolder.getId(); }; }; //If the name doesn't exists, then create a new folder if(doesntExist === true){ //If the file doesn't exists newFolder = parentFolder.createFolder(folderName); return newFolder.getId(); }; }; function start(){ var s = SpreadsheetApp.getActiveSpreadsheet(); var ss = s.getSheetByName('Sheet1'); var folderRange = ss.getDataRange(); var folderRangeData = folderRange.getValues(); var folderID = '1zGUd_5loP44EkJnBj0cQ4KLnGvKKZtMO'; Logger.log(folderRangeData) var noOfFolders = folderRangeData.length; Logger.log(noOfFolders) for(var i=1 ; i<folderRangeData.length ; i++){ if(folderRangeData[i][0] != ''){ var folderName = (folderRangeData[i][0]); //Call createFolder function var myFolderID = createFolder(folderID, folderName); Logger.log(myFolderID); } } }
技术建议
1. 实现对应主文件夹下的子文件夹创建
现有createFolder函数已经具备「检查文件夹是否存在+创建」的完整逻辑,可直接复用。只需在start函数中同时读取B列的子文件夹名称,将主文件夹ID作为父文件夹ID传入createFolder即可。
修改后的start函数核心逻辑:
function start(){ var s = SpreadsheetApp.getActiveSpreadsheet(); var ss = s.getSheetByName('Sheet1'); var folderRange = ss.getDataRange(); var folderRangeData = folderRange.getValues(); var folderID = '1zGUd_5loP44EkJnBj0cQ4KLnGvKKZtMO'; // 预设表格ID,第三部分会用到 var templateSheetID = '替换为你的预设表格ID'; for(var i=1 ; i<folderRangeData.length ; i++){ var mainFolderName = folderRangeData[i][0]; var subFolderName = folderRangeData[i][1]; if(mainFolderName.trim() !== ''){ var mainFolderID = createFolder(folderID, mainFolderName); Logger.log('主文件夹ID: ' + mainFolderID); // 处理子文件夹创建 if(subFolderName.trim() !== ''){ var subFolderID = createFolder(mainFolderID, subFolderName); Logger.log('子文件夹ID: ' + subFolderID); // 第三部分:复制预设表格到子文件夹的逻辑将在这里补充 } } } }
2. 将预设表格复制到每个子文件夹
使用DriveApp.getFileById(templateID).makeCopy(newName, parentFolder)方法完成复制,其中:
templateID是预设表格的IDnewName为复制后的表格名称(可自定义,比如与子文件夹同名)parentFolder是目标子文件夹对象
完善后的完整start函数:
function start(){ var s = SpreadsheetApp.getActiveSpreadsheet(); var ss = s.getSheetByName('Sheet1'); var folderRange = ss.getDataRange(); var folderRangeData = folderRange.getValues(); var folderID = '1zGUd_5loP44EkJnBj0cQ4KLnGvKKZtMO'; // 替换成你的预设表格ID var templateSheetID = '替换为你的预设表格ID'; var templateFile = DriveApp.getFileById(templateSheetID); for(var i=1 ; i<folderRangeData.length ; i++){ var mainFolderName = folderRangeData[i][0]; var subFolderName = folderRangeData[i][1]; if(mainFolderName.trim() !== ''){ var mainFolderID = createFolder(folderID, mainFolderName); Logger.log('主文件夹ID: ' + mainFolderID); if(subFolderName.trim() !== ''){ var subFolderID = createFolder(mainFolderID, subFolderName); var subFolder = DriveApp.getFolderById(subFolderID); Logger.log('子文件夹ID: ' + subFolderID); // 复制预设表格到子文件夹,命名为子文件夹名称 var copiedFile = templateFile.makeCopy(subFolderName, subFolder); Logger.log('复制的表格ID: ' + copiedFile.getId()); } } } }
额外优化点
- 可修改
createFolder函数,让它直接返回文件夹对象,减少后续DriveApp.getFolderById的重复调用,提升脚本效率 - 空值判断改用
mainFolderName.trim() !== '',避免空格导致的无效文件夹创建 - 添加
try-catch块包裹文件夹创建和文件复制操作,防止单条数据出错导致整个脚本终止
内容的提问来源于stack exchange,提问作者GAS Noob
相关产品推荐
相关产品推荐

