Я работаю с google node api. Я пытаюсь сделать следующее:Не удается загрузить таблицу с электронными таблицами после загрузки
- Прочитайте содержимое Google диска таблицы
- интерпретировать некоторые данные (я преобразовать CSV к объекту с помощью node-csv)
- Затем загрузить файл с новое содержание
У меня есть рабочий код, который делает все это, я поделюсь им через минуту.
Проблема заключается в том код может только читать файл электронной таблицы 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 и брошу ее в браузере, я могу скачать файл просто отлично.
Попытка:
- Я просто попытался добавить
options.media.mimeType = "application/vnd.google-apps.spreadsheet"
для обновления, думая, что это может быть проблема с установкой существующего документа вtext/csv
. - Пробовал то же самое с
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)
}