0

我想用 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) { })
        }
      } 
    });
  }
4

1 回答 1

0

因此,使用 Javascript Drive API,您将首先使用支持您的查询参数的操作GET文件端点发出一个。听起来你已经想通了。listq

您将获得一个响应对象——为了更具体,您需要发布一些代码。你在使用 VanillaJS XMLHttpRequest、 jQuery$.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. 一个函数:

    • 当您的GETto files.list 完成时调用。
    • 循环responseJSON.items并使用 itemId 调用下面的函数。
  2. 发出HTTP DELETE给定 ID 的函数。

因此,如果没有任何具体的实现细节,用于您目的的通用解决方案可能如下所示:

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() {/* ... */}
于 2017-03-10T01:39:01.337 回答