JSONP使用Google Apps脚本的ContentService?

时间:2012-12-26 13:15:24

标签: javascript google-apps-script jsonp

我正在尝试使用ContentService,使用JSONPGoogle 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文件时,我在浏览器的控制台中出现以下错误,并且没有任何反应:

enter image description here

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

<小时/>

[可选]详细调查问题:

浏览器生成的资源文件中发现的错误如下: enter image description here

浏览器翻译的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>

在我的情况下,生成的链接是:“{{3}}”

如果此链接放在浏览器地址栏中,则显示以下消息: enter image description here

表示返回的授权响应无法在浏览器上显示并被转换为有效的DOM。

如何解决此问题?

4 个答案:

答案 0 :(得分:6)

JSONP需要以下任何一项工作:

  1. 匿名访问,“用户访问webapp”模式无法访问 - 您需要将其作为“按我执行”运行。
  2. 不使用任何需要授权的服务的脚本,在这种情况下,您可以选择“访问webapp的用户”。这仅适用于登录Google的用户,并且在之前的模式下使用它的唯一优势是,所使用的服务的任何配额都将应用于每个用户,而不是应用于webapp的所有用户。一般来说,更喜欢选项1。
  3. 已由用户预先授权的脚本。这也仅适用于已登录的用户,但它允许您使用任何服务。请参阅下文,了解如何使用它。
  4. 我假设您正在尝试使用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);