小能豆

Pygsheets .updated 返回“未找到文件”

py

我可以验证、查看和编辑电子表格内容,但是当我尝试获取最后修改日期时:

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(),但得到了相同的结果。

我一直在使用gspread 0.6.2,直到我意识到我最终需要“Team Drive”支持。gspread 3.0.0声称提供“Team Drive”支持,但也弃用了.updated我需要的属性。

我如何modifiedTime使用 pygsheets 获取最新版本,或者我应该使用完全不同的库?


阅读 5

收藏
2025-01-14

共1个答案

小能豆

从错误信息来看,您正尝试通过 pygsheets 获取 Google 电子表格的最后修改时间,但出现了 “File not found” 的错误。这可能是由于 pygsheets 使用的 API 请求中未正确处理 Team Drive 或文件的访问权限。

以下是解决问题的几种方法:


1. 确保文件 ID 或 URL 正确

在您的代码中,您使用了 my_key 作为电子表格的关键值。请确认以下内容:
- my_key 是电子表格的 ID,而非 API 密钥或其他内容。
- 如果使用 open_by_url(),确保提供完整的 URL,例如:
https://docs.google.com/spreadsheets/d/{spreadsheetId}/edit

2. 使用 Google Drive API 获取 modifiedTime

pygsheets 中的 updated 属性已被废弃。为了获取文件的最后修改时间,建议直接使用 Google Drive API。您可以结合 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']}")

步骤解释

  1. 使用 Google Drive API 的 files().get() 方法查询文件的元数据。
  2. fields 参数中指定 "modifiedTime",以减少不必要的数据传输。
  3. modifiedTime 的格式为 ISO 8601 时间戳。

3. 检查文件的访问权限

如果目标文件位于 Team Drive(共享云端硬盘)中,请确保您启用了 Team Drive 支持:

修改 API 调用以支持 Team Drive:

file_metadata = drive_service.files().get(
    fileId=spreadsheet_id,
    fields="modifiedTime",
    supportsAllDrives=True
).execute()

设置 supportsAllDrives=True 以确保 API 请求支持 Team Drive 和个人云端硬盘。


4. 如果更换库是可接受的

如果您可以更换库,gspread 是另一个优秀的选择。虽然 gspread 的 3.x 版本已移除了 .updated 属性,但您仍可以结合 gspreadgoogleapiclient 来实现类似功能。

示例代码中可以复用上述 Google Drive API 的方法来获取 modifiedTime,并用 gspread 来处理其他电子表格操作。


总结

推荐直接使用 Google Drive API 的 files().get() 方法来查询 modifiedTime,这是目前最直接和兼容性最好的方式。确保正确设置 supportsAllDrives=True 和文件权限。如果问题仍未解决,确认文件 ID 是否正确,或查看服务账号是否拥有访问权限。

2025-01-14