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

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”的文件。

Jos*_*a T 5

不幸的是,我相信您所认为的故障实际上从谷歌的角度来看是“设计使然”。有关搜索的 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”将匹配“乘法”和“修改”。