1

我现在被困了 3 天,试图让 2 个谷歌小工具在谷歌网站上可靠地通信,以根据 UiInstance.getId() 值交换匿名用户会话信息。由于不推荐使用小工具到小工具的 pubsub 功能,因此我尝试使用服务器小工具中的 ContentService 来服务来自客户端小工具的 doPost 请求 - 想法是,我将会话信息存储在服务器小工具中并拉将数据放入网站其他页面上的小工具中 - 不确定这是否可能。

但是,我什至试图修补 StackOverflow 上发布的 ContentService 上的各种示例。我被困在一个非常基本的步骤中,无法超越下面的超级简单的服务器代码。我无法弄清楚我需要从客户端小工具中使用的服务器小工具的 URL 是什么。我似乎得到了令人困惑的结果。

服务器代码:

function doGet(e) {
  var output = ContentService.createTextOutput();
  output.setContent("Hi from ContentServer!");
  return output;
}

我遵循的步骤:

1) 将服务器发布为 Web 应用程序并进行设置,以便任何人/匿名者都可以访问它。

2) 发布窗口弹出窗口显示该小工具可在 https://script.google.com/macros/s/AKfycbyIa07kBC-gqG0nJq3Up5GzUntbTaYcM1KmaYF7vQvFIWN_qxA/exec获得

3) 如果我使用浏览器打开链接,我会得到“Unknown macro doGet”。

4)如果我点击“测试您的最新代码的网络应用程序”给出的链接。from the publish window popup, it seems to take me to https://script.googleusercontent.com/echo?user_content_key=WwuWW_Hhp2wlHpHWsX-qAwu7jtKrwlt1fkkesojKEWeJXKm5AoUOhuRHxu4RIHLrWovOBUsHhOB3No0RYr05RE4tWtliFlXKm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnG5I1NuldcVdfVF6dOROkmljXtr0dWIARhfeRbamxWJIIJeMc5tWnrGPpehwqDtynQ&lib=MfYY3NqJ0IdcpreIfwd3uwgmzn1S_adTp

第 4 步中的上述链接可在浏览器中使用,但在我的客户端小工具中非常不稳定!它似乎在我第一次版本并发布它时起作用,但如果我更新版本一次,它就会返回原始 HTML。

我相信我错过了一些微不足道的步骤,或者网络应用小工具存在严重的版本控制或部署错误。

我在 stackoverflow 上查看了以下非常有用的线程。 如何使用 ContentService 和 doPost 创建 REST API

KamilG 似乎已经克服了这里的问题 Google Apps 脚本的另一个 doGet() 问题 - “未知宏 doGet”错误

但它对我来说非常不稳定,我无法确定任何可靠的程序来让 ContentService 从我的服务器小工具中工作。

任何帮助和解释将不胜感激。

这是我的客户端小工具代码。

function doGet(e) {
//  var url = "https://script.google.com/macros/s/AKfycbyIa07kBC-gqG0nJq3Up5GzUntbTaYcM1KmaYF7vQvFIWN_qxA/exec";
  //var url = "https://script.googleusercontent.com/echo?user_content_key=9tzQxTSPm8ADsHKl4bCg6ru-49C19kYZCW8IRuWiWi-Xe_lTlQZS4xq8v5aPqjR6Ybj7-xjjJXyQPhOH0T3KFtJUtXc7U-Dkm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnJlCLn2pnKC0O1TYz53ccgjxtVC9ccM8kFegFJ0AJSK_YP_ylqfjfm1EU_BUbZUu-88PMDJ6xpj8&lib=MTLHdJRs3UPYj3bYgbhBNnNGZ7UmftE34";
  var url = "https://script.googleusercontent.com/echo?user_content_key=LvlwGkBktQ732xyD1HJbh5OhMsuhkidt_rOovw-olm-wJQF4LlErMDSxsfDaAb4UBYqOeTI3-8soIBj-KaOCDi0WlUav4Nl_m5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnG5I1NuldcVdfVF6dOROkmljXtr0dWIARhfeRbamxWJIIJeMc5tWnrGPpehwqDtynQ&lib=MfYY3NqJ0IdcpreIfwd3uwgmzn1S_adTp";

  // WELL ONE OF THE URLS WORKS FROM ABOVE!!! BUT ONLY TILL I UPDATE THE SERVER WEB APP VERSION :(

  var app = UiApp.createApplication().setTitle("ClientService Client test");
  app.setStyleAttribute("background", "azure");

  var fetchMethod = 'get';
  var response = UrlFetchApp.fetch(url, {method: fetchMethod});

  //var lbl = app.createHTML("<b>Response :</b>" + response.getContentText());
  var lbl = app.createTextArea().setText(response.getContentText());

  var lbl1 = app.createHTML("<b>Response code :</b> "
                            + response.getResponseCode()); 

  app.add(lbl);
  app.add(lbl1);
  return app;
}

请帮助。

4

1 回答 1

3

这在大多数情况下都按预期运行,但我认为可能有一些替代方案。

  1. 关于您的第 3 点 - 上面的那个 URL 有效。您测试的版本一定有问题(也许您没有正确声明 doGet?)。
  2. #4 中的链接是一次性使用重定向,当您使用内容服务时会发生这种情况。请参阅底部重定向部分。这个链接是短暂的,你可能很快就可以在浏览器中捕捉到它,但另一个单独的调用客户端(“小工具”)可能就没那么幸运了。所以你永远不应该直接调用 googlecontentservice.com 链接。
  3. 关于 ContentService 片状的整体问题,我还没有看到这一点。如果我正确使用 /exec 链接,然后在每次适当的更改后正确增加版本,那么一切都会按预期工作。

我构建了一个简单的 Web 应用程序来访问您的内容服务,并且对我来说一切似乎都很好。见下文。该代码看起来与您的相同,但我使用的是第一个 url。

https://script.google.com/macros/s/AKfycbw6nlfv5ME6F3Z2WBdW24YAgfQm_E5gYV0xrMDvDwZLrX7PdMU/exec

作为替代方案 - 您是否有理由从一个脚本到另一个脚本执行服务器端 UrlFetch?如果您可以获取数据服务器端,您可以只在 UI 脚本中执行内容脚本的逻辑吗?

于 2012-11-09T14:10:38.037 回答