Javascript Google应用程序脚本中的Google Drive REST API v2文件属性数组未定义?

Javascript Google应用程序脚本中的Google Drive REST API v2文件属性数组未定义?,javascript,google-apps-script,google-drive-api,Javascript,Google Apps Script,Google Drive Api,我正在使用谷歌应用程序脚本管理一些谷歌硬盘文件。这个项目的一部分是检查文件的属性,所以我使用的是驱动器API而不是DriveApp。此外,Google Apps脚本目前可以访问而不是v3 我已成功设置属性(id),并能够使用该属性集提取文件 console = Logger; function Files (folderId) { var optionalArgs,response ; optionalArgs = { q:'"'+folderId+'" in parents

我正在使用谷歌应用程序脚本管理一些谷歌硬盘文件。这个项目的一部分是检查文件的属性,所以我使用的是驱动器API而不是DriveApp。此外,Google Apps脚本目前可以访问而不是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);
}
运行此函数时,我可以在日志中看到文件属性

[{可见性=公共,种类=驱动器#属性,etag=“3gjdstzy841rscmbo4ir-DLlp20/hgzjl78t8i2eiehialagxtkm2-C4”,值=9e18766b-1cc9-4c1b-8003-b241f43db304,键=id}]

但是得到

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

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

SyntaxError:意外标记:u

据我所知,这是由于该值未定义造成的。如果我的日志没有告诉我其他情况,我可以使用它。

“下一页获取(字符串)下一页文件的页面标记。如果已到达文件列表的末尾,则此标记将不存在。

引自:

因此,此行为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.
}

通过在“高级谷歌服务”选项中选择版本,可以在谷歌应用程序脚本中使用v3:

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

关于您的错误,请在的示例代码中使用它们的代码

函数listRootFolders(){
var query='父级中的“根”,trashed=false和'+
'mimeType=“application/vnd.google apps.folder”';
var文件夹,pageToken;
做{
文件夹=Drive.Files.list({
问:质疑,,
最大结果:100,
pageToken:pageToken
});
如果(folders.items&&folders.items.length>0){
对于(var i=0;i
您还可以阅读上述文档的更多代码实现


希望这能有所帮助。

我很欣赏更为公认的赋值方法,但这不是我遇到的问题。此外,它确实会在预期的情况下终止循环。
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);
}