Google Web App上传脚本优化:按Model自动选空闲文件夹
解决方案:Google Web App分片上传的动态文件夹分配修复
核心逻辑梳理
针对需求实现以下关键逻辑:
- 基于表单选中的Model(01/02/03),筛选Drive中对应前缀的文件夹(格式
[Model]-[两位序号]) - 按序号遍历文件夹,选取第一个无文件的空闲文件夹作为上传目标
- 若对应Model的3个文件夹均有文件,抛出指定错误提示
- 修复文件夹命名重复后缀、Model切换后上传目标固定的问题
后端GS脚本修改
1. 新增目标文件夹获取函数
替换原硬编码的upload_folder,实现动态查找逻辑:
// 根据Model编号获取首个空闲文件夹 function getTargetFolder(modelId) { // 替换为存放Model文件夹的父文件夹ID const parentFolder = DriveApp.getFolderById("你的父文件夹ID"); const allFolders = parentFolder.getFolders(); const modelFolders = []; // 筛选符合命名规则的Model文件夹 while (allFolders.hasNext()) { const folder = allFolders.next(); const name = folder.getName(); if (name.startsWith(`${modelId}-`) && /^\d{2}-\d{2}$/.test(name)) { modelFolders.push(folder); } } // 按序号升序排序 modelFolders.sort((a, b) => { const numA = parseInt(a.getName().split("-")[1]); const numB = parseInt(b.getName().split("-")[1]); return numA - numB; }); // 返回首个空闲文件夹 for (const folder of modelFolders) { if (!folder.getFiles().hasNext()) { return folder; } } // 所有文件夹已满时抛出错误 throw new Error(`等待Model ${modelId}释放`); }
2. 修复文件夹创建逻辑(解决命名异常)
如果存在自动创建文件夹的逻辑,替换为以下代码保证命名格式正确:
// 为Model创建新文件夹(最多3个) function createModelFolder(modelId) { const parentFolder = DriveApp.getFolderById("你的父文件夹ID"); const allFolders = parentFolder.getFolders(); let maxSeq = 0; // 统计当前Model的最大文件夹序号 while (allFolders.hasNext()) { const folder = allFolders.next(); const name = folder.getName(); if (name.startsWith(`${modelId}-`) && /^\d{2}-\d{2}$/.test(name)) { const seq = parseInt(name.split("-")[1]); maxSeq = Math.max(maxSeq, seq); } } // 最多创建3个文件夹 if (maxSeq < 3) { const newSeq = maxSeq + 1; const newFolderName = `${modelId}-${newSeq.toString().padStart(2, '0')}`; return parentFolder.createFolder(newFolderName); } throw new Error(`Model ${modelId}的文件夹已达上限`); }
3. 修改上传入口函数
在原上传相关函数(如doPost或分片上传函数)中,替换硬编码文件夹逻辑:
function uploadFilePart(e) { try { // 从前端获取选中的Model编号 const modelId = e.parameter.modelId; // 获取目标文件夹 const targetFolder = getTargetFolder(modelId); // 后续原有上传逻辑(分片合并、文件保存等)使用targetFolder替代原硬编码文件夹 // ... } catch (err) { return {success: false, error: err.message}; } }
前端HTML/JS修改(解决Model切换无效问题)
1. 确保Model选择框传递值
在表单中添加或确认Model选择控件:
<select id="modelSelect"> <option value="01">Model 01</option> <option value="02">Model 02</option> <option value="03">Model 03</option> </select>
2. 动态传递Model参数
修改上传触发的JS代码,每次上传时获取当前选中的Model并传递给后端:
function triggerUpload() { const selectedModel = document.getElementById('modelSelect').value; const file = document.getElementById('fileInput').files[0]; // 调用后端分片上传函数,传递Model参数 google.script.run .withSuccessHandler(res => { if (!res.success) alert(res.error); // 上传成功逻辑 }) .withFailureHandler(err => alert(err.message)) .uploadFilePart({ modelId: selectedModel, // 其他上传参数:分片索引、文件块数据、文件名等 // ... }); }
关键问题修复说明
- 文件夹命名异常:通过严格的命名规则
${modelId}-${两位序号}和padStart方法,避免重复拼接后缀,保证文件夹名称格式统一。 - Model切换无效:前端每次上传时动态获取选中的Model值,后端根据该值重新查找对应模型的空闲文件夹,彻底解决目标文件夹固定的问题。
内容的提问来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

