Как отфильтровать Google Drive API v3 mimeType? - PullRequest
1 голос
/ 28 мая 2020

Я написал сценарий, который использует DriveApp для чтения Google Диска, SpreadsheetApp для регистрации данных в таблицах и Google Drive API v3 + сервисный аккаунт + OAuth для внесения изменений от имени пользователей G Suite.

Это будет Было бы неплохо выполнять поиск на Google Диске с точки зрения целевого пользователя (вызывая Google Drive API v3) вместо учетной записи, в которой запущен скрипт (вызывая DriveApp). Не могу заставить фильтр работать.

Запрос создается с ключами родительской папки, mimeType = или mimeType != для папок и передается в функцию. Формат:

var query = "('GoogleDriveFolderKey01' in parents or 'GoogleDriveFolderKey02' in parents) and trashed = false and mimeType = 'application/vnd.google-apps.folder'"

Функция DriveApp использует:

files = Drive.Files.list({
  q: query,
  maxResults: 100,
  pageToken: pageToken
});

Функция Google Drive API v3 использует:

var url = 'https://www.googleapis.com/drive/v3/files/'
var options = {
  'contentType': 'application/json',
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
  'corpora'    : 'domain',
  'q'          : query,
  'spaces'     : 'drive',
  'pageSize'   : 100,
  'pageToken'  : pageToken
};
var response = UrlFetchApp.fetch(url, options);

var resultParsed = JSON.parse(response.getContentText());
files = resultParsed.files
pageToken = resultParsed.pageToken

Результаты с DriveApp следующие. ожидается, но Google Drive API v3 дает:

"files": [
{
  "kind": "drive#file",
  "id": "01abc123_etc",
  "name": "Something something (2021-04-15).pdf",
  "mimeType": "application/pdf"
},
{
  "kind": "drive#file",
  "id": "02ABC4321-qwertyuiop",
  "name": "Super Special Worksheet",
  "mimeType": "application/vnd.google-apps.spreadsheet"
},
{
  "kind": "drive#file",
  "id": "whatever",
  "name": "Copy of V1",
  "mimeType": "application/vnd.google-apps.folder"
},
...

Есть идеи?

Изменить:

Спасибо! Проблема, кажется, в «корпусе» и «пространстве». В Google AppsScript я использовал:

var options = {
  'contentType': 'application/json',
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
  'pageSize'   : 100
};
url += '?q=' + encodeURIComponent(query);
if ( pageToken.length > 0 ) url += '&pageToken=' + pageToken;
var response = UrlFetchApp.fetch(url, options);

1 Ответ

1 голос
/ 29 мая 2020

Как насчет этого ответа?

Точки модификации:

  • В методе «Файлы: список» в Drive API v3 значения corpora, q, space, pageSize, pageToken используются в качестве параметры запроса. Я думаю, что причина вашей проблемы в этом.
  • В методе GET contentType не требуется.

Измененный скрипт:

Когда ваш скрипт изменяется, он выглядит следующим образом.

var query = "('GoogleDriveFolderKey01' in parents or 'GoogleDriveFolderKey02' in parents) and trashed = false and mimeType = 'application/vnd.google-apps.folder'"

var url = 'https://www.googleapis.com/drive/v3/files'  // Modified
var options = {  // Modified
  'method'     : 'get',
  'headers'    : { Authorization: 'Bearer ' + service.getAccessToken() },
  'muteHttpExceptions': true,
};
url += `?corpora=domain&q=${encodeURIComponent(query)}&spaces=drive&pageSize=100&pageToken=${pageToken}`;  // Added

var response = UrlFetchApp.fetch(url, options);
var resultParsed = JSON.parse(response.getContentText());
files = resultParsed.files
pageToken = resultParsed.pageToken

Примечание:

  • Этот модифицированный скрипт предполагает, что service.getAccessToken() может использоваться для использования метода «Файлы: список» в Drive API v3.
  • В случае возникновения ошибки удалите corpora=domain из URL-адреса, как показано ниже, и проверьте его снова.

    url += `?q=${encodeURIComponent(query)}&spaces=drive&pageSize=100&pageToken=${pageToken}`;
    

Ссылка:

...