Как отфильтровать по пути к файлу в скрипте Google Apps - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь использовать следующий фильтр сценариев по пути к файлу.В идеале это должно показывать результаты только из папки с пометкой «GUEST» на моем диске.Прямо сейчас он показывает эти и все остальное с идентификатором общей папки этого корня (я не хочу использовать идентификатор папки GUEST, потому что позже я буду использовать его для фильтрации других пользователей, обращающихся к моему диску).

Мой путь к файлу 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>

Я пытался использовать оператор if в строке 61, но по какой-то причине он не смог получить переменные (я думаю, что я не настраиваю свои переменныеправильно):

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

Кто-нибудь знает, как заставить этот скрипт фильтровать по folder_tree?Надеюсь, сравнив его с переменной var (например, user = guest)?

Чтобы уточнить, вот текущий результат:

enter image description here

И это ожидаемый результат:

enter image description here

Спасибо за любую помощь, я буду публиковать обновления, как я работаю над этим, чтобы уточнить.

1 Ответ

1 голос
/ 13 июля 2019
  • Вы хотите получить список файлов в определенной папке.
  • Не требуется извлекать подпапки в определенной папке.
  • Вы хотите добиться этого с помощью Google Apps Script.

Я мог понять, как выше. Если мое понимание верно, как насчет этой модификации? Я думаю, что ваш обновленный скрипт работает. Но я подумал, что ваш сценарий может быть изменен проще. Так как насчет следующей модификации?

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

  • В этой модификации getFileList() был изменен.
  • В вашем скрипте сначала извлекается дерево папок. Затем файлы во всех папках извлекаются. Но в вашей ситуации дерево папок не требуется для извлечения. Таким образом, ваш скрипт может быть изменен более просто.
  • Сначала "FileIterator" извлекается с DriveApp.getFoldersByName("GUEST").next().getFiles(). Затем значения извлекаются из «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;
}

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...