Список папок из каталога, идентификатор которого не является определенным значением в Google Drive API v3 и C#

#c# #google-api #google-drive-api #google-api-dotnet-client

#c# #google-api #google-drive-api #google-api-dotnet-client

Вопрос:

Я хочу получить список вложенных папок из идентификатора папки, но за исключением определенных идентификаторов (не всех из них). Я имел в виду, что хочу получить дочерние элементы, идентификатора которых нет в списке, который я предоставляю

  public async Task<FileListData> ListWithoutIds(string id, int itemsPerPage = 10, string nextPageToken = null, bool onlyFolders = false, bool onlyFiles = false, string[] excludeIds = null)
{
  if (string.IsNullOrWhiteSpace(id))
  {
    throw new ArgumentException($"'{nameof(id)}' cannot be null or whitespace", nameof(id));
  }

  var request = PrepareListRequest(itemsPerPage, nextPageToken);
  request.Q = $"'{id}' in parents";
  if (onlyFolders)
  {
    request.Q = $"{request.Q} and mimeType='application/vnd.google-apps.folder'";
  }
  else if (onlyFiles)
  {
    request.Q = $"{request.Q} and not mimeType='application/vnd.google-apps.folder'";
  }

  if (excludeIds?.Length > 0)
  {
    request.Q = $"{request.Q} {string.Join(" ", excludeIds.Select(e => $"and not id='{e}'"))}";
  }

  return FileListData.From(await request.ExecuteAsync()); // here I got 400 error
}
  

и

 private FilesResource.ListRequest PrepareListRequest(int itemsPerPage, string nextPageToken, string[] specificFields = null)
{
  var request = driveService.Files.List();
  request.PageSize = itemsPerPage;
  request.SupportsAllDrives = true;
  request.IncludeItemsFromAllDrives = true;

  if (!string.IsNullOrWhiteSpace(nextPageToken))
  {
    request.PageToken = nextPageToken;
  }

  if (specificFields?.Length > 0)
  {
    var fields = $"{string.Join(",", specificFields)}";
    request.Fields = $"nextPageToken, files({fields.Trim(',')})";
  }
  else
  {
    request.Fields = "nextPageToken, files";
  }
  return request;
}
  

Выполняемый запрос выглядит следующим образом:

 'parentFolderId' in parents and mimeType='application/vnd.google-apps.folder' and not id='Child1Id' and not id='Child2Id' and not id='Child3Id'
  

И я получил ошибку 400.

Как этого добиться?

Комментарии:

1. Параметр Q очень ограничен, это не то, что вы можете сделать в одном запросе. Я бы перебрал ваши дочерние элементы и создал ответ, который вы ищете. если вы проверите документацию, вы заметите, что вы вообще не можете выполнять поиск по идентификатору developers.google.com/drive/api/v3/ref-search-terms

2. Я не использую v2, я использую v3

3. То же самое для v3: developers.google.com/drive/api/v3/ref-search-terms

4. Единственное различие между drive v2 и drive v3 заключается в том, что его имя, а не заголовок. 😉

5. Поэтому они не заинтересованы в выполнении таких операций

Ответ №1:

Функциональность запроса Drive API довольно ограничена, идентификатор результатов списка не является возможным термином запроса.

Вам необходимо реконструировать логику вашего кода.

  • Сначала получите список ваших папок с запросом 'parentFolderId' in parents and mimeType='application/vnd.google-apps.folder' и установите Fields значение files/id
  • Впоследствии программно реализуйте фильтр для вычитания из общего списка идентификаторов идентификаторов, которые вы хотите исключить.