javascript - 如何在谷歌应用程序脚本中按文件路径过滤

标签 javascript google-apps-script

我正在尝试按文件路径过滤以下脚本。理想情况下,这应该只显示我驱动器中标记为“GUEST”的文件夹的结果。现在它显示那些和其他任何具有此根的共享文件夹 ID 的内容(我不想使用 GUEST 文件夹 ID,因为我稍后将使用它来过滤访问我的驱动器的其他用户)。

我的google drive文件路径如下Root/GUEST

根据评论中的答案更新了代码:

var folderId = "MyID"; // <--- Your shared folder ID

function doGet() {
    var t = HtmlService.createTemplateFromFile('index');
    t.data = getFileList();
    return t.evaluate() .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);;


}




function getparams(e) {
    return zipping(typeof(e.fileId) == "string" ? [e.fileId] : e.fileId);
}

function getFileList() {
    var folderlist = (function(folder, folderSt, results) {
        var ar = [];
        var folders = folder.getFoldersByName("GUEST");
        while (folders.hasNext()) ar.push(folders.next());
        folderSt += folder.getId() + "#_aabbccddee_#";
        var array_folderSt = folderSt.split("#_aabbccddee_#");
        array_folderSt.pop()
        results.push(array_folderSt);
        ar.length == 0 && (folderSt = "");
        for (var i in ar) arguments.callee(ar[i], folderSt, results);
        return results;
    })(DriveApp.getFoldersByName("GUEST").next(), "", []);
    var localTimeZone = Session.getScriptTimeZone();
    var filelist = [];
    var temp = {};
    for (var i in folderlist) {
        var folderid = folderlist[i][folderlist[i].length - 1];
        var folder = DriveApp.getFoldersByName("GUEST");
        var files = folder.next().getFiles();
        while (files.hasNext()) {
            var file = files.next();
            temp = {
               folder_tree: function(folderlist, i) {
                  
                    if (i > 0) {
                        return "/" + [DriveApp.getFolderById(folderlist[i][j]).getName() for (j in folderlist[i])
                            if (j > 0)].join("/") + "/";
                    } else {
                        return "/";
                    }
                }(folderlist, i),
                file_id: file.getId(),
                file_name: file.getName(),
                file_size: file.getBlob().getBytes().length,
                file_created: Utilities.formatDate(file.getDateCreated(), localTimeZone, "yyyy/MM/dd HH:mm:ss"),
                file_updated: Utilities.formatDate(file.getLastUpdated(), localTimeZone, "yyyy/MM/dd HH:mm:ss"),
            };
            filelist.push(temp);
            temp = {}
        }
    }
   
var sortedlist = filelist.sort(function(e1, e2) {
        return (e1.folder_tree > e2.folder_tree ? 1 : -1) });
  

    return sortedlist;  

}




function zipping(fileId) {
    var blobs = [];
    var mimeInf = [];
    fileId.forEach(function(e) {
        try {
            var file = DriveApp.getFileById(e);
            var mime = file.getMimeType();
            var name = file.getName();
        } catch (e) {
            return e
        }
        Logger.log(mime)
        var blob;
        if (mime.indexOf('google-apps') > 0) {
            mimeInf =
                mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
            blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "/export?mimeType=" + mimeInf[0], {
                method: "GET",
                headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
                muteHttpExceptions: true
            }).getBlob().setName(mimeInf[1]);
        } else {
            blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + e + "?alt=media", {
                method: "GET",
                headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
                muteHttpExceptions: true
            }).getBlob().setName(name);
        }
        blobs.push(blob);
    });
    var zip = Utilities.zip(blobs, Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd_HHmmss") + '.zip');
    var bytedat = DriveApp.createFile(zip).getBlob().getBytes();
    return Utilities.base64Encode(bytedat);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<script>
	  function postLogin(event) {
        var form = document.getElementById("myForm");
        form.submit();

        event.preventDefault();
    }
</script>	
	<a href="" onClick="postLogin(event);" >Click!</a>
	<form id="myForm" action="MYEXECLINK" target="my_iframe"></form>
	<iframe id="my_iframe"name="my_iframe"  style= "width: 500px; height: 50%;" frameBorder="0" style="overflow:hidden"></iframe>

我尝试在第 61 行使用 if 语句,但由于某种原因它无法提取变量(我认为我没有正确设置我的变量):

  if (filelist(folder_tree == "/GUEST/"){
    return sortedlist;}
  else
  {return null}

有谁知道如何通过 folder_tree 过滤这个脚本?希望通过将其与 var(如 user=guest)进行比较?

澄清一下,这是当前的结果:

enter image description here

这是预期的输出:

enter image description here

感谢您的帮助,我会在处理它时发布更新以进行澄清。

最佳答案

  • 您想检索特定文件夹下的文件列表。
  • 不需要检索特定文件夹中的子文件夹。
  • 您想使用 Google Apps 脚本实现这一目标。

我可以像上面那样理解。如果我的理解是正确的,这个修改怎么样?我认为您更新的脚本有效。但我认为您的脚本可以修改得更简单。那么下面的修改呢?

修改点:

  • 在本次修改中,修改了getFileList()
  • 在您的脚本中,首先检索文件夹树。然后,检索所有文件夹中的文件。但在您的情况下,不需要检索文件夹树。这样,您的脚本可以修改得更简单。
  • 首先,使用 DriveApp.getFoldersByName("GUEST").next().getFiles() 检索“FileIterator”。然后,从“FileIterator”中检索值。

修改后的脚本:

function getFileList() {
  var folderName = "GUEST";
  var files = DriveApp.getFoldersByName(folderName).next().getFiles();
  var localTimeZone = Session.getScriptTimeZone();
  var filelist = [];
  while (files.hasNext()) {
    var file = files.next();
    var temp = {
      file_id: file.getId(),
      file_name: file.getName(),
      file_size: file.getBlob().getBytes().length,
      file_created: Utilities.formatDate(file.getDateCreated(), localTimeZone, "yyyy/MM/dd HH:mm:ss"),
      file_updated: Utilities.formatDate(file.getLastUpdated(), localTimeZone, "yyyy/MM/dd HH:mm:ss"),
    };
    filelist.push(temp);
  }
  return filelist;
}

引用资料:

关于javascript - 如何在谷歌应用程序脚本中按文件路径过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56958675/

相关文章:

javascript - 如何使用 javascript 访问(编辑和阅读)与我共享的谷歌文档

javascript - 如何查询谷歌工作表列的某个值

javascript - 获取 map Angular 点的坐标

Javascript Canvas ,在错误的坐标处绘制

javascript - 成员函数的 JS 最佳实践

html - 如何阻止按钮从屏幕上消失?

javascript - Google 分析 - 电子商务产品列表

javascript - Symfony2 Assetic 无法使用带 * 号的多个 javascript 文件

javascript - force_reply 在地址栏中工作,但在 Google Apps 脚本中的代码中不起作用

javascript - 如何修复 "Service invoked too many times in a short time: exec qps."