迭代文件夹和子文件夹/文件,并将电子表格数据复制到存档表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代文件夹和子文件夹/文件,并将电子表格数据复制到存档表相关的知识,希望对你有一定的参考价值。

我有一个脚本遍历文件夹,打开所有电子表格,并将这些表格的某个数组/范围复制到存档表。我的脚本功能很好[在包含文件的文件夹],但我无法弄清楚如何让我的脚本迭代子文件夹。

我知道我最终会遇到超时问题。但是我将设置一个令牌,让它继续在它停止的地方,一旦我可以让它迭代整个文件夹结构。 (所以现在不是问题。)

我的文件夹结构的一个例子如下:

  • 主文件夹
  • ---教师姓名(文件夹)
  • -----阅读评估数据(文件夹)
  • -------电子表格
  • -------电子表格
  • -------电子表格
  • -----数学评估数据(文件夹)
  • -------电子表格
  • -------电子表格
  • -------电子表格
  • ---教师姓名(文件夹)
  • -----这继续......

你们给我的任何帮助将不胜感激!谢谢,布兰登

function runDataReport () {
  var folder = DriveApp.getFolderById("ID");
  Logger.log('folder: ' + folder);

  var sheetFiles = folder.getFilesByType("application/vnd.google-apps.spreadsheet");
  Logger.log("sheetFiles.hasNext(): " + sheetFiles.hasNext());

  var data;

 while (sheetFiles.hasNext()) {
   var file = sheetFiles.next();

   var theFileType = file.getMimeType();
   Logger.log("theFileType: " + theFileType);

   var ssID = file.getId();
   Logger.log('ssID: ' + ssID);

   var thisSS = SpreadsheetApp.openById(ssID),
       ssName = thisSS.getName(),
       ssUrl = thisSS.getUrl(),
       classData = thisSS.getSheets()[0],
       dataLastRow = classData.getLastRow(),
       Avals = classData.getRange("A1:A").getValues(),
       Alast = Avals.filter(String).length,
       Jvals = classData.getRange("J2:J").getValues(),
       Jlast = Jvals.filter(String).length,
       classDataRange = classData.getRange(3, 1, Alast-2, 50), 

       dataArray = classDataRange.getValues();

   var dataReportSS = SpreadsheetApp.openById('ID'), //Data Report Sheet ID
       dataReportSheet = dataReportSS.getSheets()[0], 
       dataReportNewRow = dataReportSheet.getLastRow() + 1,
       newDataRange = dataReportSheet.getRange(dataReportNewRow, 3, Alast-2, 50);

      if (Jlast > 1){
          newDataRange.setValues(dataArray);

      for (var i=0, x = dataArray.length; i<x; i++){
          dataReportSheet.getRange(dataReportNewRow + i, 1).setValue(ssName);
      }
      for (var i=0, x = dataArray.length; i<x; i++){
          dataReportSheet.getRange(dataReportNewRow + i, 2).setValue(ssUrl);
      }
    }      
  }
}
答案

这是一些希望对你有用的代码。我没有测试它,所以如果有任何问题请告诉我。

function runDataReport () {
  var allFoldersInThisDrive = DriveApp.getFolders();
  var foldersToExclude = ["folder1","folder2","folder3"];

  while (allFoldersInThisDrive.hasNext()) {
    var folder = allFoldersInThisDrive.next();
    //Logger.log(allFoldersInThisDrive.getName());

    var thisFolderName = folder.getName();

    //If index is -1, then thisFolderName was not found in the folders to exclude
    if (foldersToExclude.indexOf(thisFolderName)===-1) {
      //branch to another function in order to interate through all the files in this folder
      processAllFiles(folder)
    };
  };
}

function processAllFiles(argFolder) {

  var sheetFiles = argFolder.getFilesByType("application/vnd.google-apps.spreadsheet");
  Logger.log("sheetFiles.hasNext(): " + sheetFiles.hasNext());

  var data;

 while (sheetFiles.hasNext()) {
   var file = sheetFiles.next();

   var theFileType = file.getMimeType();
   Logger.log("theFileType: " + theFileType);

   var ssID = file.getId();
   Logger.log('ssID: ' + ssID);

   var thisSS = SpreadsheetApp.openById(ssID),
       ssName = thisSS.getName(),
       ssUrl = thisSS.getUrl(),
       classData = thisSS.getSheets()[0],
       dataLastRow = classData.getLastRow(),
       Avals = classData.getRange("A1:A").getValues(),
       Alast = Avals.filter(String).length,
       Jvals = classData.getRange("J2:J").getValues(),
       Jlast = Jvals.filter(String).length,
       classDataRange = classData.getRange(3, 1, Alast-2, 50), 

       dataArray = classDataRange.getValues();

   var dataReportSS = SpreadsheetApp.openById('The ID here'), //Data Report Sheet ID
       dataReportSheet = dataReportSS.getSheets()[0], 
       dataReportNewRow = dataReportSheet.getLastRow() + 1,
       newDataRange = dataReportSheet.getRange(dataReportNewRow, 3, Alast-2, 50);

      if (Jlast > 1){
          newDataRange.setValues(dataArray);

      for (var i=0, x = dataArray.length; i<x; i++){
          dataReportSheet.getRange(dataReportNewRow + i, 1).setValue(ssName);
      }
      for (var i=0, x = dataArray.length; i<x; i++){
          dataReportSheet.getRange(dataReportNewRow + i, 2).setValue(ssUrl);
      }
    }      
  }
};

以上是关于迭代文件夹和子文件夹/文件,并将电子表格数据复制到存档表的主要内容,如果未能解决你的问题,请参考以下文章

如何读取指定的单元格值并将文件从 excel 转换为电子表格?

根据电子表格中的详细信息自动发送电子邮件,并将表格从电子表格复制/粘贴到相应的电子邮件中

将电子表格的行转换为单独的 XML 文件

Excel怎样批量提取文件夹和子文件夹所有文件?

Google Apps脚本 - 复制到现有电子表格

将 Access 数据库查询复制到 Excel 电子表格中