将zip数据导入google电子表格

时间:2016-05-06 06:32:44

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

我正在尝试从网址中提取zip并将其自动导入Google电子表格。

该zip包含一个CSV数据文件。

我知道我可以将CSV数据导入Google电子表格,但我希望能够在将其上传到Google电子表格之前,先删除我必须下载zip并提取文件的步骤。

所以我的问题是,是否可以将URL中的压缩CSV文件直接导入Google电子表格?如果没有,如何使用Google Apps脚本完成此操作?

2 个答案:

答案 0 :(得分:1)

感谢道格拉斯的投入。在您的代码的帮助下,我可以设法简化它并从链接中直接读取zip到电子表格。这是我的代码:

function testzip(){

var url = "url goes here" 
var zipblob = UrlFetchApp.fetch(url).getBlob(); 
var unzipblob = Utilities.unzip(zipblob); 
var unzipstr=unzipblob[0].getDataAsString();
var csv = Utilities.parseCsv(unzipstr);

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
ss.getRange(1, 1, csv.length, csv[0].length).setValues(csv);

}

答案 1 :(得分:0)

要回答您的问题,不能,您不能直接将包含CSV的Zip文件导入电子表格。回答你的第二个问题:

这个问题有点广泛,需要分解为三位。

  1. 从网址
  2. 中检索Zip
  3. 从Zip
  4. 中提取CSV
  5. 将CSV插入表单
  6. 我将简要介绍这三个方面中的每一个方面,以帮助您朝着正确的方向前进,我不打算为您写出完整的解决方案。我提供了一些代码示例,以便您更容易上手,这并不是一个端到端的解决方案。

    从网址中检索Zip

    您可以使用URLFetchApp Service

    执行此操作

    类似的东西:

    var urlData = UrlFetchApp.fetch(link);
    var zipBlob = urlData.getBlob();
    var files = Utilities.unzip(blob);
    

    从Zip中提取CSV

    您需要获取ZIP文件的内容,在ZIP中找到CSV文件,然后将其作为CSV解析为数组。在我的示例中,我使用正则表达式来转义CSV,因为Apps脚本CSV解析器是错误的。

    function GetCSVFromZip(zipBlob){
      var files = Utilities.unzip(zipBlob);
      var csvAttachment = FindBlobByName(files, 'myPartialName');
      if(csvAttachment !== -1){
        var dataString = csvAttachment.getDataAsString();
        var escapedString = dataString.replace(/(?=["'])(?:"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]\r\n(?:\\[\s\S][^'\\]\r\n)*')/g, '\r\n'); //http://stackoverflow.com/a/29452781/3547347
        var csv = Utilities.parseCsv(escapedString);
      }
    }
    
    //Finds a blob by a partial name match, assumes no multiple matches
    function FindBlobByName(blob, name){
      for(var i = 0; i < blob.length; i++){
        var blobName = blob[i].getName();
        var regex = new RegExp(name, 'i');
        var result = blobName.match(regex);
        if(result){
          return blob[i];
        }    
      }
      return -1;
    }
    

    将CSV插入表单

    您需要使用SpreadsheetApp Service。获取电子表格,获取数据范围,并将其设置为CSV数组。这些方面的东西:

    var sheet = SpreadsheetApp.openById(id).getSheetByName(name);
    var range = sheet.getRange(1, 1, csv.length, csv[0].length);
    range.setValues(csv);