基于DriveApp.getFolderById的谷歌云盘文件检查与下载脚本优化
修改后的谷歌Apps Script代码(满足文件夹检查+修复完成提示)
以下是调整后的完整代码,已实现需求中的文件夹文件检查功能,同时修复了完成提示不生效的问题:
function onOpen() { SpreadsheetApp.getUi() .createMenu('自定义菜单') .addItem('开始下载文件', 'showAlert') .addToUi(); } function showAlert() { const ui = SpreadsheetApp.getUi(); const ss = SpreadsheetApp.getActive(); const folder_id = ss.getRange("Sheet1!J4").getValue(); let targetFolder; // 验证文件夹ID是否有效 try { targetFolder = DriveApp.getFolderById(folder_id); } catch (e) { ui.alert('错误:无效的文件夹ID,请检查Sheet1!J4中的值'); return; } // 检查文件夹内是否已有文件 const hasFiles = targetFolder.getFiles().hasNext(); if (hasFiles) { const continueResult = ui.alert( '文件夹已有文件', '此文件夹已存储文件,是否仍要继续?', ui.ButtonSet.YES_NO ); if (continueResult !== ui.Button.YES) { ui.alert('操作已取消'); return; } } // 执行文件下载逻辑 try { const sheet = ss.getActiveSheet(); const lastRow = sheet.getLastRow(); // 从第3行开始遍历到最后一行 for (let i = 0; i < lastRow - 2; i++) { const rowNum = 3 + i; const url = sheet.getRange(rowNum, 1).getValue(); const name = sheet.getRange(rowNum, 2).getValue(); if (!url || !name) { sheet.getRange(rowNum, 3).setValue('跳过:URL或文件名为空'); continue; } const blob = UrlFetchApp.fetch(url).getBlob(); targetFolder.createFile(blob).setName(name); sheet.getRange(rowNum, 3).setValue('已完成'); } // 确保任务完成提示在循环正常结束后触发 ui.alert("任务已完成"); } catch (e) { ui.alert(`执行出错:${e.message}`); } }
关键修改说明:
- 文件夹有效性与文件检查
- 先通过
DriveApp.getFolderById()验证文件夹ID合法性,用try-catch捕获无效ID的错误 - 用
targetFolder.getFiles().hasNext()判断文件夹内是否存在文件,存在则弹出确认弹窗
- 先通过
- 优化冗余代码
- 将工作表、文件夹实例等变量提到循环外,避免重复调用Google服务,提升执行效率
- 修复完成提示
- 将任务完成提示放在try块末尾,确保所有下载操作正常执行完毕后才会弹出
- 全局添加try-catch捕获执行错误,避免脚本中途崩溃导致提示不显示
- 新增容错处理
- 遍历中遇到URL或文件名为空的行,会标记"跳过"并继续执行,不会中断整个任务
内容的提问来源于stack exchange,提问作者Zeeshan Hasnain
相关产品推荐
相关产品推荐

