2016-05-06 2 views
1

Я пытаюсь получить zip из URL-адреса и автоматически импортировать его в электронную таблицу Google.Импорт данных zip в таблицу google

Почтовый индекс содержит один файл CSV-данных.

Я знаю, что могу импортировать CSV-данные в электронную таблицу Google, но я хотел бы, чтобы у меня был возможность отключить мой процесс, чтобы загрузить zip и извлечь файл сначала, прежде чем загружать его в электронную таблицу Google.

Итак, мои запросы, можно ли импортировать ZIP-файл с CSV-файлом из URL-адреса непосредственно в Google Spreadsheet? Если нет, как это сделать с помощью скрипта Google Apps?

ответ

0

Чтобы ответить на ваш вопрос, нет, вы не можете напрямую импортировать Zip-файл, содержащий CSV, непосредственно в электронную таблицу. Чтобы ответить на ваш второй вопрос:

Этот вопрос довольно широк и его необходимо разбить на три бита.

  1. Извлечение Zip из URL
  2. Извлечение CSV из Zip
  3. Вставка CSV в свой лист

Я кратко рассмотрим каждый из этих трех областей, чтобы вы собираетесь в правильном направлении, я не собираюсь выписывать вам полноценное решение. Я предоставляю некоторые примеры кода, чтобы облегчить вам работу, это не должно быть сквозным решением.

Извлечение Zip из URL

Вы можете сделать это с URLFetchApp Service.

Что-то вроде:

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

Извлечение CSV из Zip

Вам нужно получить содержимое файла ZIP, найдите файл CSV в ZIP, а затем разобрать его как CSV в массив. В моем примере я использую регулярное выражение для выхода из CSV, поскольку скрипт 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); 
1

Спасибо Douglas за ваши данные. С помощью вашего кода я мог бы упростить его и прочитать zip из ссылки непосредственно в электронные таблицы. Вот мой код:

функция 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); 

}

Смежные вопросы