Javascript 如何将多个CSV文件合并到GDrive文件夹不同子文件夹下的单个文件中。?

Javascript 如何将多个CSV文件合并到GDrive文件夹不同子文件夹下的单个文件中。?,javascript,csv,google-apps-script,Javascript,Csv,Google Apps Script,我刚刚启动了谷歌应用程序脚本。我有一个文件夹,其中有不同的子文件夹,每个子文件夹包含至少一个csv文件。现在,我想从这些子文件夹中提取所有这些文件,并合并到单个google工作表中。我有一个函数可以遍历所有子目录并列出所有子文件夹,还有一个函数可以合并单个文件夹中的csv文件。现在我们有没有办法把这些函数结合起来,得到想要的结果。任何帮助都将不胜感激。多谢各位 //////////////Merge all csv files in a Folder/////////////////////

我刚刚启动了谷歌应用程序脚本。我有一个文件夹,其中有不同的子文件夹,每个子文件夹包含至少一个csv文件。现在,我想从这些子文件夹中提取所有这些文件,并合并到单个google工作表中。我有一个函数可以遍历所有子目录并列出所有子文件夹,还有一个函数可以合并单个文件夹中的csv文件。现在我们有没有办法把这些函数结合起来,得到想要的结果。任何帮助都将不胜感激。多谢各位

//////////////Merge all csv files in a Folder/////////////////////

    function mergeSheets() {
      /* Retrieve the desired folder */
      var myFolder = DriveApp.getFoldersByName("Apr_05_2013").next();  
      /* Get all spreadsheets that resided on that folder */
      var spreadSheets = myFolder.getFilesByType("text/csv");
      if (spreadSheets.hasNext()) {
        /* Create the new spreadsheet that you store other sheets */
        var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");
        var newSheet = newSpreadSheet.insertSheet("import_");
        /* Iterate over the spreadsheets over the folder */
        while(spreadSheets.hasNext()) {
          var sheet = spreadSheets.next();
          /* Load the csv data */
          var csvData = Utilities.parseCsv(sheet.getBlob().getDataAsString(), ",");
          /* Copy the sheet to the new merged Spread Sheet */

          for (var i=0;i<csvData.length;i++) {
            newSheet.appendRow(csvData[i]);
          }
        } 
      }   
    }

/////////////////**List all Sub folders which a folder contains**///////////////////////////


    function genFolderTree() {

      try {

      var foldername = 'File2013';
      var folderlisting = 'TreeView_' + foldername;

      var parentFolder = DriveApp.getFoldersByName(foldername).next();


      var ss = SpreadsheetApp.create(folderlisting);
      var sheet = ss.getActiveSheet();
      var frontCell = [];
      sheet.appendRow([foldername]).getCurrentCell().setFontWeight('bold').setFontColor('red');
      frontCell.push(" ");
      getChildNode(parentFolder,sheet,frontCell);
      var files = parentFolder.getFiles();
      while (files.hasNext()) {
        frontCell.push(files.next().getName());
        sheet.appendRow( frontCell);
        frontCell.pop();
        }

      } catch (e) {

        Logger.log(e.toString());

      }

    }


    function getChildNode(parent,sheet,frontCell) {

      var childFolders = parent.getFolders();
      while (childFolders.hasNext()) {

        var childFolder = childFolders.next();

        frontCell.push(childFolder.getName())
        sheet.appendRow(frontCell);
        sheet.getRange(sheet.getLastRow(), frontCell.length).setFontWeight('bold').setFontColor('red');
        frontCell.pop();
        var files = childFolder.getFiles();
        frontCell.push(" ");
        var start_row = 0;
        var row_no = 0;
        while (files.hasNext()) {
          frontCell.push(files.next().getName());
          sheet.appendRow(frontCell);
          if(row_no==0){
            start_row = sheet.getLastRow();
          }
          row_no=row_no+1;
          frontCell.pop();
        }
        if(row_no>0){
          var range;
          range = sheet.getRange(start_row, frontCell.length,row_no);
          // The row grouping depth is increased by row_no.
          range.shiftRowGroupDepth(1);
        }

        // Recursive call for any sub-folders
        getChildNode(childFolder,sheet,frontCell);
        frontCell.pop();
      }

    }
