我正在尝试从网址中提取zip并将其自动导入Google电子表格。
该zip包含一个CSV数据文件。
我知道我可以将CSV数据导入Google电子表格,但我希望能够在将其上传到Google电子表格之前,先删除我必须下载zip并提取文件的步骤。
所以我的问题是,是否可以将URL中的压缩CSV文件直接导入Google电子表格?如果没有,如何使用Google Apps脚本完成此操作?
答案 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文件导入电子表格。回答你的第二个问题:
这个问题有点广泛,需要分解为三位。
我将简要介绍这三个方面中的每一个方面,以帮助您朝着正确的方向前进,我不打算为您写出完整的解决方案。我提供了一些代码示例,以便您更容易上手,这并不是一个端到端的解决方案。
从网址中检索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);