2013-07-15 5 views
0

В моем понимании теперь только один doGet() может запускать уникальное приложение doPost() в приложении Google Apps Script.Могу ли я разработать приложение мастера (последовательно отправлять формы)?

Я хотел бы выполнить Software Издатель системы что пользователь загрузить файл или заполнить информацию пересмотра форм и нажмите представить к следующему шагу. На последней странице будет отображаться входная информация, отправить электронное сообщение ребятам и завершить всю операцию.

Но как мне ввести следующую форму после нажатия кнопки отправки?

Я попробовал метод, создающий 2-й и 3-й шаг ступенчатые формы в doPost() и используя Try ... Catch разницы, какой шаг форма вызвавшего текущий шаг, как следующее код. (Поскольку любые шаги не могут получить бросок элемента обратного вызова с помощью предыдущего шага, тогда возникает исключение)

Это работает очень хорошо, но я думаю, что это не создает чувства и очень глупо. Есть ли лучшие решения? Спасибо, пожалуйста.

//--------------------------------------------------------------------------- 
function doGet(e) 
{ 
    var app = UiApp.createApplication().setTitle("AP Publisher");  

    createFileUploadForm(app); 

    return app; 
} 
//--------------------------------------------------------------------------- 
function doPost(e) 
{ 
    var app = UiApp.getActiveApplication();     

    try { 
    // 2nd step form 
    var fileBlob = e.parameter.thefile;   

    createRevisionForm(); 
    } 
    catch(error) { 
    try { 
     // 3rd step form 
     createConfirmForm(e); 
    } 
    catch(error2) { 
     //Complete  
     sendMail(e);    
     modifySitePageContent(e);    
     saveHistoryFile(e); 

     showConfirmedInfo(e); 
    } 
    } 

    return app;  
} 

ответ

0

Этот ответ полностью копируется из create a new page in a form dynamically, based on data of the prev. page.

Используя UiApp службу, у вас есть один doGet() и одну doPost() функции ... но вот способ расширить их поддерживать динамическую форму из нескольких частей. (Пример кода заимствован от this answer.)

Ваш doGet() просто создает часть 1 вашей формы. В форме, однако, вы должны определить свою форму по имени, как это:

var form = app.createFormPanel().setId("emailCopyForm"); 

Вы doPost() тогда, будет проходить обработку операции сообщения для различных функций, в зависимости от того, какая форма была отправлена , Смотри ниже. (Также: reportFormParameters(), обработчик по умолчанию, который будет отображать все данные, собранные в виде части.)

/** 
* doPost function with multi-form handling. Individual form handlers must 
* return UiApp instances. 
*/ 
function doPost(eventInfo) { 
    var app; 
    Logger.log("Form ID = %s", eventInfo.parameter.formId); 
    // Call appropriate handler for the posted form 
    switch (eventInfo.parameter.formId) { 
    case 'emailCopyForm': 
     app = postEmailCopyForm(eventInfo); 
     break; 
    default: 
     app = reportFormParameters (eventInfo); 
     break; 
    } 
    return app; 
} 

/** 
* Debug function - returns a UiInstance containing all parameters from the 
* provided form Event. 
* 
* Example of use: 
* <pre> 
*  function doPost(eventInfo) { 
*  return reportFormParameters(eventInfo); 
*  } 
* </pre> 
* 
* @param {Event} eventInfo Event from UiApp Form submission 
* 
* @return {UiInstance} 
*/ 
function reportFormParameters (eventInfo) { 
    var app = UiApp.getActiveApplication(); 
    var panel = app.createVerticalPanel(); 
    panel.add(app.createLabel("Form submitted")); 
    for (var param in eventInfo.parameter) { 
    switch (param) { 
     // Skip the noise; these keys are used internally by UiApp 
     case 'lib': 
     case 'appId': 
     case 'formId': 
     case 'token': 
     case 'csid': 
     case 'mid': 
     break; 

     // Report parameters named in form 
     default: 
     panel.add(app.createLabel(" - " + param + " = " + eventInfo.parameter[param])); 
     break; 
    } 
    } 
    app.add(panel); 
    return app; 
} 

Для создания каждой формы части, последующие обработчики формы могут использовать данные, полученные в предыдущих частях, чтобы динамически добавлять новую форму объекты к ui.

0

Я думаю, что было бы проще использовать 3 (или более) различные панели в вашей функции doGet со всеми элементами, которые нужны и играть с их видимостью.

Сначала будет видна только 1-я панель и, в зависимости от пользовательского ввода (с помощью обработчиков клиента для обработки), отобразите следующие (и, в конечном счете, скройте первый).

В конце кнопка отправки вызовет doPost и получит все данные из doGet.

