Javascript JSONP使用谷歌应用程序脚本的ContentService?

Javascript JSONP使用谷歌应用程序脚本的ContentService?,javascript,google-apps-script,jsonp,Javascript,Google Apps Script,Jsonp,我正在尝试使用,在网页中提供,遵循“在网页中提供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

我正在尝试使用,在网页中提供,遵循“在网页中提供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>
在我的例子中,生成的链接是:
“”

如果此链接位于浏览器地址栏中,则会显示以下消息:

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


如何克服此问题?

JSONP需要以下任一项才能工作:

  • 匿名访问,在“用户访问webapp”模式下不可用-您需要以“以我的身份执行”运行它
  • 一个不使用任何需要授权的服务的脚本,在这种情况下,您可以选择“用户访问webapp”。这只适用于登录到谷歌的用户,与以前的模式相比,使用它的唯一优势是,所使用的服务的任何配额将应用于每个用户,而不是webapp的所有用户。一般来说,首选选项1而不是此选项
  • 已由用户预先授权的脚本。这也只适用于已登录的用户,但它允许您使用任何服务。有关如何使用此功能,请参见下文
  • 我假设您正在尝试使用3-否则,使用1,它就会正常工作。如果您确实需要3(例如,一个访问用户电子邮件的JSONP服务),那么您必须在服务开始工作之前向他们提供授权服务的能力。为此,请在doGet()中添加类似的内容:


    然后,您可以为用户提供一个指向script.google.com/YOUR_script_URL?auth=1的链接,用户可以访问该链接。(值1无关紧要……任何值都可以)。他们将获得授权页面,如果他们接受授权,他们将看到您的感谢消息,JSONP服务将为他们工作。这只需要做一次。。。脚本将在用户下次访问您的页面时记住授权,除非您已将其更改为需要新权限或用户已撤销授权。

    问题在于您试图在客户端代码中执行的jsonp“脚本”不是有效的Javascript,正如您所示,它是授权html网页。一旦得到授权,就可以了。尽管如此,正如教程所说,在部署web应用程序时,您可以以自己(“我”)的身份执行该应用程序,然后允许访问“任何人,甚至匿名”,并且您不会得到任何授权提示。虽然这显然有一些不同的行为,在看你的日历和看用户的方面。Corey G提供了一种很好的方式来提示初始授权。

    在任何网页中提供JSONP都会抛出一个错误:

    未捕获的语法错误:意外的标识符

    这可能会被更正,但这是意料之中的,因为它正在将数据发送到外部页面,脱离GAS环境(UiApp或HTMLservice)。。如果您在客户端创建自己的javascript函数,ServiceContent将运行良好

    应用程序脚本代码:

    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):

    致以最诚挚的问候
    @姆莱恩斯

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

    以“我”的身份执行应用程序,然后允许访问“任何人,甚至是匿名者”,不会得到任何授权提示,但谷歌提供的代码也不会起作用。之后,Google将其示例代码从
    ContentService.MimeType.JSON
    更改为
    ContentService.MimeType.JAVASCRIPT
    ,但它们都不起作用。jQuery回调方法也不再起作用。我怀疑谷歌是否仍然允许这种做法。
    function doGet(e) {
      if (e.parameter.auth) 
        return HtmlService.createHtmlOutput('Thank you! Now the script can run!');
      // ... rest of your code
    }
    
    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);`
      }
    
    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
    });
    
    function myabc(data) {
      //alert(data);
      //alert(data.message);
      //var xyz = JSON.stringify(data);
      //alert(xyz);
      alert(data.message);
    }