通过文件夹名称查询Google Drive文件夹ID遇404错误求助
Google Drive按文件夹名称查找folder_id报错解决
错误信息
Error: <HttpError 404 when requesting https://www.googleapis.com/drive/v2/files?q=%27None%27+and+trashed%3Dfalse&maxResults=1000&supportsAllDrives=true&includeItemsFromAllDrives=true&alt=json returned "File not found: ". Details: "[{'message': 'File not found: ', 'domain': 'global', 'reason': 'notFound', 'location': 'file', 'locationType': 'other'}]">
代码问题分析
你的脚本存在两个核心问题:
- 返回逻辑错误:
get_folder_id_by_name函数中,return None写在for循环的if分支内部,导致仅检查第一个文件夹,只要不匹配就直接返回空值,后续文件夹完全不会被遍历。 - 查询逻辑缺陷:当前查询会拉取所有文件夹再本地遍历,效率极低;且如果
self.options['backup_folder']为空值,会导致API查询参数异常,触发404错误。
修复方案
修正后的代码
def get_folder_id_by_name(self, drive, folder_name): # 空值直接返回,避免无效API请求 if not folder_name: return None # 直接在查询条件中加入文件夹名称,由服务器端过滤结果 query = f"mimeType='application/vnd.google-apps.folder' and title='{folder_name}' and trashed=false" # 若需访问共享驱动器,添加对应参数 file_list = drive.ListFile({ 'q': query, 'supportsAllDrives': True, 'includeItemsFromAllDrives': True }).GetList() # 返回第一个匹配的文件夹ID(存在同名时可按需调整逻辑) for file in file_list: return file['id'] # 无匹配项时返回空值 return None if not self.backup: backup_folder_name = self.options['backup_folder'] backup_folder_id = self.get_folder_id_by_name(self.drive, backup_folder_name) if not backup_folder_id: # 创建新文件夹 folder = self.drive.CreateFile({ 'title': backup_folder_name, 'mimeType': 'application/vnd.google-apps.folder' }) folder.Upload() backup_folder_id = folder['id'] print(f"Created folder '{backup_folder_name}' with ID: {backup_folder_id}")
关键改动说明
- 提前拦截空值:先判断
folder_name是否为空,避免传入无效值导致API请求异常。 - 优化查询条件:将文件夹名称直接加入API查询参数,让Google Drive服务器端完成过滤,减少本地处理的数据量。
- 修正返回逻辑:将
return None移至for循环外部,确保遍历完所有匹配结果后再返回空值。 - 显式声明共享驱动器支持:如果脚本需要访问共享驱动器,明确传入
supportsAllDrives和includeItemsFromAllDrives参数,避免访问范围问题。
内容的提问来源于stack exchange,提问作者Jeroen Oudshoorn
相关产品推荐
相关产品推荐

