如何在提交表单之前允许用户查看答案?

时间:2012-08-20 16:57:21

标签: google-apps-script

我已经使用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;
}

2 个答案:

答案 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结构中工作)。