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

标签 javascript google-apps-script jsonp

我正在尝试使用 ContentService , 服务 JSONP在带有 Google Apps Script 的网页中, 按照 this link 中提供的样本在“在网页中提供 JSONP” 子主题下。

商品编码:

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>

生成的链接,在我的例子中是:
"https://script.google.com/macros/s/AKfycbwZCY0qrZ09szGvKOttA30IaJkdMAZrh_oNnvv0qzCqFWyuO5Wc/exec?start=1325437200&end=1325439000&prefix=alert "

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

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

如何克服这个问题?

最佳答案

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

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

关于javascript - JSONP 使用 Google Apps 脚本的 ContentService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041124/

相关文章:

javascript - 获取 json 意外 token

javascript - JavaScript 中的距离数学并在循环中实现它?

google-apps-script - 用于在 Google 表格自动完成下拉列表中显示可选参数的 JSDoc

google-apps-script - 在谷歌脚本中使用自定义顺序对列进行排序

javascript - 连接具有多对多关系字段的两个表

javascript - 提供跨站点内容——JSONP、iframe 或其他?

javascript - 是否可以通过 AJAX 加载跨域网页?

javascript - Lumia 640 LTE edge explorer - 未定义 javascript $

php - 在哪里可以找到 PHP 输出/日志

javascript - 我可以根据特定的 Select 值自动设置 js-GRID 文本字段吗?