给出以下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只在运行时检查返回数据类型,因此直到运行它我才真正看到它是否正确。
答案 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;
}