JSONP使用谷歌Apps脚本的contentService的?(JSONP using Conte

2019-08-04 18:09发布

我试图用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&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。

如何解决这个问题?

Answer 1:

JSONP需要以下工作中的任何一个:

  1. 匿名访问,这是不具备的“用户访问web应用程序”模式 - 你需要运行它作为“执行为我”。
  2. 一个脚本,不使用无需授权的任何服务,在这种情况下,您可以选择“用户访问web应用程序。” 这只会为登录到谷歌用户的工作,并利用它比上年模式的唯一好处是,使用服务的任何配额将每个用户的,而不是在Web应用程序的所有用户都可以使用。 在一般情况下,宁愿选择1不谈这个。
  3. 已被用户预先授权的脚本。 这也将只对注册用户,但它会让你使用任何服务工作。 以下说明如何使用这个。

我假设你要使用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服务会为他们工作。 这只需进行一次......该脚本将在下一次用户访问你的页面,除非你已经改变了它需要新的权限或用户已撤销的授权记得授权。



Answer 2:

问题是JSONP“脚本”你想在你的客户端代码执行是不是有效的JavaScript,为你展示,它是授权的HTML网页。 一旦授权就应该罚款。 虽然,作为教程说,部署Web的应用程序时,你可以执行应用程序为自己(“我”),然后允许访问“任何人,甚至是匿名的”,你不会得到任何提示进行授权。 虽然这显然有稍微不同的行为,在看你的日历VS用户的条款。 科瑞G公司可提供一个很好的方式开始提示进行授权。



Answer 3:

在始终任何网页服务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



Answer 4:

对于Ajax调用时,必须在服务器端使用setMimeType(ContentService.MimeType.JAVASCRIPT);



文章来源: JSONP using ContentService of Google Apps Script?