我正在尝试编写一个Google脚本来下载某个特定驱动器文件夹中的所有文件(可能是.csv文件)。我已经找到了getDownloadUrl()方法,但是我还没有弄清楚该如何处理它。我目前正在尝试以下代码,其中files
是文件夹中文件的列表:
while(files.hasNext()) {
var response = UrlFetchApp.fetch(files.next().getDownloadUrl());
Logger.log(response.getContentText());
}
但是,当我试图运行代码时,我会得到一个401错误,这意味着我缺少适当的授权?但我的印象是,如果一切都发生在我的谷歌账户里,我就不需要经历所有的OAuth2步骤了。连接到外部APIs的Google指南使我看起来应该能够只获取url。我已经可以访问我的驱动器文件,因为当我运行该方法时,下载URL确实存在。我在这里错过了什么?我对这一切都很陌生,所以这可能是一些基本的东西。
谢谢!
编辑:i通过修改代码成功地修复了401错误,如下所示:
while(files.hasNext()) {
var response = UrlFetchApp.fetch(files.next().getDownloadUrl(),{headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}});
Logger.log(response.getContentText());
}
但问题仍然是,这只会将内容返回给我,而不是下载文件。如何从这个fetch
调用的结果中启动下载?
发布于 2020-08-07 16:36:31
除了列出所有下载链接之外,我猜原始海报还想将文件下载到用户的计算机上(根据先前的讨论)。
要做到这一点,可以在服务器端(例如)用base 64对blob进行编码,并在客户端浏览器中使用数据URI下载。在这个答案的帮助下,下面是这方面的代码。
Google应用程序脚本
...
function getBlobInBase64(fileId){
// omit authorization code if any
var file = DriveApp.getFileById(fileId);
var blob = file .getBlob();
return {
file_name: file.getName(),
mime: file.getMimeType(),
b64: Utilities.base64Encode(blob.getBytes());
}
...
与index.html
一起使用的Javascript
...
function getFile(fileId){
google.script.run.withSuccessHandler((data) => {
var uri = 'data:' + data.mime + ';charset=ISO-8859-1;base64,' + encodeURIComponent(data.b64);
downloadURI(uri, data.file_name);
}).withFailureHandler((err) => {
console.log(err);
}).getBlobInBase64();
}
...
注意:我还没有运行这段代码,但是该方法应该可以像在我的另一个项目中使用的那样工作。
发布于 2017-03-22 13:43:33
这将记录可供下载的任何文件的文件名和URLS (根驱动器中的头100个文件):
function myFunction() {
var files = DriveApp.getFiles();
var c = 0;
while (files.hasNext() && c<100) {
var file = files.next();
Logger.log("File Name: " + file.getName());
Logger.log(" Download URL: " + file.getDownloadUrl());
c++;
}
}
发布于 2017-03-22 15:10:42
我的答案可能有点离题,但我认为从Google 使用webContentLink下载文件的机会更大,因为这是我常用的方法。我通过使用webContentLink获得Files.list,并在字段参数中请求webContentLink。我通过浏览器运行该链接并下载该文件。
https://stackoverflow.com/questions/42947229
复制相似问题