繁体   English   中英

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

[英]How to merge multiple CSV files into single file which are under different Subfolders of Folder in GDrive.?

我刚刚开始使用 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();
      }

    }

递归子文件夹以合并 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数据表:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM