我正在尝试编写一个检查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.');
}
答案 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);
}