【问题标题】:Fetch file from external URL and upload to Google Drive using Apps Script从外部 URL 获取文件并使用 Apps 脚本上传到 Google Drive
【发布时间】:2021-10-15 07:22:10
【问题描述】:

我不确定这是否可能。我正在尝试通过 google 表单中的插件获取上传到 formfacade 服务器的文件。我正在使用它来允许其他非 Gmail 用户无需登录即可上传文件。

我提到了 Mogsdad 和 dheeraj raj 的回答 Can I download file from URL link generated by google apps script 使用 UrlFetchApp 来实现这个目标。以下是我的代码:

方法一:

    function UrlFile2gdrive() {
     var sheet=SpreadsheetApp.getActiveSheet();
     var lrow=sheet.getLastRow();
     //var fileURL=sheet.getRange(lrow,2).getValue();
     var fileURL='https://formfacade.com/uploaded/1FAIpQLSfscYq_sbYcT2P3Sj3AvSD2zYKalIM0SKdPTESf1wE9Rq8qew/'
     +'97dc1ee0-f212-11ea-95c3-bdb6c5ab13b3/2124651919/A%20Sample%20PDF.pdf'
     var params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}}; 
     
     var response=UrlFetchApp.fetch(fileURL,params);
      Logger.log(response.getContentText());
    var fileBlob=response.getBlob();
    
      
      var folder='0B2b-M7h6xF-Mflk3dGswano2TnJ3dGlmZG8wOUREMFg4blM5SHBuM3lqYmdPOThZSTBTSWs'
    
    
    var filename=fileURL.split("/").pop();
    //var filename=fileURL.split("%2F").pop();
    var file=decodeURIComponent(filename);
      Logger.log("filename : "+file);
      
     
     var newfile=DriveApp.getFolderById(folder).createFile(fileBlob.setName(file));    
     //var newfile=DriveApp.getFolderById(folder).createFile(response.setName(filename));
     
    }

方法二

    //api-key : AIzaSyCcbdBCI-Kgcz3tE1N4paeF9a-vdi3Uzz8
    
    //Declare function
    function URL2gdriveWithPswd() {
      //Getting url,existing name and new name for image from the sheet in 
      //variable url, name and new_name respectively
      var sh = SpreadsheetApp.getActiveSheet();
      var row = sh.getLastRow();
      Logger.log(row);
      //for (var i = 2; i <= row; i++) {
    
        /*var url = sh.getRange(i, 2).getValue();
        Logger.log(url);
        var name = sh.getRange(i, 3).getValue();
        var new_name = sh.getRange(i, 4).getValue();*/
      var url = sh.getRange(row, 2).getValue();
        Logger.log(url);
        var filenm=url.split("/").pop();
        var new_name=decodeURIComponent(filenm);
        var name = sh.getRange(row, 3).getValue();
        //var new_name = sh.getRange(row, 4).getValue();
        //Creating authentication token for downloading image, it may not be //required if image can be downloaded without login into
        var user = "dtestsys@gmail.com";
        var password = "1851235656";
        var headers = {
          "Accept": "application/xml",
          "Content-Type": "application/xml",
          "Authorization": "Basic " + Utilities.base64Encode(user + ":" + password)
        };
        //defining method to download file
        var options = {
          "method": "get",
          "headers": headers
        };
        //Getting folder name where to store downloaded image
        var folders = DriveApp.getFoldersByName('File Uploader (File responses)');
        while (folders.hasNext()) {
          var folder = folders.next();
          Logger.log(folder.getName());
        }
        //Getting response on hit of url using downloading method defined //earlier storing in Blob
        var response = UrlFetchApp.fetch(url, options).getBlob();
        //Creating image in folder defined with response in blob and logging same file //in log to check, if required
        var file = folder.createFile(response);
        Logger.log(file);
    
        //renaming image
        var images = folder.getFiles();
        while (images.hasNext()) {
          var image = images.next();
          
          file.setName(new_name);
          Logger.log("imagename : "+image.getName());
        }
      //}
    }

