从Web应用程序中的Drive自动下载文件?

时间:2016-12-12 01:47:32

标签: google-apps-script

我正在尝试编写一个检查Google云端硬盘的投票网络应用,并在没有用户互动的情况下自动下载文件。

使用ContentService当我将代码放在doGet函数中时,我已经成功地完成了工作。

然而,这仅适用一次,并且似乎没有办法在计时器事件上自动刷新或重新加载页面。

在客户端javascript上使用SetTimeout我可以在服务器端获得一个函数,以便在一定的时间间隔内自动触发,但后来我不知道如何处理ContentService的输出。

on Success回调函数不接受createTextOutput的输出。

我的解决方案不需要部署,如果扩大我的选择,我很乐意从编辑器执行。

因此,一旦我在服务器端获得了createTextOutput的输出,我应该怎么做才能将它恢复到客户端以便导致文件下载?

如果有帮助,我已经包含了代码。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>

    setTimeout(
    function () 
    { 
      document.getElementById('results').innerHTML = 'Event Timer';
      google.script.run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .fetchFromGoogleDrive();
    }, 60000);

    function onSuccess(sHTML) 
    {
    document.getElementById('results').innerHTML = 'File Downloaded ' + sHTML;
    }

    function onFailure(error) 
    {
    document.getElementById('results').innerHTML = error.message;
    }

    </script>
  </head>
  <body>
    <div id="results">Waiting to DownLoad!</div>
id="Fetch">Fetch!</button> 
  </body>
</html>

function doGet() { 
  Logger.log('doGet');
  return HtmlService.createHtmlOutputFromFile('form.html');
}

function fetchFromGoogleDrive() {
  //Logger.Log('fetchFromGoogleDrive');

  var fileslist = DriveApp.searchFiles("Title contains 'Expected File'");

  if (fileslist.hasNext()) {
    //Logger.Log('File found');
    var afile = fileslist.next();
    var aname = afile.getName();
    var acontent = afile.getAs('text/plain').getDataAsString();

    var output = ContentService.createTextOutput();
    output.setMimeType(ContentService.MimeType.CSV);
    output.setContent(acontent);
    output.downloadAsFile(aname);
    return afile.getDownloadUrl();
  }
  else
  {
    //Logger.Log('No File Found');
    return 'Nothing to download';
  }

  //Logger.log('All files processed.');
}

1 个答案:

答案 0 :(得分:0)

编辑:澄清后的答案不同。

如果打算自动作为webapp运行,我会做的就是返回getDownloadUrl并使用那个作为源创建一个新的iFrame。

应用脚本

    def version(self):
    version = self.getElement("id","version")
    match = re.search(r'\w\d\.\d\.\d', version)
    if match:
        version = match.group()
        return True
    return False

index.html

function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

function getDownloadLink(){
  //slice removes last parameter gd=true. This needs to be removed. slice is a hack you should do something better
  return DriveApp.getFileById("0B_j9_-NbJQQDckwxMHBzeVVuMHc").getDownloadUrl().slice(0,-8); 
}