我可以验证、查看和编辑电子表格内容,但是当我尝试获取最后修改日期时:
my_client = pygsheets.authorize(service_file=secret_service_acct_file) my_worksheet = my_client.open_by_key(my_key) last_updated = my_worksheet.updated
我却收到以下错误:
Traceback (most recent call last): File "<pyshell#77>", line 1, in <module> my_worksheet.updated File "C:\Program Files (x86)\Python36-32\lib\site-packages\pygsheets\spreadsheet.py", line 90, in updated response = self.client._execute_request(self.id, request, False) File "C:\Program Files (x86)\Python36-32\lib\site-packages\pygsheets\client.py", line 459, in _execute_request response = request.execute() File "C:\Program Files (x86)\Python36-32\lib\site-packages\googleapiclient\_helpers.py", line 130, in positional_wrapper return wrapped(*args, **kwargs) File "C:\Program Files (x86)\Python36-32\lib\site-packages\googleapiclient\http.py", line 840, in execute raise HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: <HttpError 404 when requesting https://www.googleapis.com/drive/v3/files/{API_KEY}?fields=modifiedTime&supportsTeamDrives=false&alt=json returned "File not found: {API_KEY}.">
对我来说,这表明文件未找到。如果授权或连接出现问题,我预计其他读/写操作也会失败。我尝试使用 打开电子表格open_by_url(),但得到了相同的结果。
open_by_url()
我一直在使用gspread 0.6.2,直到我意识到我最终需要“Team Drive”支持。gspread 3.0.0声称提供“Team Drive”支持,但也弃用了.updated我需要的属性。
.updated
我如何modifiedTime使用 pygsheets 获取最新版本,或者我应该使用完全不同的库?
modifiedTime
从错误信息来看,您正尝试通过 pygsheets 获取 Google 电子表格的最后修改时间,但出现了 “File not found” 的错误。这可能是由于 pygsheets 使用的 API 请求中未正确处理 Team Drive 或文件的访问权限。
pygsheets
以下是解决问题的几种方法:
在您的代码中,您使用了 my_key 作为电子表格的关键值。请确认以下内容: - my_key 是电子表格的 ID,而非 API 密钥或其他内容。 - 如果使用 open_by_url(),确保提供完整的 URL,例如: https://docs.google.com/spreadsheets/d/{spreadsheetId}/edit
my_key
https://docs.google.com/spreadsheets/d/{spreadsheetId}/edit
pygsheets 中的 updated 属性已被废弃。为了获取文件的最后修改时间,建议直接使用 Google Drive API。您可以结合 googleapiclient 来完成:
updated
googleapiclient
from googleapiclient.discovery import build from google.oauth2.service_account import Credentials # 替换为您的服务账号文件路径 SERVICE_ACCOUNT_FILE = 'path_to_your_service_account_file.json' SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] # 使用服务账号文件授权 credentials = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES) drive_service = build('drive', 'v3', credentials=credentials) # 替换为您的电子表格 ID spreadsheet_id = 'your_spreadsheet_id' # 获取文件的元数据,包括最后修改时间 file_metadata = drive_service.files().get(fileId=spreadsheet_id, fields="modifiedTime").execute() # 输出最后修改时间 print(f"Last modified time: {file_metadata['modifiedTime']}")
files().get()
fields
"modifiedTime"
如果目标文件位于 Team Drive(共享云端硬盘)中,请确保您启用了 Team Drive 支持:
file_metadata = drive_service.files().get( fileId=spreadsheet_id, fields="modifiedTime", supportsAllDrives=True ).execute()
设置 supportsAllDrives=True 以确保 API 请求支持 Team Drive 和个人云端硬盘。
supportsAllDrives=True
如果您可以更换库,gspread 是另一个优秀的选择。虽然 gspread 的 3.x 版本已移除了 .updated 属性,但您仍可以结合 gspread 和 googleapiclient 来实现类似功能。
gspread
示例代码中可以复用上述 Google Drive API 的方法来获取 modifiedTime,并用 gspread 来处理其他电子表格操作。
推荐直接使用 Google Drive API 的 files().get() 方法来查询 modifiedTime,这是目前最直接和兼容性最好的方式。确保正确设置 supportsAllDrives=True 和文件权限。如果问题仍未解决,确认文件 ID 是否正确,或查看服务账号是否拥有访问权限。