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

请求协助:提交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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:21:56