google-apps-script - 无法使用 Google Apps 脚本搜索名称中带下划线的文件

标签 google-apps-script

我正在使用 Google Apps 脚本在我的云端硬盘帐户中按名称查找文件。我在查找名称包含下划线的文件时遇到问题。

例如,我有一个名为FB_51.pdf的文件

此代码不检索文件

folder.searchFiles('title contains "51"');

此代码不检索文件

folder.searchFiles('title contains "_51"');

但是这段代码检索文件

folder.searchFiles('title contains "FB_51"');

我想检索只有两位数字“51”的文件。

最佳答案

不幸的是,我相信您所认为的故障实际上是​​从 Google 的角度来看是“设计使然”的。 Apps Script doc on searching 都不是,也不是 page that doc links to提到这个,但我在 API docs page for search syntax 找到了答案, 在脚注下:

The contains operator only performs prefix matching for a name. For example, the name "HelloWorld" would match for name contains 'Hello' but not name contains 'World'.

这对我来说似乎很确定,但为了确定,我用你的例子进行了测试:

Log

在这种情况下,Google 将下划线视为普通字符,而不是定界符或单词边界,因此“FB_51”被视为一个单词,而不是“FB”和“51”,因此它只能匹配精确的单词匹配或前缀匹配(根据我在上面提出的警告)。

备选

除了强制您的文件采用适合搜索语法的格式(例如交换为 51_FB.pdf),或者始终在您的搜索词前加上 FB_ 前缀,如果文件始终匹配该语法,您的选择非常有限。您最好的选择可能是将搜索的起点限制在尽可能窄的位置,例如特定的 Drive 文件夹,然后获取所有文件,遍历它们,并使用 Regex 来匹配文件名。示例脚本:

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"
 */

当然,如果您的文件确实总是以 FB_ 开头,您也可以只创建一个包装函数以始终将该字符串添加到您的搜索中。


注意 - 为什么这是设计使然:

这是“设计使然”并且 Google 似乎关心单词边界和标记化的原因是字符串匹配的工作原理。通常,当我们搜索某些内容时,我们希望搜索查询中的每个标记都有一个完整的词(或相似词)匹配。如果搜索无法以这种方式进行,则搜索“51”可能会提取“fileA-v5251989.jpg”之类的文件,或者搜索“cat”会匹配“乘法”和“修改”。

关于google-apps-script - 无法使用 Google Apps 脚本搜索名称中带下划线的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693341/

相关文章:

java - Google 电子表格月份减 1

google-apps-script - 如何在谷歌电子表格应用程序中使用 Browser.msgBox 响应?

google-apps-script - Google Apps 脚本可以用于随机化 Google 表单上的页面顺序吗?

javascript - Google 脚本网络应用程序提交后变为空白页

javascript - Google Script 解析文本

google-apps-script - 提交 Google 表单后如何发送电子邮件?

regex - BigQuery REGEXP_MATCH 和口音 : boundary wildcard fails?

Javascript API GET 请求失败,代码为 404。服务器响应被 chop

Google AppS 脚本项目中的 TypeScript 类顺序

javascript - 如何在 Google 表格中包含多个单词的单元格中搜索特定单词并返回结果?