我正在使用GoogleDriveAPI来检查文件的最后一次修改时间,如果在我上次执行脚本后文件被修改过,它应该下载该文件并解析它,否则本地版本是最新的。
我正在测试执行如下调用的 python 脚本:
小时:男:小 | 行动 | 行为 |
---|---|---|
00:00:00 | 更新 Google 表格 | |
00:00:05 | 调用脚本 | 看到更改并更新修改时间 |
00:00:10 | 更新 Google 表格 | |
00:00:15 | 调用脚本 | (看不到变化) |
00:00:50 | 调用脚本 | (看不到变化)最后修改时间仍然是 00:00:00 |
00:03:00 | 更新 Google 表格 | |
00:03:05 | 调用脚本 | (看到变化) |
在我看来,Google API 将发生时间太近的更改组合在一起。
供参考 05 diff 以秒为单位表示立即(只需按 Tab 键切换到终端并返回 GoogleSheet)
我正在使用的Python脚本:
request = service.files().get(fileId='----------------', fields='*')
value = request.execute()
file_name = value['name'] + ".xlsx"
modified_date = value['modifiedTime'].split("T")[0]
modified_time = value['modifiedTime'].split("T")[1].split(".")[0]
# some checks
## after some checking with current time, which does not matter, since the
## value should come from an HTTP request,
## I still delete the variables where it is stored, both the request return and the values
del value
del modified_date
del modified_time
这是 GoogleDriveAPI 问题,还是我的代码的某些部分错误?
Python 可能正在缓存一些东西?
或者只是像我提到的那样,GoogleSheets 本身的行为发生了分组变化?
有什么办法可以 请注意,该问题 100% 与凭据无关。
此外,更改就在那里,如果我在调用 API 后简单地阅读文档,我可以看到一秒钟前在我刚刚下载的版本中应用的更改。 但这种轮询行为并不是我们所希望的
在您的情况下,使用 Drive API 的“方法:revisions.list”而不是 Drive API 的“方法:files.get”怎么样?当这反映在示例脚本中时,它变成如下。
这是一个简单的示例脚本,用于解释“Method:files.get”和“Method:revisions.list”之间的区别。
在此脚本中,请使用您的授权值
credentials=creds
。
def updateSheet(sheets, spreadsheetId):
sheets.spreadsheets().values().append(spreadsheetId=spreadsheetId,range="Sheet1",body={"values": [["sample value"]]},valueInputOption="USER_ENTERED").execute()
def getModifiedTimeByDriveFilesGet(drive, fileId):
res1 = drive.files().get(fileId=fileId, fields="modifiedTime").execute()
return res1["modifiedTime"]
def getModifiedTimeByDriveRevisionsList(drive, fileId):
revisions = []
pageToken = ""
while pageToken is not None:
res = drive.revisions().list(fileId=fileId, fields="nextPageToken,revisions(modifiedTime)", pageSize=1000, pageToken=pageToken if pageToken != "" else None).execute()
r = res.get("revisions", [])
revisions += r
pageToken = res.get("nextPageToken")
return revisions[-1]["modifiedTime"]
def main():
spreadsheetId = "###" # Please set your Spreadsheet ID.
sheets = build("sheets", "v4", credentials=creds)
drive = build("drive", "v3", credentials=creds)
n = 5
for i in range(n):
print(f"{i + 1}st update sheet")
updateSheet(sheets, spreadsheetId)
lastModifiedTime1 = getModifiedTimeByDriveFilesGet(drive, spreadsheetId)
lastModifiedTime2 = getModifiedTimeByDriveRevisionsList(drive, spreadsheetId)
print(f"Get modifiedTime by drive.files().get(): {lastModifiedTime1}")
print(f"Get modifiedTime by drive.revisions().list(): {lastModifiedTime2}")
time.sleep(5)
运行该脚本,得到以下结果。
1st update sheet
Get modifiedTime by drive.files().get(): 2023-10-31T03:20:20.268Z
Get modifiedTime by drive.revisions().list(): 2023-10-31T03:22:15.316Z
2st update sheet
Get modifiedTime by drive.files().get(): 2023-10-31T03:20:20.268Z
Get modifiedTime by drive.revisions().list(): 2023-10-31T03:22:22.363Z
3st update sheet
Get modifiedTime by drive.files().get(): 2023-10-31T03:20:20.268Z
Get modifiedTime by drive.revisions().list(): 2023-10-31T03:22:29.379Z
4st update sheet
Get modifiedTime by drive.files().get(): 2023-10-31T03:20:20.268Z
Get modifiedTime by drive.revisions().list(): 2023-10-31T03:22:36.377Z
5st update sheet
Get modifiedTime by drive.files().get(): 2023-10-31T03:20:20.268Z
Get modifiedTime by drive.revisions().list(): 2023-10-31T03:22:43.349Z
您可以看到,工作表更新后,
drive.files().get()
的值与2023-10-31T03:20:20.268Z
相比没有改变。但是,drive.revisions().list()
的值每次都会改变。
当您使用
drive.revisions().list()
检索最新的modifiedTime时,从drive.revisions().list()
检索到的最后一项就是最新的modifiedTime。请注意这一点。