请求协助:提交HTML表单前校验Google Drive子文件夹文件数量
实现Google表单提交前校验Drive文件夹文件数并执行对应逻辑
核心逻辑流程
点击表单提交按钮时触发以下校验:
- 若目标文件夹(当前GAS文件所在文件夹的子文件夹
_)内文件数≥4:显示错误提示,阻止表单提交 - 若文件数**=3**:弹出确认弹窗,用户选择
Yes则在目标文件夹创建空文件后提交表单,选择No则阻止提交 - 若文件数**<3**:直接提交表单
前端HTML表单代码
将表单的默认提交按钮替换为自定义点击事件的按钮,实现校验逻辑:
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <form id="submissionForm" method="post" action="https://script.google.com/macros/s/[你的脚本ID]/exec"> <!-- 替换为你的实际表单字段 --> <div> <label>姓名:</label> <input type="text" name="username" required> </div> <div style="margin: 1rem 0;"> <label>邮箱:</label> <input type="email" name="email" required> </div> <button type="button" onclick="validateAndSubmit()">提交</button> <div id="errorContainer" style="color: #dc2626; margin-top: 1rem; display: none;"></div> </form> <script> async function validateAndSubmit() { const errorEl = document.getElementById('errorContainer'); errorEl.style.display = 'none'; // 调用服务端函数获取目标文件夹文件数 const fileCount = await google.script.run .withSuccessHandler(count => count) .withFailureHandler(err => { errorEl.textContent = '校验失败:' + err.message; errorEl.style.display = 'block'; return -1; }) .getTargetFolderFileCount(); if (fileCount === -1) return; // 文件数≥4:阻止提交并显示错误 if (fileCount >= 4) { errorEl.textContent = '目标文件夹内文件数量已达上限,无法提交表单'; errorEl.style.display = 'block'; return; } // 文件数=3:弹出确认框 if (fileCount === 3) { const confirmCreate = confirm('当前文件夹已有3个文件,是否创建新文件后提交表单?'); if (!confirmCreate) return; // 创建空文件 await google.script.run .withFailureHandler(err => { errorEl.textContent = '创建文件失败:' + err.message; errorEl.style.display = 'block'; }) .createDummyFileInTargetFolder(); } // 校验通过,提交表单 document.getElementById('submissionForm').submit(); } </script> </body> </html>
后端Google Apps Script代码
实现Drive文件夹操作、文件数统计和表单提交处理:
// 获取目标文件夹(当前脚本所在文件夹的子文件夹"_")内的文件数量 function getTargetFolderFileCount() { try { // 获取当前脚本文件 const scriptFile = DriveApp.getFileById(ScriptApp.getScriptId()); // 获取脚本所在的父文件夹 const parentFolder = scriptFile.getParents().next(); // 查找名为"_"的子文件夹 const targetFolders = parentFolder.getFoldersByName("_"); if (!targetFolders.hasNext()) { throw new Error('未找到名为"_"的子文件夹'); } const targetFolder = targetFolders.next(); // 统计文件夹内的文件数量(仅统计文件,排除子文件夹) let fileCount = 0; const files = targetFolder.getFiles(); while (files.hasNext()) { files.next(); fileCount++; } return fileCount; } catch (err) { throw err; } } // 在目标文件夹创建一个空的文本文件 function createDummyFileInTargetFolder() { try { const scriptFile = DriveApp.getFileById(ScriptApp.getScriptId()); const parentFolder = scriptFile.getParents().next(); const targetFolder = parentFolder.getFoldersByName("_").next(); // 使用时间戳生成唯一文件名,避免重复 const fileName = `dummy_file_${Date.now()}.txt`; targetFolder.createFile(fileName, ''); } catch (err) { throw err; } } // 表单提交处理函数(根据你的业务需求修改) function doPost(e) { try { // 获取关联工作表 const spreadsheet = SpreadsheetApp.openById('[你的关联工作表ID]'); const sheet = spreadsheet.getSheetByName('表单数据'); // 替换为你的工作表名称 // 将表单数据写入工作表 const submissionData = [ e.parameter.username, e.parameter.email, new Date().toLocaleString() ]; sheet.appendRow(submissionData); // 返回成功响应 return ContentService.createTextOutput(JSON.stringify({status: 'success', message: '提交成功'})) .setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status: 'error', message: err.message})) .setMimeType(ContentService.MimeType.JSON); } }
注意事项
- 确保GAS脚本拥有Google Drive的读写权限,首次运行时需要授权
- 如果目标文件夹
_可能不存在,建议在getTargetFolderFileCount中添加创建逻辑或更明确的错误提示 - 表单的
action属性需要替换为你部署GAS脚本后的Web应用URL
内容的提问来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