但是,这两种方法都设法将文件放入我的 gdrive 中,但内容仅包含 html 代码 (https://drive.google.com/file/d/1NYQoMmCQEoP3z6L8niq1mpvIx7xl83zu/view?usp=sharing),我认为在 google 响应表中传递的 URL 只是一个“掩码”。我注意到文件里面有一些提到 api-key 和 code 的行(在用户电子邮件地址旁边)。有可能实现我的目标吗?这些 api-key 和代码对于获得授权访问文件并将其下载到 gdrive 中是否有用?

我重新检查了。生成并传递到我的谷歌表响应的链接只是重定向到另一个 XML 文件的登录页面。当我在显示原始文件内容后复制回最终 URL 时,URL 如下: https://storage.googleapis.com/formfacade-public/1FAIpQLSfscYq_sbYcT2P3Sj3AvSD2zYKalIM0SKdPTESf1wE9Rq8qew%2F97dc1ee0-f212-11ea-95c3-bdb6c5ab13b3%2F2124651919%2FA%20Sample%20PDF.pdf?GoogleAccessId=firebase-adminsdk-pve0p%40formfacade.iam.gserviceaccount.com&Expires=1599671507&Signature=fBzWej0fEgF6Aw7oCHX%2FTTUfHbcep%2Bj%2B%2FhB3fYFUDeq0SFTuyJ6jTnLWQJmldD6XkVug0%2BNki7ZPNo2ESufvIfQjhVLKXgvp7UiQheJ4GYL%2BtXgFLaUyglgemmfp7KSvIvPxpMcpC2lR8em3E5YIvMRr9tcfzagvusQYHEb9mlD7k833bVoqFUVWuP%2FkP8tl%2BHYVL15kSXAjtFif4QZpu%2FFHwSik89Keo78LKTm0U8hZiAMeYDQZWF6w1pcKpy04md3xKtDPwZYCoUWOOtKkCI6JLskE5HweDvMCGnDbxW8o6SWD%2BIC%2FlaNC6%2BJ81OB10cuRqwQPEc9LnfgCZK7b1A%3D%3D

当我粘贴上面的链接时,我看到了下面的截图:- 。所以,我猜他们不会共享上传文件的直接访问链接,因此我们可以选择购买/订阅付费版本。

有谁知道我是否可以使用更好的替代方案来实现这一目标?就像我在 @Tanaike 之前关于 Convert-API 的回答中学到的将 pdf 文件转换为 PNG 的 API 密钥链接一样?当然,它对免费版本有一些限制,但它仍然是一个非常有用的解决方案。

【问题讨论】:

  • 能否提供下载文件的规范?例如,您可以使用 curl 命令下载文件吗?如果可以的话,可以给我看看吗?
  • 我真的很抱歉@Tanaike。我不知道卷曲。但它需要在 GAS 中。用户上传的文件必须自动推送为电子邮件中的内联图像给我们的管理员进行验证过程。为了扩大我的目标范围,我希望能够允许非谷歌帐户用户上传。虽然我找到了付费解决方案,但我希望使用免费解决方案(如果可能)。
  • 感谢您的回复和补充信息。不幸的是,根据您的附加信息,我无法理解下载文件的规范。我对此深表歉意。但是我注意到已经发布了答案。在这种情况下,我想尊重现有的答案。

标签: google-apps-script


【解决方案1】:

您没有在任何地方分配 blob 的内容类型。但是,如果您正确命名,则无关紧要。在方法 1 中,当您应该在从 Blob 创建的文件上设置名称时,您尝试在 Blob 上设置名称。

创建文件后尝试设置文件名。

示例:

function myFunction() {
  var url  ="http://www.africau.edu/images/default/sample.pdf";
  var response = UrlFetchApp.fetch(url);
  console.log(response.getResponseCode());
  var blob=response.getAs('application/pdf');
  var folder = "<SOME-FOLDER-ID>";
  var fileName=decodeURIComponent(url.split("/").pop());
  
  console.log("File named : "+fileName);
  var file=DriveApp.getFolderById(folder).createFile(blob);
  // Set the name to the created file after creating it!
  file.setName(fileName); 
}

参考课程File

【讨论】:

  • 您的代码为我的文件生成了相同的输出。我怀疑 formfacade 自动生成的 URL 链接不是文件的直接链接,但如果我希望使用他们的插件上传文件,我无法控制该部分。在我将所谓的文件传输到我的 gdrive 之后,我需要的是基于 API 密钥和在文档中捕获的代码获取 xml(可能)。我想在我放弃之前检查是否有任何人可能有解决方案,并说除非我升级为付费会员(也许),否则这永远不会奏效。
  • 更新了我的答案。使用 getAs('application/pdf') 获取 blob。
  • 您的代码可以生成 pdf 文件。 drive.google.com/file/d/1hWoH2K6zkvJdOHegQD1j5toNizCJ79mj/… 但内容是我在将我重定向到原始文档之前首先看到的网页。刚才,我在显示原始文档后重新检查了 URL。在浏览器中,我刚刚注意到 URL 有一些扩展链接,如 XML(具有凭据和令牌到期日期时间)。当我直接在浏览器中复制+粘贴该链接时,我看到它按照上面编辑的问题中的屏幕截图显示。
  • 是的,该文件不是公开的。所以你确实无能为力。要免费下载它,或者没有凭据...
  • 我想我只会用勾号来评价你的答案,因为我的问题标题没有提到它是专门针对来自 formfacade 的 URL 的。无论如何,感谢您的帮助和努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多