Метод Folder.searchFiles () вызывает ошибку «Недопустимый аргумент: q» - PullRequest
0 голосов
/ 30 августа 2018

С учетом следующего фрагмента кода скрипта 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 проверяет только тип возвращаемых данных во время выполнения, поэтому я не могу понять, правильно ли он, пока не запустил его.

1 Ответ

0 голосов
/ 30 августа 2018

В документации по функции searchFiles ожидаемым аргументом является строка запроса, соответствующая синтаксису, описанному в руководстве «Поиск файлов» API Google Drive

Получает коллекцию всех файлов на диске пользователя, которые соответствуют заданным критериям поиска. Критерии поиска приведены в документации Google Drive SDK . Обратите внимание, что аргумент params является строкой запроса, которая может содержать строковые значения, поэтому старайтесь правильно экранировать кавычки (например, "title contains 'Gulliver\\'s Travels'" или 'title contains "Gulliver\'s Travels"').

Обратите внимание, что Диск v2 использует title для имени файла, а Диск v3 использует name для имени файла. В клиентской библиотеке расширенных служб Apps Script Drive используется версия v2, поэтому это может быть также синтаксис, используемый службой накопителей (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...