在 Google 云端硬盘中查找或创建文件夹

Find or create folder in Google Drive

语境:建筑精彩Screenity Chrome Extension

问题:我已经能够成功地创建一个具有所需名称的新文件夹,但即使在创建后我也无法找到该文件夹​​。

这一 node.js 应该获取我的文件夹 ID,但它只是返回“未定义”:

function saveDrive() {
        chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
            if (!token) {
              return;
            }

            var metadata = {
                q: "mimeType = 'application/vnd.google-apps.folder' and name = 'TESTSCREENITYFOLDER'"
            };
            var form = new FormData();
            form.append('metadata', new Blob([JSON.stringify(metadata)], {type: 'application/json'}));

            // Upload to Drive
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://www.googleapis.com/drive/v3/files');
            xhr.setRequestHeader('Authorization', 'Bearer ' + token);
            xhr.responseType = 'json';
            xhr.onload = () => {
                var folderId = xhr.response.files.data.id;
                
                // Open folder in Drive in a new tab
                chrome.tabs.create({
                     url: "https://drive.google.com/drive/u/0/folders/"+folderId
                });
            };
            xhr.send(form);
        });
    }

另一方面,这对于创建文件夹非常有效:

function saveDrive() {
        chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
            if (!token) {
              return;
            }

            var folderName = "Screenity"
            var metadata = {
                name: [folderName],
                mimeType: 'application/vnd.google-apps.folder'
            };

            var form = new FormData();
            form.append('metadata', new Blob([JSON.stringify(metadata)], {type: 'application/json'}));

            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart');
            xhr.setRequestHeader('Authorization', 'Bearer ' + token);
            xhr.responseType = 'json';
            xhr.onload = () => {
                var folderId = xhr.response;
                $("#share span").html("Save to Drive");
                $("#share").css("pointer-events", "all");
                
                // Open file in Drive in a new tab
                chrome.tabs.create({
                     url: "https://drive.google.com/drive/u/0/folders/"+folderId
                });
            };
            xhr.send(form);
        });
    }

知道我在第一个代码块中出错了吗?我在其中尝试获取特定命名文件夹的 ID?

修改点:

  • Drive API v3的“Files: list”方法中,使用了GET方法。所以请求中没有使用form的请求体。在这种情况下,需要使用 q 的搜索查询作为查询参数。

当以上几点反映到你的脚本中,就会变成下面这样。

发件人:

var metadata = {
    q: "mimeType = 'application/vnd.google-apps.folder' and name = 'TESTSCREENITYFOLDER'"
};
var form = new FormData();
form.append('metadata', new Blob([JSON.stringify(metadata)], {type: 'application/json'}));

// Upload to Drive
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/drive/v3/files');
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.responseType = 'json';
xhr.onload = () => {
    var folderId = xhr.response.files.data.id;
    
    // Open folder in Drive in a new tab
    chrome.tabs.create({
         url: "https://drive.google.com/drive/u/0/folders/"+folderId
    });
};
xhr.send(form);

收件人:

const url = 'https://www.googleapis.com/drive/v3/files?q=' + encodeURIComponent("mimeType = 'application/vnd.google-apps.folder' and name = 'TESTSCREENITYFOLDER'");
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.responseType = 'json';
xhr.onload = () => {
  var res = xhr.response.files;
  if (res.length > 0) {
    var folderId = res[0].id;
    console.log(folderId);  // You can check the retrieved folder ID here.

    // Open folder in Drive in a new tab
    chrome.tabs.create({
      url: "https://drive.google.com/drive/u/0/folders/"+folderId
    });
  } else {
    console.log("The folder of 'TESTSCREENITYFOLDER' was not found.");
  }
};
xhr.send();

注:

  • 在这个修改中,假设你的token可以用于使用“Files:list”的方法。请注意这一点。
  • 当您的 Google 驱动器中有多个具有相同文件夹名称的文件夹时,您可以检查 var res = xhr.response.files

参考: