Google Drive Files/Spreadsheets REST API:跟踪文件更改时如何避免延迟?

Google Drive Files/Spreadsheets REST API: How to avoid delay when tracking file changes?

我有一个应用程序,我需要在其中保留我用户的某些 Google 电子表格的本地副本,并且此副本应与 Google Drive 版本同步。我一直在测试两种跟踪 Google 电子表格更改的方法:(1) 文件版本轮询方法和 (2) files.watch 方法。

1)文件version轮询方式

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

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

如果版本大于我这边存储的版本,我知道已经做了更改,我这边的文件已经过时了。所以我下载了文件并更新了我的副本。

问题是文件 version 编号需要一段时间才能更新到 Google 的末尾。理想情况下,在编辑 Google 电子表格单元格后,我的应用程序应该能够在不到 10 秒的时间内检测到此更改。但是,在编辑单元格并在顶部看到 Saved to Drive 确认后,有时需要几秒钟,有时需要几分钟才能更新版本号,因此非常不一致。

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

2) files.watch 方法

在这个方法中,我通过注册一个 webhook 来接收来自 Google:

的更改通知来跟踪文件更改
POST https://www.googleapis.com/drive/v3/files/FILE_ID/watch

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

不幸的是,更改通知也没有我希望的那么快。它也有非常不一致的延迟:有时需要几秒钟,有时需要超过一分钟。

更新 (3) 'always export' 方法?从不缓存方法?

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

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

但经常会return过时的版本,有时过几分钟才return最新的版本。

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

1。如何尽快检测到文件变化?

文件更改后(在我的例子中,Google 电子表格中的更改),version 不会立即更新,当您使用 [=23 观察文件更改时=] API 您也不会立即收到通知。

立即更新的是文件的修订列表,可以使用 revisions.list API:

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

此 return 是文件 FILE_ID 所有修订的列表。列表中的最后一项是最新修订版(“头”修订版)。为了知道文件是否已更改,我检索了此列表。如果head revision的id和我这边存的id不一样,说明我的本地副本已经过期了,所以我要更新文件和它的revision id.

不过,如果调用files.export, the file version returned will not necessarily be the absolute most recent version (e.g., the Google Sheet you are seeing in your browser). And in the case of Google editor documents, it is not possible to retrieve the most recent revision using the revisions.getAPI。那你能做什么?

2。如何检索 Google Sheet 的最新修订版?

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

在调用 files.export, you have to "touch" the file using the files.update API 之前,更新其 modifiedTime:

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

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

出于某种原因,在您下次调用 files.export:

时,像这样触摸文件会“强制”Google 到 return 文件的主要修订版
GET https://www.googleapis.com/drive/v3/files/FILE_ID/export?mimeType=MIMETYPE

在我的例子中,MIMETYPEapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

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