【问题标题】:Merge Multiple CSV Files in single file on gdrive将多个 CSV 文件合并到 gdrive 上的单个文件中
【发布时间】:2019-10-02 14:12:43
【问题描述】:

我一直在尝试将多个 csv 文件合并到 Google 驱动器文件夹中的单个 csv 文件中,但我无法做到这一点,因为它适用于 google 表格但不适用于 csv 文件。

我使用了 stackoverflow.com 上已有的代码,但它不能很好地满足我的要求。

function mergeSheets() {

  /* Retrieve the desired folder */
  var myFolder = DriveApp.getFoldersByName("Test 1").next();

  /* Get all spreadsheets that resided on that folder */
  var spreadSheets = myFolder.getFilesByType("MimeType.csv");

  /* Create the new spreadsheet that you store other sheets */  
  var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");

  /* Iterate over the spreadsheets over the folder */
  while(spreadSheets.hasNext()) {

    var sheet = spreadSheets.next();

    /* Open the spreadsheet */
    var spreadSheet = SpreadsheetApp.openById(sheet.getId());

    /* Get all its sheets */
    for(var y in spreadSheet.getSheets()) {

      /* Copy the sheet to the new merged Spread Sheet */
      spreadSheet.getSheets()[y].copyTo(newSpreadSheet); 
    }
  }      
}

它确实创建了一个新工作表,但没有任何 csv 数据。

【问题讨论】:

    标签: csv google-apps-script google-sheets


    【解决方案1】:

    您的解决方案的主要问题是:

    1. 即使您没有找到任何要合并的 CSV,您也可以创建新的合并工作表。
    2. 您试图使用错误的 mimetype 字符串获取 CSV 文件。 (无效的"MimeType.csv" 与正确的"text/csv"。或者,也可以只使用不带引号的MimeType.csv。)
    3. 您认为可以使用电子表格应用打开 csv,但实际上并非如此。

    要解决我遇到的这些问题:

    1. 在创建合并文件之前添加了一项检查。
    2. 已将 mimetype 字符串修复为正确的字符串。
    3. 将SpreadsheetApp.openById(sheet.getId()); 切换为Utilities.parseCsv(sheet.getBlob().getDataAsString(), ",");,这样我们就可以正确地open a csv file。
    4. 添加了逐一添加行的逻辑。

    这里有一些代码可以将多个 csv 文件放入一个电子表格中,每个文件都在自己的工作表中。

    function mergeSheets() {
      /* Retrieve the desired folder */
      var myFolder = DriveApp.getFoldersByName("Test 1").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");
        /* 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 */
          var newSheet = newSpreadSheet.insertSheet("import_"+sheet.getName());
          for (var i=0;i<csvData.length;i++) {
            newSheet.appendRow(csvData[i]);
          }
        } 
      }   
    }
    

    希望这会有所帮助!

    【讨论】:

    • 找到了一种使用 MimeType.CSV 的方法,该方法适用于我的解决方案。或许可以看一看,看看这样做是否有任何异常?
    • @AghaMusaKhan 没问题!记得批准对您更有帮助的答案。
    【解决方案2】:

    这是我的解决方案:

    • 涉及使用 MimeType.CSV(OP 只需要避免使用引号?)
    • 涉及将一个 csv 中的行添加到新的电子表格中 - 完全是这样,而不是一个接一个地遍历行

    试试这个 -

    function mergeSheets() {
    
      /* Retrieve the desired folder */
      var myFolder = DriveApp.getFoldersByName("Test 1").next();
    
      /* Get all spreadsheets that resided on that folder */
      var spreadSheets = myFolder.getFilesByType(MimeType.CSV);
    
      /* Create the new spreadsheet that you store other sheets */  
      var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");
    
      /* Iterate over the spreadsheets over the folder */
      while(spreadSheets.hasNext()) {
    
        var sheet = spreadSheets.next();
    
    
        var file = DriveApp.getFileById(sheet.getId());
        var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
        var newSheet = newSpreadSheet.getActiveSheet();
        newSheet.getRange(newSpreadSheet.getLastRow() + 1, newSpreadSheet.getLastColumn()+1, csvData.length, csvData[0].length).setValues(csvData);
    
    
    
      }      
    }
    

    我假设你一定已经从这里得到了原始代码的想法 - Merge multiple tabs, download as CSV

    我从这篇文章here中找到了我的灵感。

    【讨论】:

    • 它根据我的要求工作得最好,因为它将 csv 文件附加到单个工作表中,现在我只需从每个 csv 工作表中删除第一行,因为每个 csv 工作表中的标题都是相同的并且所有我需要的是用户数据。感谢您的帮助,是的,我从您给定的链接中得到了这个想法。
    • @AghaMusaKhan - 很高兴这有帮助 :) 请考虑接受答案 - stackoverflow.com/help/accepted-answer
    • @AghaMusaKhan 如果您想自动删除第一行,您可以随时使用code csvData = csvDataslice(0); // 复制 csvDatasplice(0, 1);code
    【解决方案3】:
    function mergeCSVFiles(folderId,filename) {
      var folder=DriveApp.getFolderById(folderId);
      var files=folder.getFilesByType(MimeType.csv);
      var s='';
      while(files.hasNext()) {
        var file=files.next();
        s+=file.getBlob().getDataAsString();
      }
      var currentFiles=DriveApp.getRootFolder().getFilesByName(filename);
      while(currentFiles.hasNext()) {
        currentFiles.next().setTrashed(true);
      }
      DriveApp.getRootFolder().createFile(filename,s,”text/csv”);//The merged file is in your root folder. 
    }
    

    【讨论】:

    • 我必须将“MimeType.csv”更改为“text/csv”,然后效果最佳。感谢您的帮助。
    • 感谢收看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多