如何让GAS Web App生成的CSV文件名匹配上传文件夹名称?
解决方案:让CSV文件名与目标文件夹名称一致
要实现CSV文件名和「模型编号-插槽编号」命名的文件夹完全匹配,核心是复用生成文件夹名的参数来命名CSV文件,具体步骤如下:
1. 确保获取到文件夹名称的来源参数
首先要明确:文件夹名称是由「模型编号」和「插槽编号」拼接而来的,所以需要在表单提交时,把这两个值(或直接拼接好的文件夹名)传递给后端的Google Apps Script函数。
前端示例(HTML+JS)
假设你的表单里有两个输入框对应模型和插槽编号:
<form id="uploadForm"> <input type="text" name="modelNumber" placeholder="模型编号" required> <input type="text" name="slotNumber" placeholder="插槽编号" required> <input type="file" name="file" multiple> <button type="submit">提交</button> </form> <script> document.getElementById('uploadForm').addEventListener('submit', (e) => { e.preventDefault(); const formData = new FormData(e.target); // 直接在前端拼接文件夹名,或把两个参数传给后端拼接 const model = formData.get('modelNumber'); const slot = formData.get('slotNumber'); const folderName = `${model}-${slot}`; // 把文件夹名和表单数据一起传给后端 google.script.run.withSuccessHandler(msg => alert(msg)).uploadFiles(formData, folderName); }); </script>
2. 修改后端GAS代码,用文件夹名命名CSV
找到你生成CSV文件的代码部分,将原来的固定文件名替换为传入的folderName:
function uploadFiles(formData, folderName) { // 1. 处理目标文件夹(创建或获取已存在的文件夹) let targetFolder; try { // 先尝试查找是否已存在同名文件夹 targetFolder = DriveApp.getFoldersByName(folderName).next(); } catch (e) { // 不存在则创建新文件夹 targetFolder = DriveApp.createFolder(folderName); } // 2. 处理表单数据,生成CSV内容(根据你的实际字段调整) const csvHeaders = ["模型编号", "插槽编号", "上传时间"]; const csvRows = [ csvHeaders, [folderName.split('-')[0], folderName.split('-')[1], new Date().toLocaleString()] ]; // 把表单其他字段也加入CSV(如果需要) // csvRows.push([formData.get('其他字段名'), ...]); const csvContent = csvRows.map(row => row.join(',')).join('\n'); // 3. 生成CSV文件,文件名直接用folderName const csvFile = DriveApp.createFile(`${folderName}.csv`, csvContent, MimeType.CSV); // 将CSV移动到目标文件夹 csvFile.moveTo(targetFolder); // 4. 处理上传的文件(保留drive-multi-upload的原有逻辑) for (let i = 0; i < formData.length; i++) { const file = formData[i]; if (file.getName()) { targetFolder.createFile(file); } } return `上传完成,已生成 ${folderName}.csv`; }
3. 额外注意事项
- 文件名合法性:Drive文件夹/文件名不允许包含
/ \ : * ? " < > |这些字符,建议加一个过滤函数避免报错:function sanitizeName(name) { return name.replace(/[\/\\:*?"<>|]/g, ''); } // 使用时:const folderName = sanitizeName(`${model}-${slot}`); - 参数传递方式:如果你的后端原本就负责拼接文件夹名(前端只传模型和插槽编号),可以直接在后端复用拼接后的字符串作为CSV文件名,无需前端传folderName。
内容的提问来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

