我正在使用google node api。我正在尝试执行以下操作:
我有完成所有这些工作的代码,我会在一分钟内分享。
问题是当我在谷歌驱动器中创建它时,代码只能从谷歌驱动器中读取电子表格文件,当我更新文件时,它无法从API中读取(在谷歌中工作)自己开车)。所以上面列出的步骤工作,然后当我再次运行它时,更新的文件是"找不到"。注意我根本不更改文件的ID。
这里有一些代码,drive.files
和csv
正在使用Promises Bluebird's promisifyAll()
函数进行处理,该函数会将Async
promise函数添加到库中
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
})
}
}
两个文件之间管理员唯一真正的区别在于,上传的文档没有额外的单元格,它只是包含已上传内容的单元格。
如果您认为它是权限问题,对吧?适用于谷歌驱动器,但不适用于API。我在想同样的事情。
要明确,我可以使用drive.files.get
获取文件信息我无法使用data.exportLinks['text/csv']
下载文件。
我在上传之前和之后检索了文件元数据,可读取的可下载文件和不可下载的文件。这是diff between those two responses。
我不确定这是我上传的问题,还是我下载方式的问题。
有一个下载链接,当我登录谷歌驱动器并将其放入浏览器时,我可以正常下载文件。
尝试:
options.media.mimeType = "application/vnd.google-apps.spreadsheet"
进行更新,认为将现有文档设置为text/csv
可能会出现问题。options.convert = false
一样,认为它正在转换已存在的文档。更新
如果我使用谷歌硬盘还原文件,我可以再次阅读该文件。进展?文件内容/ 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 :(得分:0)
我自己构建网址时有不必要的查询参数。
我删除了
"qs":{
"exportFormat": "csv",
"key": id,
"gid": 0
},
从下载脚本开始工作:)