Google Drive API 未正确返回修改后的时间数据

问题描述 投票:0回答:1

我正在使用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 后简单地阅读文档,我可以看到一秒钟前在我刚刚下载的版本中应用的更改。 但这种轮询行为并不是我们所希望的

python google-drive-api
1个回答
0
投票

在您的情况下,使用 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。请注意这一点。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.