Google Drive文件/电子表格REST API:如何避免跟踪文件更改时的延迟



我有一个应用程序,我需要保存一些用户的谷歌电子表格的本地副本,这个副本应该与谷歌硬盘版本同步。我一直在测试两种跟踪谷歌电子表格更改的方法:(1(文件版本轮询方法和

1(文件version轮询方法

在这种方法中,每当我需要最新版本的电子表格时(例如,当用户想从我的应用程序下载文件时(,我都会使用从谷歌检索文件版本

POST https://www.googleapis.com/drive/v3/files/FILE_ID?fields=version

如果版本大于我存储在我端的版本,我知道已经进行了更改,并且我端的文件已经过时。所以我下载了文件并更新了我的副本。

问题是,在谷歌端更新文件version编号需要一段时间。理想情况下,在编辑谷歌电子表格单元格后,我的应用程序应该能够在不到10秒内检测到这种变化。但是,在编辑单元格并在顶部看到保存到驱动器确认后,有时需要几秒钟,有时则需要几分钟才能更新版本号,因此非常不一致。

除了版本号之外,我还尝试轮询modifiedTime值,看看它是否更快地更改,但没有。所以我尝试了另一种方法。

2(files.watch方法

在这种方法中,我通过注册一个webhook来接收来自谷歌的更改通知来跟踪文件更改:

POST https://www.googleapis.com/drive/v3/files/FILE_ID/watch

每当我收到更改通知时,我都知道我需要更新本地副本。

不幸的是,更改通知也没有像我希望的那样迅速。它也有非常不一致的延迟:有时需要几秒钟,有时需要一分钟以上。

UPDATE(3("始终导出"方法?从不缓存方法

更复杂的是,即使我忽略了本地副本,总是试图直接从谷歌下载最新版本的文件,下载的文件也不一定是用户在电子表格编辑器上看到的绝对最新版本。我用试过了

GET https://www.googleapis.com/drive/v3/files/FILE_ID/export?mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

但它通常会返回过时的版本,有时只会在几分钟后返回最新版本。

还有什么我可以试试的吗?以上方法使用Google Drive Files API,但如果有一种方法可以使用Google Spreadsheets API更快地检测更改,我想知道。

1。如何尽快检测文件更改

文件更改后(在我的情况下,是Google电子表格中的更改(,version不会立即更新,当您使用files.watch API查看文件更改时,也不会立即收到通知。

所做的立即更新的是文件的修订列表,可以使用修订进行检索。list API:

GET https://www.googleapis.com/drive/v3/files/FILE_ID/revisions

这将返回文件FILE_ID的所有修订的列表。列表中的最后一项是最近的修订("标题"修订(。为了知道一个文件是否已经更改,我检索了这个列表。如果head修订版的id与我端存储的id不同,则意味着我的本地副本已过期,因此我必须更新文件及其修订版id

但是如果您调用files.export,则返回的文件版本不一定是绝对最新的版本(例如,您在浏览器中看到的Google工作表(。在Google编辑器文档的情况下,无法使用revisions.get API检索最新修订。那你能做什么?

2.如何检索谷歌工作表的最新修订版

(我打赌它也适用于其他谷歌编辑器文档(。

在调用files.export之前,您必须"触摸";使用文件的文件。更新API,更新其modifiedTime:

PATCH https://www.googleapis.com/drive/v3/files/fileId
{
"modifiedTime": "TIMESTAMP"
}

其中,TIMESTAMP是格式为2022-04-16T22:00:00Z的日期。

出于某种原因,像这样触摸文件"力";谷歌将在下次调用文件时返回文件的头部修订。导出:

GET https://www.googleapis.com/drive/v3/files/FILE_ID/export?mimeType=MIMETYPE

在我的情况下,MIMETYPE就是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

就是这样。到目前为止,这对我一直有效。

最新更新