【问题标题】:Show Files In Folder not Working显示文件夹中的文件不起作用
【发布时间】:2015-05-11 11:11:34
【问题描述】:

我收到错误“未定义“DocsList”。到我的脚本,该脚本在禁用“DocsList”之前工作正常。我在网上搜索了一个可能的解决方案,发现我必须将“DocsList”更改为“DriveApp”才能让我的脚本正常工作。但是,没有信息被填充。我不知道出了什么问题。有什么帮助吗?

原版:

function ShowFilesInFolder() {
var files = DocsList.getFolderById(id).getFolders();

// Get the active spreadsheet and the active sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

// Set up the spreadsheet to display the results
var headers = [["Folder Name", "Owner", "URL"]];
sheet.clear();
sheet.getRange("A1:C1").setValues(headers);


// Loop through the results and display the file name, file type, and URL
for (var i = 0; i < files.length; i++) {
sheet.getRange(i+2, 1, 1, 1).setValue(files[i].getName());
sheet.getRange(i+2, 2, 1, 1).setValue(files[i].getOwner());

sheet.getRange(i+2, 3, 1, 1).setValue('https://drive.google.com/?tab=mo&authuser=0#folders/' + files[i].getId());
  }
}

修正版:

   function ShowFilesInFolder() {
   var folder = DriveApp.getFoldersByName(name);
   var files = DriveApp.getFolders();

// Get the active spreadsheet and the active sheet
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getActiveSheet();

// Set up the spreadsheet to display the results
   var headers = [["Folder Name", "Owner", "URL"]];
   sheet.clear();
   sheet.getRange("A1:C1").setValues(headers);


// Loop through the results and display the file name, file type, and URL
   for (var i = 0; i < files.length; i++) {
   sheet.getRange(i+2, 1, 1, 1).setValue(files[i].getName());
   sheet.getRange(i+2, 2, 1, 1).setValue(files[i].getOwner());

   sheet.getRange(i+2, 3, 1, 1).setValue('https://drive.google.com/drive/u/0/my-drive' + files[i].getId());
  }
 }

【问题讨论】:

标签: google-apps-script


【解决方案1】:

DriveApp.getFolders(); 不返回一个数组,而是一个名为 Folder Iterator 的 GAS 类,文档很短,但你需要的。

顺便说一句,为什么将包含文件夹的变量称为文件?

而且您的代码确实效率低下,请花点时间阅读Best Practices,了解如何通过一次调用来写入所有值。

【讨论】:

    【解决方案2】:

    DocsList 已被弃用,您应该将其替换为:

      var files = DriveApp.getFilesByName([FILENAME]);
      while (files.hasNext()) {
        var data = files.next().getBlob().getDataAsString()
     }
    

      var folder = DriveApp.getFolderById(id).getFolders();
      while (folder.hasNext()) {
        var x = folder.next()....
      }
    

    ...你得到了图片,祝你好运

    【讨论】:

      【解决方案3】:

      您没有从 DriveApp .getFolders() 获得数组,而是一个迭代器。只要还有内容要处理,就可以快速将其映射到 while 循环内的数组或对象以完成。

      while (folders.hasNext()) {
        folder = folders.next();
        // do stuff with folder
      }
      

      将这些与将文件夹列表处理成二维数组以更有效地使用电子表格应用程序可能会导致对您的代码进行以下修订。

      function ShowSubfolders(name) {
        var parentFolder = DriveApp.getFoldersByName(name),
            folders = DriveApp.getFolders(),
            foldersArray = [],
            folder,
            ss = SpreadsheetApp.getActiveSpreadsheet(),
            sheet = ss.getActiveSheet(),
            headers = [["Folder Name", "Owner", "URL"]],
            values = [];
      
        while (folders.hasNext()) {
          folder = folders.next();
          foldersArray.push({name: folder.getName(), owner: folder.getOwner(), id: folder.getId(), url: folder.getUrl()});
        }
      
        // map folderArray to sheet format 
        values = headers.concat(folderArray.map(function(f) { return [f.name, f.owner, f.id, f.url]; }));
      
        sheet.clear();  
        sheet.getRange(1,1,folderValues.length + 1, 4).setValues(values);
      }
      

      请注意,Google 云端硬盘中的文件夹不一定按照您习惯的方式行事,因为所有内容都是参考/别名,同一文件夹可以有效地同时位于多个位置,即使您要查找的其他数据也是如此保持不变。

      【讨论】:

        猜你喜欢
        • 2017-09-03
        • 1970-01-01
        • 2018-06-22
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 2019-05-23
        相关资源
        最近更新 更多