2013-01-10 71 views
1

請求摘要:谷歌腳本:多個doPost在一個項目中

我知道FormPanel與doPost(e)一起使用。

但是,如果我有幾個formPanels,他們每個人都需要使用不同的doPost(e)集合?

由於的doPost(e)是固定的名字,怎麼能有幾個不同的doPost(E)像doPost1(E)的doPost(2)等

與createSubmitButton

同樣的問題,因爲它會自動尋找函數doPost(e),如何引導每個formPanel的提交到右側的引用doPostX(e)

如果上面不可能,是不是意味着每個Project只能有一個doPost(e)函數?

感謝,

回答

2

的doPost方法和功能的doGet 5月的問題是,你只能有一個doGet和最多每個項目一個doPost方法。這是因爲這些功能使用共享資源,因此這種功能在一個項目的功能中共享。

實際上有兩個解決方法(至少我知道並且只測試了其中兩個)使用多個doPost查詢,這些查詢在一個單個項目中執行不同的操作。

最簡單的方法(也是最好的)是在單個doPost函數中使用不同的函數,每個函數需要一個doPost函數。 這裏的訣竅是,您需要在表單中添加一個隱藏字段,以幫助您區分項目中的不同表單。

然後,您可以添加一個「if()else if()else」塊來根據隱藏字段的值選擇正確的函數。

例如,如果你有兩個功能,你可以這樣做:

function doGet(e){ 
    var app=UiApp.createApplication(); 
    some stuff; 
    return app; 
} 


function doPost(e){ 

    some stuff 

    if(e.parameter.form=="value1"){ 
    function1(e,otherParameters); 
    } 
else if(e.parameter.form=="value2"){ 
    function2(e,otherParameters); 
} 
else{ 

} 

some other stuff 
} 

function function1(e,otherParameters){ 

var app=UiApp.getActiveApplication(); 
var panel=app.createVerticalPanel(); 
var formPanel=app.createFormPanel(); 
var button=app.createSubmitButton(); 
var formHidden=app.createHidden().setName("form"); 
other widgets; 
panel.add(formHidden); 
panel.add(other widgets); 
panel.add(button); 
formPanel.add(panel); 

some stuff; 
app.add(formPanel); 
} 

function function2(e,otherParameters){ 
var app=UiApp.getActiveApplication(); 
var panel=app.createVerticalPanel(); 
var formPanel=app.createFormPanel(); 
var button=app.createSubmitButton(); 
var formHidden=app.createHidden().setName("value2"); 
other widgets different from those in function1; 
panel.add(formHidden); 
panel.add(other widgets); 
panel.add(button); 
formPanel.add(panel); 

some stuff different from what you have in function1; 
app.add(formPanel); 
} 

你也可以創建另一個項目(例如Project2的),你有一個的doPost功能,部署此項目作爲一個Web應用程序。

這個想法是,你可以使用FormPanel的setAction(「url」)方法將信息從給定的表單發送到一些URL。 使用此方法,您可以將表單的內容發送到將處理您的查詢的網頁。因此,如果您將此方法的字符串值設置爲您的網絡應用程序的網址,則會將谷歌腳本表單的內容發送到此應用程序。這是這個應用程序將使用其doPost函數來處理查詢。

該選項開發起來有點困難,並且存在目前根本沒有從FileUpload處理Blob的缺點。

希望它會幫助你

乾杯

薩科

2

注:如果在doPost()控制權轉移給,一定要使用UiApp.getActiveApplication()方法的子程序。在我急匆匆的時候,我花了更多的時間,因爲我在這些子程序中調用了UiApp.createApplication()方法。

編輯

Here is working code 演示了多頁的形式,即它的初始doGet(),然後讓你提前來回做多doPost()的。所有這些都是在標準doGet()doPost()函數調用的單個getForm()函數中完成的。

// 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 -1: { 
     Form = ui.createFormPanel().add(ui.createHTML("<H3>Exited by submission of form "+eventInfo.parameter.formId+"</h3>")); 
    } break; 
    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 Stay = ui.createSubmitButton("Stay").setEnabled(n>0).setVisible(true); 
    var Exit = ui.createSubmitButton("Exit").setEnabled(n>0).setVisible(true); 
    var Buttons = ui.createHorizontalPanel().add(Back).add(Stay).add(Next).add(Exit); 
    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 onClickStayHandler = ui.createClientHandler().forTargets(state).setText(''+(parseInt(n))); 
    var onClickBackHandler = ui.createClientHandler().forTargets(state).setText(''+(parseInt(n)-1)); 
    var onClickExitHandler = ui.createClientHandler().forTargets(state).setText('-1'); 
    Stay.addClickHandler(onClickStayHandler); 
    Back.addClickHandler(onClickBackHandler); 
    Exit.addClickHandler(onClickExitHandler); 

    // 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的,以允許用戶推動向前和向後穿過形式序列,以及驗證的內容表格。使用ClientHandler「重新連線」三個額外的SubmitButton,它們只是在表單提交之前修改隱藏狀態。

注意

  • 在任何特定的形式,實際上你可以有許多按鈕,爲您的應用需要;即比這裏展示的四個更多或更少。此示例中的Stay按鈕有效地發佈當前狀態並重新加載相同的表單。請注意,在功能上這相當於做一個服務器處理程序。潛在的用途是例如。加載默認數據或將現有數據保存到數據庫/工作表中。

  • 注意使用在客戶端處理程序的的.setText(value)方法。使用Chrome瀏覽器時,如果我切換到TextBox.setValue(value).setValue(value, fireEvents)方法中的任何一種,都會出現奇怪的運行時錯誤。

  • 我試圖(不成功),使用Script Property代替隱藏文本框來實現這個邏輯。這需要使用服務器處理程序,而不是客戶端處理程序。行爲是不穩定的,暗示我的異步服務器端事件發生在表單提交事件之後。

相關問題