2015-03-26 1 views
0

Я работаю с google node api. Я пытаюсь сделать следующее:Не удается загрузить таблицу с электронными таблицами после загрузки

  1. Прочитайте содержимое Google диска таблицы
  2. интерпретировать некоторые данные (я преобразовать CSV к объекту с помощью node-csv)
  3. Затем загрузить файл с новое содержание

У меня есть рабочий код, который делает все это, я поделюсь им через минуту.

Проблема заключается в том код может только читать файл электронной таблицы Google Диске, когда я создаю его в Google диск, когда я обновляю файл это нечитаемым из API (работает в Google диск сам). Таким образом, действия, перечисленные выше, работают, а затем, когда я запускаю его снова, обновленный файл «не найден». Примечание. Я не изменяю идентификатор файла вообще.

Вот код, drive.files и csv обрабатываются с Promises Bluebird'spromisifyAll() функцией, которая добавляет Async обещание функции в библиотеку.

function getDriveFile(drive, id){ 
    return drive.files.getAsync({ fileId: id }) 
    .spread(function(data, response){ 
     console.log(data) 
     return data.exportLinks['text/csv'] 
    }).then(function(csvDownload){ 
     return request({ 
     "method":"GET", 
     "url": csvDownload, 
     "qs":{ 
      "exportFormat": "csv", 
      "key": id, 
      "gid": 0 
     }, 
     "headers":{ 
      "Authorization": "Bearer " + drive._options.auth.credentials.access_token 
     } 
     }).spread(function(response, body){ 
     return body 
     }) 
    }) 
} 

function driveGetAndParse(drive, fileId, fileName){ 
    return getDriveFile(drive, fileId).then(function(file){ 
    if(file.match("<!DOCTYPE html>")) throw new Error(fileName + " is not found") 
    debug("fetched google drive %s doc", fileName) 
    return csv.parseAsync(file, {columns: true}) 
    }) 
} 

driveGetAndParse(drive, docId, "My super special doc"), 


// one function that updates the file if there's and ID else inserts 
function upload(drive, item){ 
    if(item.title) debug("uploading file '%s' to google drive", item.title) 
    var options = { 
    addParents: uloadparent, 
    newRevision: false, 
    convert: true, 
    media: { 
     mimeType: 'text/csv', 
     body: item.content, 
    } 
    } 
    if(item.id) options.fileId = item.id 
    if(item.title) options.resourcetitle = item.title 
    if(options.fileId){ 
    return drive.files.updateAsync(options) 
     .spread(function(data, response){ 
     return data 
     }) 
    }else{ 
    return drive.files.insertAsync(options) 
     .spread(function(data, response){ 
     return data 
     }) 
    } 
} 

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

Если вы думаете, что это проблема с разрешениями, верно? Работает на Google Диске, но не в API. Я думал так же.

Чтобы было ясно, что я могу получить информацию с помощью файлов drive.files.get Я просто не могу скачать сам файл с помощью data.exportLinks['text/csv'].

Я получил метаданные файлов до и после загрузки, читаемый загружаемый и незагружаемый файл. Вот diff between those two responses.

Я не уверен, что это проблема с ними, я загружаю или проблема с тем, как я загружаю.

Существует ссылка для загрузки, и когда я войду в Google Drive и брошу ее в браузере, я могу скачать файл просто отлично.

Попытка:

  1. Я просто попытался добавить options.media.mimeType = "application/vnd.google-apps.spreadsheet" для обновления, думая, что это может быть проблема с установкой существующего документа в text/csv.
  2. Пробовал то же самое с options.convert = false, думая, что он конвертирует уже существующий документ.

Update:

Если я вернуть файл обратно с помощью Google диск я могу прочитать файл снова. Прогресс? Что-то должно быть неправильно с содержимым файла/API?

изменение Код:

Я разделил функции на insert/update и они пересекаются в upload.

function insert(drive, item){ 
    debug("inserting google drive file") 
    return drive.files.insertAsync({ 
    addParents: uloadparent, 
    newRevision: false, 
    convert: true, 
    media: { 
     mimeType: 'text/csv', 
     body: item.content, 
    } 
    }).spread(function(data, response){ 
    return data 
    }) 
} 

function update(drive, item){ 
    debug("updating google drive file") 
    return drive.files.updateAsync({ 
    fileId: item.id, 
    addParents: uloadparent, 
    newRevision: false, 
    convert: true, 
    media: { 
     mimeType: 'text/csv', 
     body: item.content, 
    } 
    }).spread(function(data, response){ 
    return data 
    }) 
} 

function upload(drive, item){ 
    if(item.title) debug("uploading %s", item.title) 
    if(item.id) return update(drive, item) 
    return insert(drive, item) 
} 

ответ

0

У меня возникли ненужные параметры запроса, когда я сам создавал URL-адрес.

Я удалил

"qs":{ 
     "exportFormat": "csv", 
     "key": id, 
     "gid": 0 
    }, 

из сценария загрузки, и она работала :)

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