【问题标题】:Import zip data into google spreadsheet将 zip 数据导入谷歌电子表格
【发布时间】:2016-05-06 06:32:44
【问题描述】:

我正在尝试从 URL 获取 zip 并将其自动导入到 Google 电子表格中。

zip 包含一个 CSV 数据文件。

我知道我可以将 CSV 数据导入 Google 电子表格,但我希望能够省去我必须先下载 zip 并解压缩文件然后再将其上传到 Google 电子表格的步骤。

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

【问题讨论】:

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


    【解决方案1】:

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

    这个问题有点宽泛,需要分成三个部分。

    1. 从 URL 中检索 Zip
    2. 从 Zip 中提取 CSV
    3. 将 CSV 插入工作表中

    我将简要介绍这三个领域中的每一个,以帮助您朝着正确的方向前进,我不会为您写出完整的解决方案。我提供了一些代码示例,让您更容易上手,这并不是一个端到端的解决方案。

    从 URL 中检索 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 Script 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);
    

    【讨论】:

      【解决方案2】:

      使用Douglasanswer,我设法对其进行了简化,并从链接中直接读取了压缩包到电子表格。这是我的代码:

      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);
      }
      

      标题

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        相关资源
        最近更新 更多