Не могу найти файлы с подчеркиванием в имени с помощью Google Apps Script - PullRequest
2 голосов
/ 20 июня 2019

Я использую Google Apps Script для поиска файлов по имени в моей учетной записи Drive.У меня проблемы с поиском файлов, имена которых содержат подчеркивания.

Например, у меня есть файл с именем FB_51.pdf

Этот код не получает файл

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

Этот код не извлекает файл

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

Но этот код извлекает файл

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

Я бы хотел получить файл только с двумя цифрами "51".

1 Ответ

2 голосов
/ 21 июня 2019

К сожалению, я считаю, что то, что вы воспринимаете как сбой, на самом деле считается "задуманным" с точки зрения Google. Ни в документе Apps Script при поиске , ни на странице , которая ссылается на , не упоминается об этом, но я нашел ответ на странице API документации для синтаксиса поиска , под сноской:

Оператор содержимого выполняет только сопоставление префиксов для имени. Например, имя «HelloWorld» будет соответствовать, поскольку имя содержит «Hello», но имя не содержит «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» будет соответствовать «умножению» и «модификации».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...