首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google脚本:从驱动器下载文件(同一个用户)

Google脚本:从驱动器下载文件(同一个用户)
EN

Stack Overflow用户
提问于 2017-03-22 09:18:42
回答 5查看 4.6K关注 0票数 4

我正在尝试编写一个Google脚本来下载某个特定驱动器文件夹中的所有文件(可能是.csv文件)。我已经找到了getDownloadUrl()方法,但是我还没有弄清楚该如何处理它。我目前正在尝试以下代码,其中files是文件夹中文件的列表:

代码语言:javascript
运行
复制
while(files.hasNext()) {
  var response = UrlFetchApp.fetch(files.next().getDownloadUrl());
  Logger.log(response.getContentText());
}

但是,当我试图运行代码时,我会得到一个401错误,这意味着我缺少适当的授权?但我的印象是,如果一切都发生在我的谷歌账户里,我就不需要经历所有的OAuth2步骤了。连接到外部APIs的Google指南使我看起来应该能够只获取url。我已经可以访问我的驱动器文件,因为当我运行该方法时,下载URL确实存在。我在这里错过了什么?我对这一切都很陌生,所以这可能是一些基本的东西。

谢谢!

编辑:i通过修改代码成功地修复了401错误,如下所示:

代码语言:javascript
运行
复制
while(files.hasNext()) {
  var response = UrlFetchApp.fetch(files.next().getDownloadUrl(),{headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}});
  Logger.log(response.getContentText());
}

但问题仍然是,这只会将内容返回给我,而不是下载文件。如何从这个fetch调用的结果中启动下载?

EN

回答 5

Stack Overflow用户

发布于 2020-08-07 16:36:31

除了列出所有下载链接之外,我猜原始海报还想将文件下载到用户的计算机上(根据先前的讨论)。

要做到这一点,可以在服务器端(例如)用base 64对blob进行编码,并在客户端浏览器中使用数据URI下载。在这个答案的帮助下,下面是这方面的代码。

Google应用程序脚本

代码语言:javascript
运行
复制
...

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

代码语言: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();
}

...

注意:我还没有运行这段代码,但是该方法应该可以像在我的另一个项目中使用的那样工作。

票数 1
EN

Stack Overflow用户

发布于 2017-03-22 13:43:33

这将记录可供下载的任何文件的文件名和URLS (根驱动器中的头100个文件):

代码语言:javascript
运行
复制
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++;
  }
}

票数 0
EN

Stack Overflow用户

发布于 2017-03-22 15:10:42

我的答案可能有点离题,但我认为从Google 使用webContentLink下载文件的机会更大,因为这是我常用的方法。我通过使用webContentLink获得Files.list,并在字段参数中请求webContentLink。我通过浏览器运行该链接并下载该文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42947229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档