【问题标题】:Google Drive REST API v2 file properties array in Google Apps Script is undefined?Google Apps 脚本中的 Google Drive REST API v2 文件属性数组未定义?
【发布时间】:2017-02-04 18:58:50
【问题描述】:

我正在使用 Google Apps 脚本管理一些 Google Drive 文件。这个项目的一部分是审查文件的属性,所以我使用的是 Drive API 而不是 DriveApp。此外,Google Apps 脚本目前可以访问 Drive REST API v2 而不是 v3。

我已经成功设置了一个属性 (id),并且能够使用该属性集提取文件。

console = Logger;
function Files (folderId) {
  var optionalArgs,response
  ;
  optionalArgs = {
    q:'"'+folderId+'" in parents',
    spaces:"drive"
  }
  do {
    response = Drive.Files.list(optionalArgs);
    response.items.forEach(function (file) {
      console.log(file.properties);
      var id = file.properties.find(function (property) {
        return property.key === 'id';
      });
      this[id.value] = file;
    },this);
  } while (optionalArgs.pageToken = response.nextPageToken);
}

运行此功能时,我可以在日志中看到文件属性

[{visibility=PUBLIC, kind=drive#property, etag="3GjDSTzy841RsmcBo4Ir-DLlp20/HGzJl78t8I2IehiAlaGXTkm2-C4", value=9e18766b-1cc9-4c1b-8003-b241f43db304, key=id}]

但得到

TypeError : 无法调用未定义的方法“find”。

我无法遍历这个结果数组。在其上使用 JSON.parse 会尝试将其转换为对象,这对于具有多个属性的文件是有问题的。在其上使用 JSON.parse(JSON.stringify()) 会导致

SyntaxError: Unexpected token: u

据我了解,这是由于值未定义造成的。如果我的日志没有告诉我,我可以使用它。

【问题讨论】:

    标签: javascript google-apps-script google-drive-api


    【解决方案1】:

    "nextPageToken(string) 下一页文件的页面标记。如果到达文件列表的末尾,则此标记将不存在。"

    引用自:https://developers.google.com/drive/v2/reference/files/list#examples

    所以这行给 optionalArgs.pageToken 赋了一个未定义的值

    while (optionalArgs.pageToken = response.nextPageToken);
    

    并且不会终止循环。更好的方法是在循环内分配 optionalArgs.pageToken 的值,如果它的值未定义,则中断循环,如下所示:

    console = Logger;
    function Files (folderId) {
      var optionalArgs,response
      ;
      optionalArgs = {
        q:'"'+folderId+'" in parents',
        spaces:"drive"
      }
      do {
        response = Drive.Files.list(optionalArgs);
        response.items.forEach(function (file) {
          console.log(file.properties);
          var id = file.properties.find(function (property) {
            return property.key === 'id';
          });
          this[id.value] = file;
        },this);
    // Assign the value inside the loop
    optionalArgs.pageToken = response.nextPageToken
    } while (optionalArgs.pageToken != undefined) // check to see if it undefined here and break the loop.
    }
    

    【讨论】:

    • 我很欣赏更可接受的赋值方法,但这不是我遇到的问题。此外,它确实会在预期时终止循环。
    【解决方案2】:

    您可以通过在高级 Google 服务选项中选择版本来在 Google Apps 脚本中使用 v3:

    请注意,您必须遵循如何在 Google Drive v3 中请求,但您仍然可以使用 v2,因为所有示例仍在 v2 中。

    关于您的错误,在Listing folders 的示例代码中使用他们的代码。

    function listRootFolders() {
      var query = '"root" in parents and trashed = false and ' +
          'mimeType = "application/vnd.google-apps.folder"';
      var folders, pageToken;
      do {
        folders = Drive.Files.list({
          q: query,
          maxResults: 100,
          pageToken: pageToken
        });
        if (folders.items && folders.items.length > 0) {
          for (var i = 0; i < folders.items.length; i++) {
            var folder = folders.items[i];
            Logger.log('%s (ID: %s)', folder.title, folder.id);
          }
        } else {
          Logger.log('No folders found.');
        }
        pageToken = folders.nextPageToken;
      } while (pageToken);
    }
    

    您还可以阅读以上文档的更多代码实现。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 2015-07-10
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多