我有两个Google Spreadsheets,每个都附加了一些Apps脚本。最终,我希望将它们都部署为WebApp,以便它们可以通过公共URL相互通信。目前,我只部署了其中一个,所以我可以测试这个功能。
我们将脚本A称为部署为WebApp和脚本B的脚本,即尝试向脚本A的URL发送请求的脚本。这里的目标是脚本A将JSON对象返回到脚本B。
在脚本A中,我有这段代码:
function doGet(request) {
var data = [[1, 2, 3], [4, 5, 6]]; //dummy JSON object
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}
在脚本B中,我有这段代码:
function pullJSON(URL) {
var data = UrlFetchApp.fetch(URL, {"contentType": "application/json"});
Logger.log(data);
}
当我访问脚本A的exec URL时,我得到一个JSON对象。但是,当我在脚本B中运行 pullJSON()(为它提供相同的URL)时,Logger会显示一个填充了元数据的长HTML文件(当我在其中查看时,没有可见的内容)我的浏览器)。我很困惑为什么会出现这种情况......我知道有几个重定向要返回JSON,但我理解 UrlFetchApp.fetch()方法默认为遵循所有重定向。
这可能是OAuth问题吗?脚本A发布为用户访问应用程序,但我也尝试以我的身份运行它。
思想?
答案 0 :(得分:0)
当您将脚本部署为webapp作为服务运行时,您只能使用.exec url通过urlFetch调用它,因为开发URL(以.dev结尾的那个)只能由您访问并且请求确实不是来自你,而是来自谷歌。
我部署了您的示例并使用您的代码对其进行了测试,如下所示:
function pullJSON(URL) {
var URL = "https://script.google.com/macros/s/AKfycbzqRgv1XfUUrAimvD31OXx89GdhjeBd45SBODaq1c7bkGVusio/exec"
var data = UrlFetchApp.fetch(URL, {"contentType": "application/json"});
Logger.log(data);
}
结果如预期:
您可以自行测试,因为应用程序已部署为"以我的身份运行"任何人都可以访问,甚至匿名。
如果您想限制其访问权限,您必须在URL中添加一些参数并在服务器webapp中处理这些参数以检查请求的来源。
只需将参数添加到网址中,如下所示:
var data = UrlFetchApp.fetch(URL+"?user=serge&secret=secretcode", {"contentType": "application/json"});
然后在你的服务器脚本中检查它:
var user = request.parameter.user;
var secret = request.parameter.secret;
并且您将获得用户和秘密。
编辑:以下是带有安全控件的两个脚本的完整示例:
webapp:
function doGet(e) {
var data = [[1, 2, 3], [4, 5, 6]]; //dummy JSON object
if(e.parameter.user=='serge'&&e.parameter.secret=='secretcode'){
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}else{
return ContentService.createTextOutput('You are not allowed to get this result, user should be '+e.parameter.user+' and code should be '+e.parameter.secret)
.setMimeType(ContentService.MimeType.TEXT);
}
}
和测试脚本:
function pullJSONSecure() {
var URL = "https://script.google.com/macros/s/AKfycbyzoFbcjTXMCALTOlscwAZP6gY1mWc1mkbWb84LYO-qeQk16xw/exec"
var data = UrlFetchApp.fetch(URL+"?user=serge&secret=secretcode", {"contentType": "application/json"});
Logger.log(data);
}
如果您尝试使用此脚本并更改用户名或密码,您将看到会发生什么。
编辑2:部署参数: