我试图用contentService的 ,以服务JSONP与网页谷歌Apps脚本 ,按照所提供的样本此链接下的“在网页服务JSONP”子主题。
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
,具有下列参数:
- 执行应用程序为:用户在访问Web应用程序
- 谁有权访问该应用程序:任何人
不幸的是,每当我尝试运行/打开包含代码的HTML文件,我在浏览器的控制台下面的错误,并没有任何反应:
如何运行在谷歌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>
生成的链接,在我的情况是:
“ https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert ”
如果此链接放置在浏览器地址栏中,它显示以下信息:
这意味着返回授权响应无法被显示在浏览器和被翻译为有效DOM。
如何解决这个问题?
JSONP需要以下工作中的任何一个:
- 匿名访问,这是不具备的“用户访问web应用程序”模式 - 你需要运行它作为“执行为我”。
- 一个脚本,不使用无需授权的任何服务,在这种情况下,您可以选择“用户访问web应用程序。” 这只会为登录到谷歌用户的工作,并利用它比上年模式的唯一好处是,使用服务的任何配额将每个用户的,而不是在Web应用程序的所有用户都可以使用。 在一般情况下,宁愿选择1不谈这个。
- 已被用户预先授权的脚本。 这也将只对注册用户,但它会让你使用任何服务工作。 以下说明如何使用这个。
我假设你要使用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服务会为他们工作。 这只需进行一次......该脚本将在下一次用户访问你的页面,除非你已经改变了它需要新的权限或用户已撤销的授权记得授权。
问题是JSONP“脚本”你想在你的客户端代码执行是不是有效的JavaScript,为你展示,它是授权的HTML网页。 一旦授权就应该罚款。 虽然,作为教程说,部署Web的应用程序时,你可以执行应用程序为自己(“我”),然后允许访问“任何人,甚至是匿名的”,你不会得到任何提示进行授权。 虽然这显然有稍微不同的行为,在看你的日历VS用户的条款。 科瑞G公司可提供一个很好的方式开始提示进行授权。
在始终任何网页服务JSONP抛出一个错误:
未捕获的SyntaxError:意外标识符
这可能被修正,但预期的,因为它是将数据发送到外部网页,出气体的环境中(或了UiApp HTMLservice)..如果您在客户端上创建自己的JavaScript函数,ServiceContent效果很好..
Google 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
对于Ajax调用时,必须在服务器端使用setMimeType(ContentService.MimeType.JAVASCRIPT);