我正在尝试使用ContentService,使用JSONP在Google Apps Script的网页中投放this link,并按照“提供JSONP下的https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert中提供的示例进行操作网页“子主题。
GS代码:
function doGet(request) {
var events = CalendarApp.getEvents(
new Date(Number(request.parameters.start) * 1000),
new Date(Number(request.parameters.end) * 1000));
var result = {
available: events.length == 0
};
return ContentService.createTextOutput(
request.parameters.prefix + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JSON);
}
HTML / JS代码:
<script src="https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert"></script>
我通过将GS代码部署为webapp
并使用以下参数发布了它:
不幸的是,每当我尝试运行/打开包含代码的HTML文件时,我在浏览器的控制台中出现以下错误,并且没有任何反应:
如何在没有错误的情况下运行Google Apps脚本链接中提供的此示例?
<小时/>
浏览器翻译的DOM如下:
<html>
<head>
<script src="https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert">
</script>
</head>
<body></body>
</html>
在我的情况下,生成的链接是:“{{3}}”
如果此链接放在浏览器地址栏中,则显示以下消息:
表示返回的授权响应无法在浏览器上显示并被转换为有效的DOM。
如何解决此问题?
答案 0 :(得分:6)
JSONP需要以下任何一项工作:
我假设您正在尝试使用3 - 否则,使用1并且它将起作用。如果确实需要3(例如,访问用户电子邮件的JSONP服务),则必须授予他们在服务工作之前授权服务的能力。为此,请将这样的内容添加到您的doGet():
function doGet(e) {
if (e.parameter.auth)
return HtmlService.createHtmlOutput('Thank you! Now the script can run!');
// ... rest of your code
}
然后,您可以为用户提供指向他们可以访问的script.google.com/YOUR_SCRIPT_URL?auth=1的链接。 (值1无关紧要......任何值都可以)。他们将获得授权页面,如果他们接受授权,他们将看到您的感谢信息,JSONP服务将适用于他们。这只需要完成一次......脚本将在用户下次访问您的页面时记住授权,除非您已将其更改为需要新权限或用户已撤销授权。
答案 1 :(得分:1)
问题是您尝试在客户端代码中执行的jsonp“脚本”是无效的Javascript,如您所示,它是授权html网页。一旦获得授权,它应该没问题。但是,正如教程所说,在部署Web应用程序时,您可以自己执行应用程序(“我”),然后允许访问“任何人,甚至匿名”,您将不会获得任何授权提示。虽然这显然有一些不同的行为,但在查看您的日历与用户的情况方面。 Corey G提供了一种最初提示授权的好方法。
答案 2 :(得分:1)
在任何网页中提供JSONP总是会抛出错误:
未捕获的SyntaxError:意外的标识符
这可能会得到纠正,但是可以预期,因为它是在GAS环境(UiApp或HTML服务)之外将数据发送到外部页面..如果您在客户端创建自己的javascript函数,ServiceContent运行良好..
Apps脚本代码:
function doGet(e) {
// ..more code
lReturn = true;
var mymessage = (lReturn==true) ? "your contact details are saved ! ":" data no saved.. ";
var result = { status: lReturn, message : mymessage };
return ContentService.createTextOutput(
e.parameter.prefix + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JSON);`
}
和Javascript代码(使用JQuery):
var url = <your Apps Script URL>?prefix=myabc
$.ajax({
type: "GET",
url: url1,
data: {callback:"?"},
dataType: "script"
}).done( function( data ) {
console.log(data); //data returned : UNDEFINED
});
和你自己的javascript函数:
function myabc(data) {
//alert(data);
//alert(data.message);
//var xyz = JSON.stringify(data);
//alert(xyz);
alert(data.message);
}
最好的问候 @Mlaynes http://mlaynessanchez.blogspot.com
答案 3 :(得分:0)
对于ajax调用,您必须在服务器端使用setMimeType(ContentService.MimeType.JAVASCRIPT);