【问题标题】:How to merge multiple CSV files into single file which are under different Subfolders of Folder in GDrive.?如何将多个CSV文件合并到GDrive文件夹不同子文件夹下的单个文件中。?
【发布时间】:2020-01-18 11:41:51
【问题描述】:

我刚刚启动了 Google 应用程序脚本。我有一个包含不同子文件夹的文件夹,每个子文件夹都包含至少一个 csv 文件。现在我想从这些子文件夹中提取所有这些文件并合并到一个谷歌表中。我有一个函数可以遍历所有子目录并列出所有子文件夹,还有一个函数可以合并单个文件夹中存在的 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();
      }

    }

【问题讨论】:

    标签: javascript csv google-apps-script


    【解决方案1】:

    递归子文件夹以合并 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)
        }
      }
    }
    

    csv 数据表:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2016-05-01
      相关资源
      最近更新 更多