【问题标题】:google script : listing files from google drive by get folderID from sheet range谷歌脚本:通过从工作表范围中获取文件夹 ID 列出来自谷歌驱动器的文件
【发布时间】:2017-07-12 11:09:23
【问题描述】:

我要做什么?

我正在尝试将我的 Google Drive 上的子文件夹“Annual Reports”中的所有文件列出到我的 Google 电子表格中但是

我的谷歌驱动器上有大量文件夹和子文件夹

当我尝试运行代码以获取所有文件夹和文件的列表时,导致错误“超过最大执行时间”

我的google drive文件夹的结构是

- My Drive

  - Subfolder 1: Documents by country or issue

       - Subfolder2 :Albania 

            - Subfolder3 :Annual Reports >files


      - Subfolder2 : Bulgaria 
            - Subfolder3 : Annual Reports >files

等等..每个国家

所以,我设法将我的子文件夹“按国家或问题划分的文档”设置为根文件夹并获取“年度报告”文件夹的 ID 列表

在这个脚本代码中

var sheet = SpreadsheetApp.getActiveSheet();
function generateFolderTree() {
  sheet.clear();

  sheet.appendRow(["Folder Name", "Rootfolder name", "ID"]);

  var parent = DriveApp.getFoldersByName("Documents by country or issue").next();

  getChildFolders(parent);

}

function getChildFolders(parent) {

  var childFolders = parent.getFolders();

  var parentName = parent.getName();

  while (childFolders.hasNext()) {

    var childFolder = childFolders.next();

    fileName = childFolder.getName();
    root = parentName + "/" + fileName;
    fileID = childFolder.getId();

    if (fileName == "Annual Reports") {
      sheet.appendRow([fileName, root, fileID]);
    } else if (fileName == "_Annual Reports") {
      sheet.appendRow([fileName, root, fileID]);
    }

它有效,我在我的工作表上得到了这样的结果(无法上传图片,不知道为什么)

A栏|| B栏|| C列

文件夹名称 ||根文件夹名称 ||身份证

年度报告 ||哥伦比亚/年度报告||
0Bz02kQQ7_a6paTM1SmdpZ01HYjQ

_年度报告||斯洛伐克 (SK)/_年度报告 ||0BwW8rsOAeCzneUlDUk1pcGNlVU0

年度报告 ||瑞士 (CH)/年度报告 ||0Bz02kQQ7_a6pZTJsWDR0elJTaDQ

所以我想知道***如何编写脚本来为每个国家/地区创建新工作表和

从我在电子表格中获得的文件夹 ID 中获取文件夹内的文件列表(例如从范围中获取值——C 列)。

或者有没有推荐的方法让这更容易?

谢谢。

【问题讨论】:

  • 您应该使用getFiles() method from class Folder,它将“获取当前文件夹的所有子文件的集合。”。
  • 为了简化此任务,您可以使用 1) 继续令牌来记住文件迭代器的状态 2) PropertiesService 用于缓存和检索您的继续令牌 3) 用于调度函数调用的触发器。跟踪时间以确保不超过最大执行时间。此外,您可以递归地获取所有子文件夹和文件。如果你有兴趣,我会分享代码示例
  • @AntonDementiev 当然,我对所有方法都感兴趣
  • @AntonDementiev 我还在等你的代码示例...

标签: google-apps-script google-sheets


【解决方案1】:

这是一个示例:

function createSheetForEachCountry() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var data = sheet.getRange(2, 2, sheet.getLastRow()-1, 2).getValues(); // Get country name and folder id

  for(var i = 0;i<data.length;i++){ // For all the id on the main sheet

    if(data[i][0] != "" && data[i][1] != ""){ // Check if we got some data
      var newSheet = ss.insertSheet(data[i][0]); // Create the sheet with the country name
      var files = DriveApp.getFolderById(data[i][1]).getFiles(); // Get files from folder

      while(files.hasNext()){ // While there is files
        var file = files.next(); // Look on the next file
        newSheet.appendRow([file.getId()]); // And add his id on the sheet
      }
    }
  }
}

cmets 应该让您知道它是如何工作的。

【讨论】:

  • 非常感谢,这就像魅力一样。在文件夹中更改或添加新文件时,是否可以让列表自动更新?
  • 哦.. 尝试获取文件的更多信息(如 getName,getlastupdate)时,我再次获得了最大执行时间
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多