Google表单提交后按国家迁移视频至Drive对应文件夹报错排查
你的代码主要存在以下几个核心问题,对应修复方案如下:
1. 表单字段名称不匹配
e.namedValues['COUNTRY'][0]和e.namedValues['VIDEO UPLOAD'][0]中的字段名称必须和Google表单里的实际字段标题完全一致(包括大小写、空格、标点符号)。如果表单里的国家字段是中文“国家”而非“COUNTRY”,或者视频上传字段是“视频上传”而非“VIDEO UPLOAD”,会直接导致无法获取对应值,触发Cannot read property '0' of undefined或文件夹ID为undefined的错误。
修复:打开你的Google表单,复制字段的准确标题,替换代码中对应的字符串。例如国家字段是中文则改为e.namedValues['国家'][0]。
2. 文件ID提取逻辑失效
Google表单上传文件的链接格式已更新,当前多为https://drive.google.com/file/d/[文件ID]/view结构,原代码用split('id=')[1]无法正确提取ID,会导致DriveApp.getFileById()报错。
修复:改用正则表达式提取文件ID,替换原文件ID提取代码:
// 替换原file_id提取行 var file_url = e.namedValues['VIDEO UPLOAD'][0]; var file_id = file_url.match(/[-\w]{25,}/)[0]; // 匹配Drive文件ID的通用正则
3. 缺乏异常容错处理
若用户未选择国家、未上传视频,或字段值格式异常,代码会直接终止报错,没有容错机制。
修复:添加基础异常判断,避免脚本崩溃:
function move_file_to_folder(e) { // 验证必要字段是否存在 var country = e.namedValues['COUNTRY']?.[0]; var file_url = e.namedValues['VIDEO UPLOAD']?.[0]; if (!country || !file_url) { console.log('缺少必填字段:国家或视频链接'); return; } var folder_id = folders[country]; if (!folder_id) { console.log('未找到对应国家的文件夹:' + country); return; } // 提取文件ID var file_id_match = file_url.match(/[-\w]{25,}/); if (!file_id_match) { console.log('无法从链接中提取文件ID:' + file_url); return; } var file_id = file_id_match[0]; // 移动文件并捕获错误 try { DriveApp.getFileById(file_id).moveTo(DriveApp.getFolderById(folder_id)); } catch (err) { console.log('文件移动失败:' + err.message); } }
4. 文件夹名称匹配不一致
folders对象的键(如'USA')必须和表单中用户选择的国家选项完全一致,包括大小写、空格和符号。例如表单选项是“U.S.A”而非“USA”,会找不到对应的文件夹ID。
修复:要么统一表单选项与folders对象的键,要么转换大小写后匹配:
var folder_id = folders[country.toUpperCase()]; // 表单选项为小写时,转大写匹配
5. 触发器权限与关联问题
运行install_OnFormSubmitTrigger()时,需确保你有足够权限,且触发器关联的是正确的表格。此外,触发器的运行权限属于安装者,需确保安装者对目标文件夹和上传文件有编辑权限。
修复:重新运行install_OnFormSubmitTrigger()并完成授权;检查目标文件夹的共享权限,确保脚本运行账号可访问。
内容的提问来源于stack exchange,提问作者Kamal Parajuli

