我已经使用UiApp构建了一个表单来收集用户的信息。多个面板和文件上传相当复杂,所以我想在提交之前让用户有机会查看他们的输入。我希望在一个最终评审面板上显示他们的输入,然后允许他们决定编辑信息并返回到之前的面板进行编辑。
以下是测试脚本。我得到的最远的是让它返回'textBox'而不是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 我包括了生成的脚本。它包括评论功能,引导用户返回编辑的按钮,以及发布它的submitButton。 (您需要替换该帖子的电子表格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;
}
答案 0 :(得分:1)
你的整个功能都在doGet()中。首次加载UI时,将执行doGet()函数。 所以,
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;
}
答案 1 :(得分:0)
Srik说的是真的(当然; - )),你不能确定为这种类型的价值分配标签......我会做什么(因为你在doGet /中工作) doPost结构)是在提交按钮旁边创建第二个按钮,触发“审核”功能的处理程序,该功能使用来自主窗体的值填充所有相应的文本框,列表框或任何内容(一种副本)它已经在你已经拥有的评论小组中。为此,您需要将表单作为callBackElement添加到处理程序(使用doPost方案时不需要)。
另一种选择可能是使用“关键字”触发器或“价值更改触发器”分别将此处理程序添加到所有窗口小部件,以便审核面板始终是实时更新的,在这种情况下,“提交前的审核”面板'可以在没有用户进一步操作的情况下随时可见,除了使其最终可见(尽管它也可以始终可见)。在此选项中,处理函数更像是“同步器”。我担心文件上传会有一些困难(因为这只能在doGet / doPost结构中工作)。