javascript – 使用Google Apps脚本的ContentService的JSONP?

我正在尝试使用ContentService,在0700的网页中使用0700服务,遵循this link中“在网页中提供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文件时,我在浏览器的控制台中出现以下错误,并且没有任何反应:

如何在没有错误的情况下运行Google Apps脚本链接中提供的此示例?

[可选]详细调查问题:
浏览器生成的资源文件中发现的错误如下:

浏览器翻译的DOM如下:

<html>
   <head>
       <script src="https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&amp;end=1325439000&amp;prefix=alert">
       </script>
   </head>
   <body></body>
</html>

在我的例子中生成的链接是:“https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert
 如果此链接放在浏览器地址栏中,则会显示以下消息:

这意味着返回的授权响应无法在浏览器上显示并被转换为有效DOM.

如何克服这个问题?

解决方法:

JSONP需要以下任何一种方法才能工作:

>匿名访问,“用户访问webapp”模式不可用 – 您需要将其作为“按我执行”运行.
>不使用任何需要授权的服务的脚本,在这种情况下,您可以选择“访问Web应用程序的用户”.这仅适用于登录Google的用户,并且在之前的模式下使用它的唯一优势是,所使用的服务的任何配额都将应用于每个用户,而不是应用于webapp的所有用户.一般来说,更喜欢选项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服务将适用于他们.这只需要执行一次……脚本将在用户下次访问您的页面时记住授权,除非您已将其更改为需要新权限或用户已撤消授权.

上一篇:javascript – 无法存储使用jQuery JSONP获取的数据


下一篇:javascript – JSONP和XMLHttpRequest问题