如何使用Google Apps脚本和UI服务接受用户(文本框)的值并创建网站(当用户点击“提交”按钮时)?

时间:2013-08-27 18:32:12

标签: javascript google-apps-script

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

这是我的剧本:

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();
}

1 个答案:

答案 0 :(得分: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以提取其域。我建议使用parseUri by Steven Levithan来处理任务:

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

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

之后,我们将剩余路径视为URI并再次调用parseUri(),提取host属性,domain。< / p>

  

另外,createSite()createWebPage()之间有什么区别?

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


编辑 - 调试结果

调试WebApps很棘手。熟悉“View - Execution Transcript”,因为它会在调用时显示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();
}