如何为 Google 驱动器 API 的 files.list API 端点获取 pageToken?

How to get a pageToken for the files.list API endpoint of the Google Drives API?

我是第一次使用 Google 驱动器 API,但我无法在任何地方找到如何使用 API 的 pageToken 系统。下面是直接取自谷歌网络编辑器的示例代码片段。

<script src="https://apis.google.com/js/api.js"></script>
<script>
  /**
   * Sample JavaScript code for drive.files.list
   * See instructions for running APIs Explorer code samples locally:
   * https://developers.google.com/explorer-help/guides/code_samples#javascript
   */
  function execute() {
    return gapi.client.drive.files.list({
      "includeItemsFromAllDrives": true,
      "orderBy": "name",
      "pageSize": 1000,
      "q": "'FOLDER_ID' in parents",
      "supportsAllDrives": true,
      "fields": "files(name,fileExtension,starred,size)"
    })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error", err); });
  }
  gapi.load("client:auth2", function() {
    gapi.auth2.init({client_id: "YOUR_CLIENT_ID"});
  });
</script>
<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>

目前,上面的代码,只有returns 1000 个文件。根据文档,它还应该包含一个 nextPageToken,但示例代码不包含 return 该标记。

我做错了什么?

我相信你的目标如下。

  • 您想使用 Drive API v3 中的“Files: list”方法检索文件列表,并使用 googleapis for Javascript。
    • 在这种情况下,您想使用 pageToken
  • 您已经能够使用驱动器 API 从 Google 驱动器获取值。

这样的话,下面的修改怎么样?当你使用fields的属性时,为了returnnextPageToken的值,需要在[=13=的值中包含nextPageToken =].

修改后的脚本:

function getList(pageToken) {
  return new Promise((resolve, reject) => {
    gapi.client.drive.files.list({
      "includeItemsFromAllDrives": true,
      "orderBy": "name",
      "pageSize": 1000,
      "q": "'FOLDER_ID' in parents",
      "supportsAllDrives": true,
      "fields": "files(name,fileExtension,starred,size),nextPageToken",
      "pageToken": pageToken
    }).then(res => resolve(res)).catch(err => reject(err));
  });
}

async function execute() {
  let fileList = [];
  let pageToken = "";
  do {
    const obj = await getList(pageToken).catch(err => console.log(err));
    if (obj.result.files.length > 0) fileList = [...fileList, ...obj.result.files];
    pageToken = obj.result.nextPageToken;
  } while (pageToken);
  console.log(fileList)
}
  • 当此脚本为运行时,使用nextPageToken检索超过1000个文件的文件列表。

注:

  • 如果您想将“文件:列表”方法与 Google Apps 脚本一起使用,以下线程可能会有用。在这种情况下,Google Apps Script 的 Advanced Google services 的 Drive API 是版本 2。请注意这一点。
    • Is there anyway to use 'size' as a search parameter with DriveApp.searchFiles in Google Apps Script?

    • 使用您的参数的 Google Apps 脚本的示例脚本如下。当您使用此脚本时,please enable Drive API at Advanced Google Services.

        function myFunction() {
          let fileList = [];
          let pageToken = "";
          do {
            const obj = Drive.Files.list({
              "includeItemsFromAllDrives": true,
              "orderBy": "title",
              "maxResults": 1000,
              "q": "'FOLDER_ID' in parents",
              "supportsAllDrives": true,
              "fields": "nextPageToken,items(title,fileExtension,fileSize,labels(starred))",
              "pageToken": pageToken
            });
            if (obj.items.length > 0) fileList = [...fileList, ...obj.items];
            pageToken = obj.nextPageToken;
          } while(pageToken);
          console.log(fileList)
        }
      

参考: