Как удалить список файлов, соответствующих критериям, с помощью Google Drive API и Javascript?

Я хочу получить список вещей с помощью get list (который я уже закодировал), но затем я хочу кнопку удаления, которая удаляет все вещи в этом списке. Как я могу сделать это с помощью Google Drive SDK и Javascript?

Пример, если мои критерии:

 q: "starred = "+test+" and viewedByMeTime < '"+n+""

Как удалить каждый файл, который соответствует этим критериям?

Ссылки: https://developers.google.com/drive/v2/reference/files/delete https://developers.google.com/drive/v2/web/search-parameters

Я попытался подобрать файл поиска и удалить файлы вместе, но у меня это плохо получается, и я не уверен, какая переменная представляет все найденные файлы, соответствующие критериям, и как получить эту переменную для fileID:

 function DeleteFiles() {
var x = document.getElementById("ResultShown").value;


var date = new Date();
date.setDate(date.getDate() - 180);
var n = date.toISOString().split('.')[0] ;
  var test = false;

    gapi.client.drive.files.list({

      pageSize: x,
     q: "starred = "+test+" and viewedByMeTime < '"+n+"'",


      fields: "nextPageToken, files(id)",
     }

    ).then(function deleteFile(fileId)) {
  var request = gapi.client.drive.files.delete({
  appendPre('Files:');
      var files = response.result.files;
      if (files && files.length > 0) {
        for (var i = 0; i < files.length; i++) {
          var file = files[i];
'fileId': fileId
  });
     request.execute(function(resp) { })
        }
      } 
    });
  }

1 ответ

Решение

Таким образом, используя Javascript Drive API, вы сначала выполните GET к конечной точке файлов, используя list действие, которое поддерживает ваш параметр запроса q, Похоже, вы уже поняли это.

Вы получите объект ответа - чтобы получить более конкретную информацию, вам потребуется опубликовать некоторый код. Вы используете VanillaJS XMLHttpRequestJQuery's $.ajax()Пожалуй, вкусный и родной асинхронный fetch() API? В любом случае, вы получите ответ, который можно проанализировать в JSON.

Как вы обнаружили, Drive API не поддерживает постоянное удаление нескольких ресурсов Drive за один запрос. На этом этапе вы можете переосмыслить архитектуру вашего приложения: удаление очень длинного списка может потребовать много HTTP-запросов. Это может привести к значительным накладным расходам, поэтому вы можете захотеть ограничить длину списков или сделать что-то еще более умное. Если вы решите пойти по этому пути, я бы предложил использовать fetch использовать API асинхронно.

Так после звонка JSON.parse(responseBody) (или же responseBody.json() если вы используете fetch()), вы получите что-то из Google API, которое выглядит следующим образом:

{
 "kind": "drive#fileList",
 "etag": "...",
 "selfLink": "https://www.googleapis.com/drive/v2/files",
 "nextPageToken": "...",
 "nextLink": "...",
 "incompleteSearch": false,
 "items": [
  {
   "kind": "drive#file",
   "id": "SOME FILE ID",
   "etag": "...",
   "selfLink": "...",
   "alternateLink": "...",
   "embedLink": "...",
   "openWithLinks": {
        ...
   },
   {
   "kind": "drive#file",
   "id": "SOME FILE ID",
   "etag": "...",
   "selfLink": "...",
   "alternateLink": "...",
   "embedLink": "...",
   "openWithLinks": {
        ...
   }
]

Итак, что вам нужно, это:

  1. Функция, которая:

    • Называется когда твой GET к файлам. список завершен.
    • Проходит через responseJSON.items и вызывает функцию ниже с itemId.
  2. Функция, которая выдает HTTP DELETE дали идентификатор.

Таким образом, без каких-либо конкретных деталей вашей реализации, общее решение для вашей цели может выглядеть так:

var apiEndpoint = new URL("https://www.googleapis.com/drive/v2/files"),
    params = {q: "some stuff", otherParams: "lol"}

// assemble GET querystring in a nice way
Object.keys(params).forEach(function(key) {
   apiEndpoint.searchParams.append(key, params[key]);
});

// go and fetch! (explicit HTTP header options optional but good practice)
fetch(apiEndpoint , {
                 method: 'GET',
                 mode: 'cors',
                 redirect: 'follow',
                 headers: new Headers({
                     'Content-Type': 'application/json'
                 })
             });
                 .then(function (responseBody) {
                     return responseBody.json();
                 })
                 .then(function (responseObj) {
                     for(i=0; i<responseObj.items.length; i++) {
                         asyncDeleteDriveItem(responseObj.items[i].id);
                     }
                 });

        });

function asyncDeleteDriveItem() {/* ... */}
Другие вопросы по тегам