Folder.searchFiles()方法引发“无效参数:q”错误

时间:2018-08-30 14:54:59

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

给出以下Google Apps脚本代码段:

function myFunction() {
  var files = DriveApp.getFolderById('xxx').searchFiles('123')
  while (files.hasNext()) {
    var file = files.next()
      Logger.log(file.getName())
  }
}

我得到:

  

无效的参数:q(第x行,文件“代码”)

while (files.hasNext())语句开始。

该行不包含我知道的任何错误。有趣的是,当我将.searchFiles('123').getFiles()交换时,错误不会出现并且代码将执行。

这是否意味着.searchFiles('123')返回的对象存在问题(它应该返回FileIterator对象)?不幸的是,Javascript只在运行时检查返回数据类型,因此直到运行它我才真正看到它是否正确。

1 个答案:

答案 0 :(得分:2)

根据searchFiles的功能文档,期望的参数是一个查询字符串,该字符串符合Google Drive API "Search for Files " guide中描述的语法

  

获取用户云端硬盘中与给定搜索条件匹配的所有文件的集合。搜索条件在Google Drive SDK documentation中有详细说明。请注意,params参数是一个查询字符串,其中可能包含字符串值,因此请注意正确转义引号(例如"title contains 'Gulliver\\'s Travels'"'title contains "Gulliver\'s Travels"')。

请注意,Drive v2使用title作为文件名,Drive v3使用name作为文件名。 Apps Script的高级服务客户端库Drive使用v2,因此这也可能是Drive Service(DriveApp)使用的语法。

错误消息未出现在searchFiles的行中的原因是因为返回值是FileIterator,而不是实际结果。该(和大多数)迭代器是延迟计算的,因此直到您调用files.hasNext()才会真正执行搜索查询。

要解决此问题,您必须指明应搜索的内容以及搜索方式,即提供字段运算符,而不仅仅是

function foo() {
  const queries = ["fullText contains '123'",
                   "mimeType='" + MimeType.GOOGLE_SHEETS + "'"];
  const matches = queries.map(function (qs) {
    return getMatchingFiles_(qs);
  });
  // Log the results in the Apps Script logger. (Use console.log for Stackdriver)
  matches.forEach(function (queryResult, i) {
    Logger.log("Results for query #" + i
               + ", \"" + queries[i] + "\" are:");
    queryResult.forEach(function (file) {
      Logger.log(file.getId() + ": '" + file.getName() + "'");
    });
  });
}

function getMatchingFiles_(query, folderId) {
  // Default to DriveApp.searchFiles if no folder ID given.
  folder = folderId ? DriveApp.getFolderById(folderId) : DriveApp;
  const search = folder.searchFiles(query);
  const results = [];
  while (search.hasNext())
    results.push(search.next());

  return results;
}