要回答您的问题,不,您不能直接将包含 CSV 的 Zip 文件直接导入电子表格。回答你的第二个问题:
这个问题有点宽泛,需要分成三个部分。
- 从 URL 中检索 Zip
- 从 Zip 中提取 CSV
- 将 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);