【问题标题】:Google Script DriveApp assistanceGoogle Script DriveApp 协助
【发布时间】:2021-02-09 12:39:31
【问题描述】:

我一直在使用这个脚本,通过显示空文件夹并删除它们来帮助我在 Google 驱动器上找到管理文件夹。

我正在尝试修改它以使用 DriveApp.getFolderById('folderID') 按 ID 指定起始文件夹,但我不断收到错误。

这是一段原代码:

  function getEmptyFolders() {

    // Get sheet
    var sheet = SpreadsheetApp.getActive().getSheetByName('Manage Empty Folders')
    if (!sheet) {
        SpreadsheetApp.getActive().insertSheet('Manage Empty Folders')
    }

    var sheet = SpreadsheetApp.getActive().getSheetByName('Manage Empty Folders')
    var clearContent = sheet.clear()

    var folders = DriveApp.getFolders();

    var fileArray = [
        ["Folder Name", "Folder Id", "Folder URL"]
    ]
    while (folders.hasNext()) {

        var folder = folders.next()

        // If the folder has no files or child folder in it, call them out.
        if (folder.getFiles().hasNext() == false && folder.getFolders().hasNext() == false) {

            var name = folder.getName()
            var id = folder.getId()
            var url = folder.getUrl()

            // Push empty folder details into array
            fileArray.push([name, id, url])


        }

    }

    // formatting 
    var headerRow1 = sheet.getRange("A1:C1").setBackground("#d9d9d9").setFontColor("#000000").setFontWeight("Bold")
    sheet.setColumnWidths(1, 4, 300)

    // write results to the sheet
    sheet.getRange(1, 1, fileArray.length, 3).setValues(fileArray)

}

效果很好,但是当我尝试改变时

var folders = DriveApp.getFolders();

var folders = DriveApp.getFolderByID('folderID');

我收到一个错误:

TypeError: folders.hasNext is not a function

我对 Google Script 很陌生,并认为我理解了文档,但显然不是!

【问题讨论】:

    标签: google-apps-script google-drive-api


    【解决方案1】:

    问题

    • 这是因为getFolderById(id) 返回了一个folder 类型的对象,并且正如错误所暗示的,folder 没有方法hasNext,您也可以在附加的链接中看到。

    • 另一方面,getFolders() 返回一个FolderIterator 类型的对象,它实际上是文件夹对象的集合,因此需要hasNext() 来遍历这些文件夹。

    虽然你可以获取文件夹并遍历所有子文件夹:

    var main_folder = DriveApp.getFolderByID('folderID'); 
    var folders = main_folder.getFolders(); 
    

    解决办法:

    如果您想使用getFolderById,那么您应该删除while 循环。由于您有一个 single 文件夹,因此不需要迭代,实际上这样做是错误的:

    function getEmptyFolders() {
        // Get sheet
        var sheet = SpreadsheetApp.getActive().getSheetByName('Manage Empty Folders')
        if (!sheet) {
            SpreadsheetApp.getActive().insertSheet('Manage Empty Folders')
        }
        var sheet = SpreadsheetApp.getActive().getSheetByName('Manage Empty Folders')
        var clearContent = sheet.clear()
        // get the parent folder by its id
        var main_folder = DriveApp.getFolderById('folderID'); // new code
        // get all subfolders
        var folders = main_folder.getFolders(); // new code
    
    
        var fileArray = [
            ["Folder Name", "Folder Id", "Folder URL"]
        ]
        while (folders.hasNext()) {
    
            var folder = folders.next()
    
            // If the folder has no files or child folder in it, call them out.
            if (folder.getFiles().hasNext() == false && folder.getFolders().hasNext() == false) {
    
                var name = folder.getName()
                var id = folder.getId()
                var url = folder.getUrl()
    
                // Push empty folder details into array
                fileArray.push([name, id, url])
            }
        }
        // formatting 
        var headerRow1 = sheet.getRange("A1:C1").setBackground("#d9d9d9").setFontColor("#000000").setFontWeight("Bold")
        sheet.setColumnWidths(1, 4, 300)
        // write results to the sheet
        sheet.getRange(1, 1, fileArray.length, 3).setValues(fileArray)
    }
    

    【讨论】:

    • 好吧,这行得通,但我想我可能没有很好地解释自己。我想使用 folderID 作为“根”并递归地进入它寻找空文件夹。这只是告诉我指定的文件夹 ID 不为空 - 我需要了解所有子目录。
    • @Briggott 我更新了我的答案。让我知道它是否对你有用。
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多