Lau*_*cin 3 google-apps-script
我正在使用 Google Apps 脚本在我的云端硬盘帐户中按名称查找文件。我在查找名称包含下划线的文件时遇到问题。
例如,我有一个名为 FB_51.pdf 的文件
此代码不检索文件
folder.searchFiles('title contains "51"');
Run Code Online (Sandbox Code Playgroud)
此代码不检索文件
folder.searchFiles('title contains "_51"');
Run Code Online (Sandbox Code Playgroud)
但是这段代码检索文件
folder.searchFiles('title contains "FB_51"');
Run Code Online (Sandbox Code Playgroud)
我想检索仅包含两位数字“51”的文件。
不幸的是,我相信您所认为的故障实际上从谷歌的角度来看是“设计使然”。有关搜索的 Apps 脚本文档和文档链接到的页面都没有 提到这一点,但我在搜索语法的 API 文档页面的脚注下找到了答案:
contains 运算符仅对名称执行前缀匹配。例如,名称“HelloWorld”将匹配名称包含“Hello”的名称,但不匹配名称包含“World”的名称。
这对我来说似乎很确定,但为了确定,我用你的例子进行了测试:
在这种情况下,Google 将下划线视为普通字符,而不是分隔符或单词边界,因此“FB_51”被视为单个单词,而不是“FB”和“51”,因此它只能匹配精确的单词匹配,或前缀匹配(根据我上面提出的警告)。
除了强制您的文件采用适合搜索语法的格式(例如交换为51_FB.pdf),或始终在搜索词前加上 前缀FB_,如果文件始终与该语法匹配,您的选择非常有限。最好的选择可能是将搜索的开始限制在尽可能窄的位置,例如特定的云端硬盘文件夹,然后获取所有文件,迭代它们,并使用正则表达式来匹配文件名。示例脚本:
function findNumberedPdf(folderId, number) {
var folder = DriveApp.getFolderById(folderId);
var files = folder.searchFiles("mimeType contains 'pdf'");
while (files.hasNext()) {
var file = files.next();
var regPattern = new RegExp(number);
if (regPattern.test(file.getName())) {
return file;
}
}
return false;
}
/**
* Test:
* Logger.log(findNumberedPdf('0CdI2-...', 51).getName());
* >> "FB_51.pdf"
*/
Run Code Online (Sandbox Code Playgroud)
当然,如果您的文件确实始终以 开头FB_,您也可以创建一个包装函数来始终将该字符串添加到您的搜索中。
这是“设计使然”的原因,并且 Google 似乎关心单词边界和标记化,这是因为字符串匹配的工作原理。通常,当我们搜索某些内容时,我们期望搜索查询中的每个标记都有完整的单词(或相似的单词)匹配。如果搜索不能以这种方式工作,搜索“51”可能会提取“fileA-v5251989.jpg”之类的文件,或者搜索“cat”将匹配“乘法”和“修改”。
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |