【问题标题】:Importing CSV data to Google sheets using Appscript giving parse error使用 Appscript 将 CSV 数据导入 Google 工作表给出解析错误
【发布时间】:2021-07-10 09:44:45
【问题描述】:

我每天通过谷歌表单上传 csv 文件到驱动器。我需要处理文件中的数据以决定某些操作,但遇到文件解析错误

csv 文件链接是 https://drive.google.com/file/d/1e6tuNEqpOxle3J99g0NL88GvDCNZoOM0/view?usp=sharing

我使用的谷歌表格是 https://docs.google.com/spreadsheets/d/11UegtqQLrY3iQMek6LLNofOHjMzo9HhndYgOU4UQhrA/edit?usp=sharing

脚本如下

function importCSVFromGoogleDrive() {

  var file = DriveApp.getFileById("1e6tuNEqpOxle3J99g0NL88GvDCNZoOM0");
  Logger.log(file.getBlob().getDataAsString());
  var csvData = Utilities.parseCsv(file.getBlob().getDataAsString(), ",");
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}

它给出了下面的错误

异常:无法解析文本。
importCSVFromGoogleDrive @ Code.gs:5

我可以看到记录器正在获取数据,但我不确定如何找到错误的原因。另外,如果有更简单的方法来做到这一点,那将非常有帮助

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您的 csv 似乎在单元格内包含断线:

    在解析 csv 之前,您需要用某些东西(例如空格)替换这些中断。

    类似这样的:

    function importCSVFromGoogleDrive() {
    
      var file = DriveApp.getFileById("1e6tuNEqpOxle3J99g0NL88GvDCNZoOM0");
      var string = file.getBlob().getDataAsString();
    
      for (var i=0; i<5; i++)
        string = string.replace( /(\"[^\n\"]+)\n([^\"]+\")/g, "$1 $2" );
    
      var csvData = Utilities.parseCsv(string,",");
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
    
    }
    

    更新

    这是一个更简洁的解决方案,将所有 \n 替换为引号内的空格:

    function importCSVFromGoogleDrive() {
    
      var file = DriveApp.getFileById("1e6tuNEqpOxle3J99g0NL88GvDCNZoOM0");
      var string = file.getBlob().getDataAsString();
    
      string.match(/"[^"]+"/g).forEach(t => 
        string = string.split(t).join(t.replace(/\n/g,' ')));
      
      var csvData = Utilities.parseCsv(string,",");
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
    }
    

    与之前的快速脏解决方案不同,此代码不仅会替换引号内的五个\ns,而且会替换所有这些。

    这看起来很棘手,我花了几个小时才弄清楚如何在没有四个循环、条件、计数器等的情况下完成它。

    【讨论】:

    • 嗨。感谢您的指点。虽然这有效,但我想了解为什么需要 for 循环,特别是运行 5 次
    • 循环是一个相当快速的肮脏解决方案。它只是重复更换五次。因为数据在某些单元格中最多包含五个换行符中的四个。对于更多换行符,您将需要更多迭代。实际上应该有一个更聪明的解决方案。比如说,您可以搜索“..\n...”并在没有空搜索结果时进行替换。或者,也许有一些正则表达式能够一步替换引号内的所有换行符,我不知道。
    • 有效。如果遇到任何进一步的错误,将更新。感谢您的快速输入和解决方案
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2021-12-10
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多