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