0

Первый отзыв моей шляпы в Могсад. Его пост (ы) направляли огни по темному документированному пути, который привел меня сюда. Here is some working code , который демонстрирует многостраничную форму, то есть исходный doGet(), а затем позволяет вам перемещаться вперед и назад, выполняя множество doPost().Все это делается в одной функции getForm(), вызываемой как стандартными doGet(), так и функциями doPost().

// Muliple page form using Google Apps Script 

function doGet(eventInfo) {return GUI(eventInfo)}; 
function doPost(eventInfo) {return GUI(eventInfo)}; 

function GUI (eventInfo) { 
    var n = (eventInfo.parameter.state == void(0) ? 0 : parseInt(eventInfo.parameter.state)); 
    var ui = ((n == 0)? UiApp.createApplication() : UiApp.getActiveApplication()); 
    var Form; 
    switch(n){ 
    case 0: { 
     Form = getForm(eventInfo,n); // Use identical forms for demo purpose only 
    } break; 
    case 1: { 
     Form = getForm(eventInfo,n); // In reality, each form would differ but... 
    } break; 
    default: { 
     Form = getForm(eventInfo,n) // each form must abide by (implement) the hidden state variable 
    } break; 
    } 
    return ui.add(Form); 
}; 

function getForm(eventInfo,n) { 
    var ui = UiApp.getActiveApplication(); 

    // Increment the ID stored in a hidden text-box 
    var state = ui.createTextBox().setId('state').setName('state').setValue(1+n).setVisible(true).setEnabled(false); 
    var H1 = ui.createHTML("<H1>Form "+n+"</H1>"); 
    var H2 = ui.createHTML(
    "<h2>"+(eventInfo.parameter.formId==void(0)?"":"Created by submission of form "+eventInfo.parameter.formId)+"</h2>"); 

    // Add three submit buttons to go forward, backward and to validate the form 
    var Next = ui.createSubmitButton("Next").setEnabled(true).setVisible(true); 
    var Back = ui.createSubmitButton("Back").setEnabled(n>1).setVisible(true); 
    var Validate = ui.createSubmitButton("Validate").setEnabled(n>0).setVisible(true); 
    var Buttons = ui.createHorizontalPanel().add(Back).add(Validate).add(Next); 
    var Body = ui.createVerticalPanel().add(H1).add(H2).add(state).add(Buttons).add(getParameters(eventInfo)); 
    var Form = ui.createFormPanel().setId((n>0?'doPost[':'doGet[')+n+']').add(Body); 

    // Add client handlers using setText() to adjust state prior to form submission 
    // NB: Use of the .setValue(val) and .setValue(val,bool) methods give runtime errors! 
    var onClickValidateHandler = ui.createClientHandler().forTargets(state).setText(''+(parseInt(n))); 
    var onClickBackHandler = ui.createClientHandler().forTargets(state).setText(''+(parseInt(n)-1)); 
    Validate.addClickHandler(onClickValidateHandler); 
    Back.addClickHandler(onClickBackHandler); 

    // Add a client handler executed prior to form submission 
    var onFormSubmit = ui.createClientHandler() 
    .forTargets(state).setEnabled(true) // Enable so value gets included in post parameters 
    .forTargets(Body).setStyleAttribute("backgroundColor","#EEE");  
    Form.addSubmitHandler(onFormSubmit); 

    return Form; 
} 

function getParameters(eventInfo) { 
    var ui = UiApp.getActiveApplication(); 
    var panel = ui.createVerticalPanel().add(ui.createLabel("Parameters: ")); 
    for(p in eventInfo.parameter) 
    panel.add(ui.createLabel(" - " + p + " = " + eventInfo.parameter[p])); 
    return panel; 
} 

код использует один «скрытый» состояние (здесь визуализируются в TextBox) и несколько SubmitButton «S, чтобы позволить пользователю для продвижения вперед и назад через последовательность форм, а также для проверки содержимого форма. Два дополнительных файла SubmitButton «перезаписаны» с использованием ClientHandler, которые просто изменяют скрытое состояние до отправки формы.

Примечания

  • Обратите внимание на использование метода .setText(value) в клиент обработчика. Используя браузер Chrome, я получаю странные ошибки времени выполнения, если я переключусь на любой из TextBox.setValue(value) или .setValue(value, fireEvents) методов.

  • Я попытался (безуспешно) реализовать эту логику, используя Script Property вместо скрытого TextBox. Вместо обработчиков клиентов это требует использования обработчиков серверов. Поведение неустойчиво, что говорит о том, что асинхронные события на стороне сервера происходят после события отправки формы.

Смежные вопросы