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

Mic*_*Sz. 0 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())
  }
}
Run Code Online (Sandbox Code Playgroud)

我越来越:

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

while (files.hasNext())语句行。

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

这是否意味着.searchFiles('123')返回的对象有问题(它应该返回FileIterator对象)?不幸的是,Javascript 只在运行时检查返回数据类型,所以在我运行它之前我无法真正查看它是否正确。

teh*_*wch 5

根据 的函数文档searchFiles,预期参数是符合 Google Drive API 的“搜索文件”指南中描述的语法的查询字符串

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

需要注意的是驱动器V2使用title的文件名,和驱动器V3使用name的文件名。Apps Script 的高级服务客户端库Drive使用 v2,因此这可能也是 Drive Service ( DriveApp)使用的语法。

错误信息没有出现在 with 行searchFiles的原因是因为返回值是 a FileIterator,而不是实际结果。这个(和大多数)迭代器是惰性求值的,因此您的搜索查询在您调用之前实际上不会执行files.hasNext()

要解决此问题,您必须指明应该搜索什么以及如何搜索,即提供FieldOperator,而不仅仅是Value

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 根据您的回答从“名称”切换到“标题”为我解决了这个问题。他们链接的参考文档引导我来到这里https://developers.google.com/drive/api/v3/search-parameters#fn5,没有提及“标题”。 (3认同)