0

我用 UiApp 构建了一个表单来收集用户的信息。多个面板和文件上传相当复杂,所以我想让用户有机会在提交之前查看他们的输入。我希望在一个最终审核面板上显示他们的输入,然后让他们决定编辑信息并返回到较早的面板进行编辑。

以下是测试脚本。我得到的最远的是让它返回'textBox'而不是文本框的值。是否可以在脚本的 doGet 部分中获取值,或者我必须移动到 doPost 以访问这些值?

你会建议什么工作?感谢您的任何帮助!

function doGet(e){
var app = UiApp.createApplication();
var appPanel = app.createVerticalPanel();
var form = app.createFormPanel();
var panel1 = app.createHorizontalPanel();

var emailLabel = app.createLabel('Your Email');
var email = app.createTextBox().setName('email').setId('email');

app.add(form);

var button1 = app.createButton('Go to Review');

panel1.add(emailLabel);
panel1.add(email);
panel1.add(button1);
appPanel.add(panel1);
form.add(appPanel);


var panel2 = app.createHorizontalPanel().setVisible(false);
var reviewLabel = app.createLabel('Your Email:');
var reviewEmail = app.createLabel(email);

panel2.add(reviewLabel);
panel2.add(reviewEmail);
appPanel.add(panel2);

//
var reviewPageTwo = app.createClientHandler()
.forTargets(panel1).setVisible(false)
.forTargets(panel2).setVisible(true);

button1.addClickHandler(reviewPageTwo);

return app;
}

更新 8.24.12 我包括生成的脚本。它包括审阅功能、引导用户返回编辑的按钮和提交按钮。(您需要替换电子表格 ID 才能使帖子生效。)

感谢大家的帮助!马丁

 function doGet(e){
var app = UiApp.createApplication();
var appPanel = app.createVerticalPanel();
var form = app.createFormPanel();
var panel1 = app.createHorizontalPanel().setId('panel1');

var emailLabel = app.createLabel('Your Email');
var email = app.createTextBox().setName('email').setId('email');
var syncChangeHandler = app.createServerHandler('syncText').addCallbackElement(form);


app.add(form);

var button1 = app.createButton('Go to Review');

panel1.add(emailLabel);
panel1.add(email);
panel1.add(button1);
appPanel.add(panel1);
form.add(appPanel);


var panel2 = app.createHorizontalPanel().setId('panel2').setVisible(false);
var reviewGrid = app.createGrid(3,3).setId('reviewGrid');
var reviewEmail = app.createLabel().setId('reviewEmail');
var reviewLabel = app.createLabel('Your Email:');
var submitButton = app.createSubmitButton('Submit');
var button2 = app.createButton('Edit Response');

panel2.add(reviewLabel);
panel2.add(reviewEmail);
panel2.add(button2);
panel2.add(submitButton);
appPanel.add(panel2);

//
var editResponse = app.createClientHandler()
.forTargets(panel1).setVisible(true)
.forTargets(panel2).setVisible(false);

button1.addClickHandler(syncChangeHandler);
button2.addClickHandler(editResponse);

return app;
}

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


  app.getElementById('reviewEmail').setText(e.parameter.email);
  app.getElementById('panel1').setVisible(false);
  app.getElementById('panel2').setVisible(true);
  return app;
}

function doPost(e){
var ss = SpreadsheetApp.openById('*your spreadsheet id here*').getSheets()[0];
var range = ss.getRange(ss.getLastRow()+1, 1, 1,2);

var values = [[new Date(),e.parameter.email]];
range.setValues(values);

var app = UiApp.getActiveApplication();
var label = app.createLabel('Thank You!');
app.add(label);

return app;
}
4

2 回答 2

1

你在 doGet() 中有你的整个函数。doGet() 函数在您的 UI 首次加载时执行。所以,

var email = app.createTextBox().setName('email').setId('email');

实际上解析为一个文本框。当你这样做

var reviewEmail = app.createLabel(email);

您试图将文本框作为参数传递给 createLabel,这是不允许的。因此这是行不通的。您必须在处理程序中处理对文本框的更改。

function doGet(){
var syncChangeHandler = app.createServerHandler('syncText').addCallbackElement(form);
var email = app.createTextBox().setName('email').setId('email');
...
var reviewEmail = app.createLabel().setId('reviewEmail');
...
}

function syncText(e){
  var app = UiApp.getActiveAplication(); 
  app.getElementById('reviewEmail').setText(e.parameter.email);
  return app;
}
于 2012-08-20T17:27:53.057 回答
0

Srik 说的是真的(当然 ;-)),你确实不能分配这种类型的值的标签......我会做的(因为你在 doGet/doPost 结构中工作)只是创建第二个按钮除了触发处理程序的提交按钮之外,该处理程序会填充所有相应的 textBoxes , listBoxes 或任何您拥有的值,这些值来自您已经在审查面板中的主表单(它的一种副本)有。为此,您需要将表单作为 callBackElement 添加到处理程序(doPost 方案不需要这样做)。

另一种选择可能是将此处理程序分别添加到所有小部件,使用“键向上”触发器或“值更改触发器”,以便审查面板始终实时更新,在这种情况下,“提交前审查面板”可以除了使其最终可见之外,无需用户采取进一步行动即可随时可见(尽管它也可以始终可见)。在这个选项中,处理函数更像是一个“同步器”。恐怕您在上传文件时会遇到一些困难(因为这只能在 doGet/doPost 结构中工作)。

于 2012-08-20T18:41:53.753 回答