如何解决为什么在这种情况下 UrlFetchApp 无法获取内容? 听起来 CME 可能阻止了 Apps 脚本索引.html代码.gs警告参考
我希望将一些文件保存到我的 Google 云端硬盘。但是 UrlFetchApp.fetch
不会得到任何响应并且会超时。我怎么知道这里出了什么问题?
var url = 'https://www.cmegroup.com/cmeWS/exp/voiProductsViewExport.ctl?media=xls&TradeDate=20210702&assetClassId=2&reportType=F&excluded=CEE,CEU,KCB';
var response = UrlFetchApp.fetch(url);
Logger.log(response.getResponseCode())
var folder = DriveApp.getFolderById(folderID); // omitting folderID in this snippet
var file = folder.createFile(response.getBlob());
file.setName('file.xls');
解决方法
听起来 CME 可能阻止了 Apps 脚本。
我今天看到了几个这样的问题。
对于 CME 阻塞,您无能为力(如果是这种情况),但有一种方法可以解决此问题,即使它需要访问浏览器。我注意到,如果我使用 JavaScript fetch
API,它会正确返回 XLS blob,因此这里有一个使用 Apps Script Web App 的解决方法。
索引.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
</body>
<script>
const r = fetch('https://www.cmegroup.com/CmeWS/exp/voiProductsViewExport.ctl?media=xls&tradeDate=20210702&assetClassId=2&reportType=F&excluded=CEE,CEU,KCB')
.then(r => r.blob())
.then(b => readFile(b))
.then(result => saveToDrive(result))
function saveToDrive(base64) {
google.script.run
.withSuccessHandler(() => console.log("success"))
.saveAsXLS(base64)
}
function readFile(blob){
return new Promise((resolve,reject) => {
var fr = new FileReader();
fr.onload = () => {
resolve(fr.result)
};
fr.onerror = reject;
fr.readAsDataURL(blob);
});
}
</script>
</html>
代码.gs
function doGet(){
return HtmlService.createHtmlOutputFromFile("index")
}
function saveAsXLS(dataURL){
const parts = dataURL.split(",")
const type = (parts[0]).replace('data:','');
const blob = Utilities.newBlob(Utilities.base64Decode(parts[1],Utilities.Charset.UTF_8),type,"sheet.xls")
DriveApp.createFile(blob)
}
基本上,它不是使用 UrlFetchApp,而是使用浏览器实例使用 JavaScript fetch
API 来获取 blob,然后在将其发送到 Apps 脚本端之前对其进行编码。然后,Apps 脚本端对其进行解码并将其保存到云端硬盘。
警告
尽管此时您最好使用 curl
或 Python,因为您必须实际访问 Web 应用程序才能执行它。
参考
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。