Google apps script Google脚本:一个项目中有多个doPost

Google apps script Google脚本:一个项目中有多个doPost,google-apps-script,Google Apps Script,请求摘要: 我知道FormPanel与doPost(e)一起工作 但是如果我有几个模板,每个模板都需要使用不同的doPost(e)集合 由于doPost(e)是固定名称,因此如何拥有一些不同的doPost(e),如doPost1(e)、doPost(2)等 createSubmitButton也存在同样的问题,因为它会自动查找函数doPost(e),如何引导每个formPanel的submit启动正确的doPostX(e) 如果无法实现上述功能,是否意味着每个项目仅限于具有单个doPost(e)

请求摘要:

我知道FormPanel与doPost(e)一起工作

但是如果我有几个模板,每个模板都需要使用不同的doPost(e)集合

由于doPost(e)是固定名称,因此如何拥有一些不同的doPost(e),如doPost1(e)、doPost(2)等

createSubmitButton也存在同样的问题,因为它会自动查找函数doPost(e),如何引导每个formPanel的submit启动正确的doPostX(e)

如果无法实现上述功能,是否意味着每个项目仅限于具有单个doPost(e)功能


谢谢,

doPost和doGet函数可能存在的问题是,每个项目最多只能有一个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);
}
您还可以创建另一个具有doPost功能的项目(例如Project2),并将此项目部署为web应用程序

其思想是,您可以使用FormPanel的setAction(“url”)方法将信息从给定表单发送到某些url。 使用此方法,您可以将表单内容发送到将处理查询的网页。因此,如果将此方法的字符串值设置为web应用程序的url,则会将google脚本表单的内容发送到此应用程序。这个应用程序将使用doPost函数来处理查询

这个选项开发起来有点困难,并且存在目前根本不处理文件上传中的blob的缺点

希望对你有帮助

干杯


Nicolas

注意:在
doPost()
将控制转移到的子例程中,确保使用
UiApp.getActiveApplication()
方法。在匆忙中,我花了比我愿意承认的更多的时间,因为我在这些子例程中调用了
UiApp.createApplication()
方法

编辑

这演示了一个多页表单,即它执行初始的
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;
}
//使用Google Apps脚本的多页表单
函数doGet(eventInfo){返回GUI(eventInfo)};
函数doPost(eventInfo){返回GUI(eventInfo)};
功能GUI(事件信息){
var n=(eventInfo.parameter.state==void(0)?0:parseInt(eventInfo.parameter.state));
变量ui=((n==0)?UiApp.createApplication():UiApp.getActiveApplication());
var形式;
开关(n){
案例1:{
Form=ui.createFormPanel().add(ui.createHTML(“通过提交表单“+eventInfo.parameter.formId+”)退出);
}中断;
案例0:{
Form=getForm(eventInfo,n);//仅在演示时使用相同的表单
}中断;
案例1:{
Form=getForm(eventInfo,n);//实际上,每个表单都会有所不同,但。。。
}中断;
默认值:{
Form=getForm(eventInfo,n)//每个表单必须遵守(实现)隐藏状态变量
}中断;
}
返回ui.add(表单);
};
函数getForm(eventInfo,n){
var ui=UiApp.getActiveApplication();
//递增隐藏文本框中存储的ID
var state=ui.createTextBox().setId('state').setName('state').setValue(1+n).setVisible(true).setEnabled(false);
var H1=ui.createHTML(“表单”+n+”);
var H2=ui.createHTML(
“+(eventInfo.parameter.formId==void(0)?”“:”通过提交表单“+eventInfo.parameter.formId)+”创建;
//添加三个提交按钮以前进、后退和验证表单
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(返回).add(停留).add(下一步).add(退出);
var Body=ui.createVerticalPanel().add(H1).add(H2).add(state).add(按钮).add(getParameters(eventInfo));
var Form=ui.createFormPanel().setId((n>0?'doPost[':'doGet[')+n+'])。添加(正文);
//在提交表单之前,使用setText()添加客户端处理程序以调整状态
//注意:使用.setValue(val)和.setValue(val,bool)方法会导致运行时错误!
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');
addClickHandler(onClickStayHandler);
addClickHandler(onClickBackHandler);
addClickHandler(onClickExitHandler);
//添加在表单提交之前执行的客户端处理程序
var onFormSubmit=ui.createClientHandler()
.forTargets(state).setEnabled(true)//使值包含在post参数中
.forTargets(Body).setStyleAttribute(“backgroundColor”,“#EEE”);
表格.addSubmitMandler(onFormSubmit);
申报表;
}
函数getParameters(eventInfo){
var ui=UiApp.getActiveApplication();
var panel=ui.createVerticalPanel().add(ui.c