使用gspread下载Google Sheet时数据加载异常显示‘Cargando...’
解决Google Sheet复杂文档下载后单元格显示“Cargando...”的问题
你的问题出在复杂文档的计算未完成时,API就返回了加载中的占位符。以下是几个可行的解决办法:
现有代码
import os import pandas as pd import gspread __doc_id_horarios = "你的文档ID" # 补充缺失的全局变量 def download_gs_sheet(data_path_: str, filename: str, s_name: str, doc_id: str =__doc_id_horarios) -> None: """ Función para descargar hoja de cálculo desde Google Sheets :param data_path_: La ruta donde se guardará el archivo. :param filename: el nombre del archivo a guardar. :param s_name: La pestaña/hoja a descargar del documento. :param doc_id: El identificador del documento. """ credential = os.path.join(os.path.dirname(__file__), 'credentials', "service_account.json") gc = gspread.service_account(credential) spreadsheet = gc.open_by_key(doc_id) worksheet = spreadsheet.worksheet(s_name) rows = worksheet.get_values() df = pd.DataFrame(rows) print(df) filename = os.path.join(data_path_, filename) df.to_excel(filename)
解决办法
1. 指定值渲染选项,强制获取计算后的值
修改get_values()调用,添加value_render_option参数,让API返回计算完成的最终值而非加载占位符:
# 获取无格式的原始计算值 rows = worksheet.get_values(value_render_option='UNFORMATTED_VALUE') # 或者保留格式的计算值 # rows = worksheet.get_values(value_render_option='FORMATTED_VALUE')
2. 等待文档计算完成后再获取数据
对于超大型计算密集型文档,先触发计算刷新,再等待足够时间让后台完成计算:
import time # ... 原有代码 ... worksheet = spreadsheet.worksheet(s_name) # 触发计算刷新(更新一个无关单元格,不影响原有数据) current_value = worksheet.cell(1, 1).value worksheet.update_cell(1, 1, current_value) # 根据文档复杂度调整等待时间,比如10-30秒 time.sleep(15) # 再获取计算完成的数据 rows = worksheet.get_values(value_render_option='UNFORMATTED_VALUE') # ... 后续代码 ...
3. 复制工作表到临时文档再下载
原文档可能因缓存或会话问题导致计算停滞,复制到临时文档后Google会重新计算所有公式,此时再下载数据:
import time # ... 原有代码 ... spreadsheet = gc.open_by_key(doc_id) worksheet = spreadsheet.worksheet(s_name) # 创建临时文档 temp_spreadsheet = gc.create("temp_download_sheet") # 复制目标工作表到临时文档 worksheet.copy_to(temp_spreadsheet.id) # 等待复制和计算完成 time.sleep(20) # 获取临时工作表的数据 temp_worksheet = temp_spreadsheet.worksheet(s_name) rows = temp_worksheet.get_values(value_render_option='UNFORMATTED_VALUE') # 可选:删除临时文档 gc.del_spreadsheet(temp_spreadsheet.id) # ... 后续代码 ...
原因分析
你的文档包含大量公式、数组运算或外部数据引用,浏览器打开需要数秒加载,说明Google Sheets后台需要时间完成计算。gspread和pydrive2默认调用API时,会直接返回当前单元格的状态(即未完成计算的“Cargando...”占位符),而非最终计算结果。通过上述方法,可以确保API返回的是已计算完成的实际数据。
内容的提问来源于stack exchange,提问作者Ivannpy
相关产品推荐
相关产品推荐

