Google HTML服务:将表单中多个选择的值写入电子表格

时间:2015-07-02 20:14:55

标签: javascript html forms google-apps-script

在过去的几天里,我一直在反对这一点,并最终崩溃并承认失败。这是我使用Google HTML服务的第一个项目,而我尝试做的事情似乎很简单,但我无法让它发挥作用。这就是我想要发生的事情......

  1. 用户与电子表格进行交互,需要添加包含数据的其他行
  2. 用户从自定义菜单项中选择一个选项(使其正常工作)
  3. 此选项启动HTML服务表单(使其正常工作)
  4. 用户从两个下拉列表中选择值,然后点击提交
  5. 所选选项读取读取(工作类型...)并传递给.js(这是我卡住的地方),这将创建行并放置数据
  6. 以下是我的代码:

    启动HTML服务的功能

        function AddAdditionalApplicant() {
      var ss = SpreadsheetApp.getActiveSpreadsheet(),
          html = HtmlService.createHtmlOutputFromFile('index');
      ss.show(html);
    }
    

    的index.html

    <form name="AddApplicant" onsubmit="formSubmit()">
    
    <p><b>What Type?</b></p>
        <select name="NumOfApp" id="NumOfApp">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="Cosigner">Cosigner</option>
        </select>
    
    <p><b>How Many?</b></p>
        <select name="TypeOfApp" id="TypeOfApp">
          <option value="Roommate">Roommate</option>
          <option value="Cosigner">Cosigner</option>
        </select>
    
    <p></p>
    <div>
      <!--<input type="submit" class="button redButton" value="Submit" onclick="formSubmit()">-->
      <input type="submit" class="button redButton" value="Submit">
    </div>
    
    </form>
    
    <script type="text/javascript">
    function formSubmit() {
    
    //var a=document.getElementById('NumOfApp').selectedIndex;
    //var b=document.getElementById('NumOfApp').options;
    //alert("Index: " + b[a].index + " is " + b[a].text);
    
    //var x=document.getElementById('TypeOfApp').selectedIndex;
    //var y=document.getElementById('TypeOfApp').options;
    //alert("Index: " + y[x].index + " is " + y[x].text);
    
        google.script.run.getValuesFromForm(document.forms[0]);
    }
    </script>
    

    如果取消注释已注释掉的行,您将看到正确读取的值。现在,这是失败的地方......我试图将表单作为对象传递给函数&#34; getValuesFromFrom&#34;使用

    google.script.run.getValuesFromForm(document.forms[0]);
    

    功能getValuesFromFrom

    function getValuesFromForm(AppForm){
    
    Browser.msgbox("success")  /attempt to test and see if the execution gets this far...no go
    //var a=AppForm['NumOfApp'].selectedIndex;
    //var b=AppForm['NumOfApp'].options;
    //Logger.log(b[a])
    //
    //var x=AppForm.TypeOfApp.selectedIndex;
    var type = AppForm.TypeOfApp.options[AppForm.TypeOfApp.selectedIndex].value;
    Logger.log(type)
    
    }
    

    没有任何反应......浏览器msgBox没有弹出。我错过了什么?此外,如何在“提交”时自动关闭表单。按下按钮。非常感谢任何帮助。

    编辑: 和@Sandy Good来回走后,我意识到&#34; AppForm&#34; getValuesFromForm函数中的变量未定义,这意味着表单对象未从html传递给函数。我尝试了另一种方法,只是尝试通过改变html代码的脚本部分来传递一个字符串变量,如下所示

    var x=document.getElementById('TypeOfApp').selectedIndex;
    var y=document.getElementById('TypeOfApp').options;
    //alert("Index: " + y[x].index + " is " + y[x].text);
    var type=y[x].value
    //    google.script.run.getValuesFromForm(y[x], b[a]);
      google.script.run.withFailureHandler(google.script.host.close)
        .getValuesFromForm(type);
    

    这是成功的,而这......

    var x=document.getElementById('TypeOfApp').selectedIndex;
    var y=document.getElementById('TypeOfApp').options;
    //alert("Index: " + y[x].index + " is " + y[x].text);
    var type=y[x]
    //    google.script.run.getValuesFromForm(y[x], b[a]);
      google.script.run.withFailureHandler(google.script.host.close)
        .getValuesFromForm(type);
    

    不是!

    所以问题仍然存在,我之前做错了什么?

    编辑:7月10日......工作代码

    启动HTML服务的功能

        function AddAdditionalApplicant() {
      var ss = SpreadsheetApp.getActiveSpreadsheet(),
          html = HtmlService.createHtmlOutputFromFile('index');
      ss.show(html);
    }
    

    的index.html

    <form name="AddApplicant" onsubmit="formSubmit(this)">
    
    <p><b>How Many?</b></p>
        <select name="NumOfApp" id="NumOfApp">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
        </select>
    
    <p><b>What Type?</b></p>
        <select name="TypeOfApp" id="TypeOfApp">
          <option value="Roommate">Roommate</option>
          <option value="Cosigner">Cosigner</option>
        </select>
    
    <p></p>
    <div>
      <!--<input type="submit" class="button redButton" value="Submit" onclick="formSubmit()">-->
      <input type="submit" class="button redButton" value="Submit">
    </div>
    
    </form>
    
    <script type="text/javascript">
    function formSubmit(argTheFormElement) {
    
      google.script.run
        .withFailureHandler(myFailureFunction)
        .withSuccessHandler(google.script.host.close)
        .getValuesFromForm(argTheFormElement);
    
    }
    function myFailureFunction(argError) {
      alert("There was an error: " + argError.message);
      google.script.host.close();
      }
    
    </script>
    

    接收表单元素的函数

    function getValuesFromForm(AppFormElement){
    var ss = SpreadsheetApp.getActive();
    var s = ss.getActiveSheet();
    var sname = s.getName();
    
    var num = AppFormElement.NumOfApp
    var type =  AppFormElement.TypeOfApp
    
    var activeRow = s.getActiveCell().getRow();
    var addCell = s.getRange(activeRow,2);
    
      if (type == "Roommate") {
      for(var i = 0; i < num; ++i){
        AddRoommate(activeRow,addCell,sname,s);
        }
      }else if (type == "Cosigner"){
      for(var i = 0; i < num; ++i){
        AddCosigner(activeRow,addCell,sname,s);
        }
      }
      s.setActiveRange(addCell.offset(1,1));
    }
    

    希望这可以帮助别人!!!

1 个答案:

答案 0 :(得分:2)

更改您的表单标记,并将this添加到该函数:

onsubmit="formSubmit(this)"

然后修改你的功能:

function formSubmit(argTheFormElement) {

然后将变量argTheFormElement放入google.script.run.function(参数);

google.script.run.getValuesFromForm(argTheFormElement);

这会将所有输入值传递给服务器。获取值后,您必须使用name标记的名称。

var type = AppForm.NumOfApp; //Get NumOfApp value

要关闭对话框,请使用:

google.script.host.close;

google.script.host.close