//合并文件夹中的所有csv文件/////////////////////
函数mergeSheets(){
/*检索所需的文件夹*/
var myFolder=DriveApp.getFoldersByName(“2013年4月5日”).next();
/*获取该文件夹中的所有电子表格*/
var spreadSheets=myFolder.getFilesByType(“text/csv”);
if(spreadSheets.hasNext()){
/*创建存储其他图纸的新电子表格*/
var newSpreadSheet=SpreadsheetApp.create(“合并表”);
var newSheet=newSpreadSheet.insertSheet(“导入”);
/*在文件夹上迭代电子表格*/
while(spreadSheets.hasNext()){
var sheet=电子表格。next();
/*加载csv数据*/
var csvData=Utilities.parseCsv(sheet.getBlob().getDataAsString(),“,”);
/*将工作表复制到新的合并电子表格*/
对于(var i=0;i0){
var范围;
范围=sheet.getRange(起始行、前单元格、长度、行号);
//行分组深度按行编号增加。
范围。移位组深度(1);
}
//对任何子文件夹的递归调用
getChildNode(childFolder、sheet、frontCell);
frontCell.pop();
}
}

递归子文件夹以合并CSV数据

此函数通过“主数据文件夹”的子文件夹递归,读取所有csv文件并将它们合并在一起,并将合并文件保存到“合并文件文件夹”中。您需要提供主数据文件夹id和合并文件文件夹id。它还会返回合并数据文件id并将其附加到活动工作表中

function loadMergeFile() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.clearContents();
  var data=Utilities.parseCsv(DriveApp.getFileById(mergeCSVs()).getBlob().getDataAsString());
  data.forEach(function(r,i){sh.appendRow(r)});
}

function mergeCSVs() {
  var mfldr=DriveApp.getFolderById('Merged File Folder Id');//merged data file saved in this folder
  var folder=DriveApp.getFolderById('Main Data Folder Id');  
  var ts=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"yyyyMMdd_HH:mm:ss")
  var fn=Utilities.formatString('MergedCSV-%s',ts)
  var mfile=mfldr.createFile(fn,'','text/csv');
  getFnF(folder,mfile.getId());
  return mfile.getId();//return the id so that the loadMergeFile can retrieve the data from the file.
}

function getFnF(folder,id) {
  var mfile=DriveApp.getFileById(id); 
  var files=folder.getFilesByType(MimeType.CSV)
  while(files.hasNext()) {
    var file=files.next();
    mfile.setContent(mfile.getBlob().getDataAsString() + file.getBlob().getDataAsString());
  }
  var subfolders=folder.getFolders() 
  while(subfolders.hasNext()) {
    var subfolder=subfolders.next();
    getFnF(subfolder,id);//The function calls itself as it moves into each subfolder
  }
}
我使用以下函数创建了一些测试数据来测试上述函数。正如您所看到的,这些数据都是数字,并不复杂。因此,根据数据的复杂性,您可能需要进行一些调整

function createCSVsInFolders() {
  var mainfldr=DriveApp.getFolderById('Main Data Folder Id');
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('csvdata');//set up test data in this sheet
  var vA=sh.getDataRange().getValues();
  var csv='';
  vA.forEach(function(r,i){csv+=r.join(',') + '\r\n'});
  Logger.log(csv);
  var fldrA=['folder1','folder2','folder3','folder4'];
  var fileA=['file1.csv','file2.csv','file3.csv','file4.csv'];
  for(var i=0;i<fldrA.length;i++) {
    var folder=mainfldr.createFolder(fldrA[i]);
    for(var j=0;j<fileA.length;j++) {
      folder.createFile(fileA[j],csv,MimeType.CSV)
    }
  }
}
函数createCsvInfolders(){
var mainfldr=DriveApp.getFolderById(“主数据文件夹Id”);
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('csvdata');//在此工作表中设置测试数据
var vA=sh.getDataRange().getValues();
var csv=“”;
vA.forEach(函数(r,i){csv+=r.join(',')+'\r\n'});
Logger.log(csv);
var fldrA=['folder1','folder2','folder3','folder4'];
var fileA=['file1.csv'、'file2.csv'、'file3.csv'、'file4.csv'];
对于(var i=0;i