gspread list_spreadsheet_files无法获取子文件夹文件问题求助
问题:gspread读取子文件夹中Google Sheets返回空列表
原本通过指定顶级文件夹ID,使用以下代码可获取所有子文件夹中的Google Sheets,但目前代码返回空列表,此前可正常返回该文件夹下所有Google Sheet名称。涉事文件夹仅包含存有Google Sheets的子文件夹,使用版本:
- gspread 5.7.2
- Python 3.10
原代码:
import gspread scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] credentials = ServiceAccountCredentials.from_json_keyfile_name( 'creds_path/creds.json', scope) gc = gspread.authorize(credentials) folderID = 'a_folder_id_here' existing_sheets = gc.list_spreadsheet_files(folder_id = folderID)
解决思路与方案
1. 排查权限问题
- 确认服务账号邮箱已被添加为顶级文件夹的编辑者/查看者,若子文件夹单独设置了权限,需同步添加服务账号权限(子文件夹默认继承父级权限,但手动修改后需单独配置)。
- 检查
creds.json文件是否对应正确的服务账号,未被替换或过期。
2. 修复方法的递归缺失问题
gspread的list_spreadsheet_files方法仅读取直接位于指定文件夹下的表格,不会递归遍历子文件夹。若之前表格直接存于顶级文件夹,后来移至子文件夹,就会出现返回空列表的情况。需自行实现递归遍历逻辑:
import gspread from google.oauth2.service_account import Credentials # 定义权限范围 SCOPES = [ 'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive.readonly' ] # 加载凭证 creds = Credentials.from_service_account_file('creds_path/creds.json', scopes=SCOPES) gc = gspread.authorize(creds) def get_all_sheets_in_folder(folder_id): all_sheets = [] # 调用Drive API获取当前文件夹下所有内容 results = gc.auth.service.files().list( q=f"'{folder_id}' in parents and trashed=false", fields="files(id, name, mimeType)", pageSize=1000 ).execute() items = results.get('files', []) for item in items: # 识别Google Sheet类型文件 if item['mimeType'] == 'application/vnd.google-apps.spreadsheet': all_sheets.append({'name': item['name'], 'id': item['id']}) # 递归遍历子文件夹 elif item['mimeType'] == 'application/vnd.google-apps.folder': all_sheets.extend(get_all_sheets_in_folder(item['id'])) return all_sheets # 调用示例 folderID = 'a_folder_id_here' existing_sheets = get_all_sheets_in_folder(folderID) print(existing_sheets)
3. 其他排查点
- 确认子文件夹中的表格未被移入回收站或设置隐藏。
- 检查顶级文件夹ID是否输入正确,无拼写错误。
内容的提问来源于stack exchange,提问作者Dance Party
相关产品推荐
相关产品推荐

