0

我将以下代码作为 Google Apps 脚本(部署为 Web 应用程序)并将其作为 Google Apps 脚本小工具插入到我的 Google Enterprise 页面中。UI(面板)使用标签、文本框和按钮正确加载,但是当我输入文本并单击按钮时,出现以下错误: 遇到错误:找不到您请求的资源。

这是我的脚本:

function doGet(e) {
  // create all UI elements
  var myApp = UiApp.createApplication();
  var panel = myApp.createVerticalPanel();
  var label = myApp.createLabel('Please enter the name of your new site:');
  var textBox = myApp.createTextBox().setName('txtSiteName');

  var button = myApp.createButton('Create Site');
  var btnHandler = myApp.createServerHandler('createNewSite');
  button.addClickHandler(btnHandler);
  btnHandler.addCallbackElement(panel);

  // add all UI elements to the panel
  panel.add(label);
  panel.add(textBox);
  panel.add(button);

  // add the panel to the app
  myApp.add(panel);

  // return the app to the browser to be displayed  
  return myApp;
}

// button server handler
function createNewSite(e) {
  var domain = SitesApp.getActiveSite().getUrl();  
  var siteName = e.parameter.txtSiteName;

  var newSite = SitesApp.createSite(domain, siteName, 'script_center_demo', "this is just a test page");

  return app.close();
}

createSite()另外,和 和有什么区别createWebPage()


编辑:好的,所以使用doGet()上面相同的函数,我的createNewSite()函数可能看起来像这样?

function createNewSite(e) {
  var domain = 'my-domain.com';  
  var siteName = e.parameter.txtSiteName;

  var newPage = SitesApp.createSite(domain, siteName, 'script_center_demo', "this is just a test page");

  var pageName = 'script_center_demo';
  var html = '<div><p>This project aims to....</p></div>';

  var site = SitesApp.getSite(domain, site);
  site.createWebPage('Script Center Demo', pageName, html);

  return app.close();
}
4

1 回答 1

1

看看这一行:

var domain = SitesApp.getActiveSite().getUrl();

您需要获得一个域,例如example.com,但此行将生成一个包含 google 域的 URI 和一个资源路径(包含您的域)。例子:

https://sites.google.com/a/example.com/mySite/
                           ^^^^^^^^^^^

当您尝试创建新站点时,无法找到它作为。您需要将结果剥离getUrl()为仅域名。

如果您是域管理员,则可以改用它:

var domain = UserManager.getDomain();

普通域用户无权访问 UserManager 服务,因此他们需要解析站点 URL 以提取其域。我建议使用Steven Levithan 的 parseUri来处理任务:

var uri = parseUri(SitesApp.getActiveSite().getUrl());
var domain = parseUri(uri.path.slice(3)).host;

.slice(3)操作旨在/a/path已解析站点 URI 的属性中删除。这适用于我今天在多个域中的帐户 - ymmv。

之后,我们将剩余路径视为 URI 并parseUri()再次调用,提取host属性,这应该是我们的domain.

createSite()另外,和 和有什么区别createWebPage()

您使用站点服务方法 SiteApp.createSite 创建站点的实例。没什么可看的,Site 对象是一个容器,一个骨架 - 您使用 Site.createWebPage() 方法创建将包含在 Site 中的网页,并且主要通过 Web 浏览器对用户可见。


编辑 - 调试结果

调试 WebApp 很棘手。熟悉“查看 - 执行脚本”,因为它会createNewSite()在调用处理函数时显示执行跟踪。使用该技术,这是我发现的,第 1 部分:

  • 我们不能调用SitesApp.getActiveSite().getUrl()处理程序,因为调用它时没有活动站点。您已经在使用对域进行硬编码的简单解决方法。

  • 在尝试处理新站点时,您拥有var site = SitesApp.getSite(domain, site);. 是您最新的“资源错误”消息的来源。该site参数是插入函数时遗留下来的 - 它必须是一个字符串,与createSite().

  • 您正在返回app.close(),但在函数中没有app定义。

解决了这些问题,这是问题,第 2 部分:

  • 该对话框允许用户输入站点名称,但需要遵循才能createSite成功的限制。最简单的规则是站点名称必须小写。为什么不让用户输入站点标题,并从中得出名称呢?

  • 如果网站已经存在怎么办?那不处理了。稍后创建页面也是如此。

  • 没有反馈给用户。下面的示例中包含非常基本的状态更新,这些更新附加到 UI。

更新代码

function createNewSite(e) {
  var app = UiApp.getActiveApplication();

  var domain = 'mitel.com';
  var siteTitle = e.parameter.txtSiteName;
  var siteName = siteTitle.toLowerCase();
  var result = 'Results: ';

  var site = SitesApp.getSite(domain, siteName);  // Check if site already exists
  if (site)
    result += 'Site "' + siteName + '" exists, ';
  else {
    // Doesn't exist, so create it
    site = SitesApp.createSite(domain, siteName, siteTitle, "this is just a test page");
    result += 'Site "' + siteName + '" created with title "' + siteTitle + '", ';
  }

  var pageName = 'script_center_demo';
  var html = '<div><p>This project aims to....</p></div>';

  var page = site.getChildByName(pageName);  // Check if page already exists
  if (page)
    result += 'Page "' + pageName + '" exists, ';
  else {
    // Doesn't exist, so create it
    page = site.createWebPage('Script Center Demo', pageName, html);
    result += 'Page "' + pageName + '" created, ';
  }
  result += 'Done.';

  // Add result text to UI
  var uiResult = app.createLabel(result, true);
  app.add(uiResult);
  return app.close();
}
于 2013-08-27T21:47:35.373 回答