使用Apps脚本动态编辑实时Google表单中的多个选项

时间:2013-09-05 21:08:48

标签: google-apps-script google-form

我是L.A.的一名高中老师,试图使用Apps Script创建课程注册系统。我需要用于此注册的Google表单:

问题1)根据学生当前的回答选择,在新页面上更新后续多项选择题中可用的选项。

问题2)当多项选项达到“上限”时,消除表格中的选择。

问题1示例) 学生在研讨会1中注册“绑定”,然后进入新页面。脚本根据学生的第一选择编辑新页面上的可用选项,并从该新页面上的可能选项列表中删除“绑定”,因此“礼仪”是他们唯一剩下的选项。

问题2例子) 学生可以注册“绑定”或“礼仪”,这两个回复最初都在Google表格中提供。 30名学生参加了调查,所有30名学生都参加了“打结”研讨会。应用程序脚本引用响应电子表格,意识到“绑定”工作坊已满,然后将其从Google表单的可能选项列表中删除。学生31去注册,他们唯一的选择是“礼仪”。

如果我的问题已经被问及并回答(相信我,我确实搜索了!)我很欣赏重定向。

3 个答案:

答案 0 :(得分:4)

我相信我们可以毫不费力地实现你的第二个目标,并根据当前的反应状态修改表格。

方法是

  1. 创建表单并将其与响应电子表格相关联
  2. 在该响应电子表格中,创建一个带有函数的脚本(例如updateForm)
  3. 使用onFormSubmit事件绑定该函数,请参阅Using Container-Specific Installable Triggers
  4. 分析updateForm函数中的响应并使用表单服务修改表单
  5. 例如

    function updateForm(e) {
      if (e.values[1] == 'Yes') {
        Logger.log('Yes');
        var existingForm = FormApp.openById('1jYHXD0TBYoKoRUI1mhY4j....yLWGE2vAm_Ux7Twk61c');
        Logger.log(existingForm);
        var item = existingForm.addMultipleChoiceItem();
         item.setTitle('Do you prefer cats or dogs?')
         .setChoices([
             item.createChoice('Cats'),
             item.createChoice('Dogs')
          ])
         .showOtherOption(true);
      }
    }
    

    当谈到在你的第一个问题中实现目标时,它更加微妙,因为表格不会在中途提交。可能的是根据对多选问题的不同回答转到不同的页面,您的用例可能适合这种方法,尽管它不是很动态。

    此外,还可以使用html Service创建完全动态的体验。

    如果您需要更多信息,请与我们联系。

答案 1 :(得分:3)

您无法使用Google表单服务创建此类动态表单,因为在表单提交期间服务和脚本之间没有交互,除了表单提交。对于多页表单,脚本无法知道学生已完成一页并转到另一页。

但是,您可以使用HtmlService或UiService来实现此目的。在任何一种情况下,您都依赖于通过服务器端脚本进行交互的客户端表单来获取课程选项的更新列表,然后修改下一个“页面”。这将很复杂。

答案 2 :(得分:2)

此问题的另一个答案是每次提交表单时都会添加多选项。使用类似的方法:

  
      
  1. 创建表单并将其与响应电子表格相关联
  2.   
  3. 在该响应电子表格中,创建一个带有函数的脚本(例如updateForm)
  4.   
  5. 使用onFormSubmit事件绑定该函数,请参阅使用特定于容器的可安装触发器。
  6.   
  7. 分析updateForm函数中的响应并使用表单服务修改表单
  8.   

我使用以下代码修改了一个列表选择,可以轻松修改以进行多项选择。

function updateForm(){
  var form = FormApp.openById('YOUR_FORM_ID'); // Base form  
  // need to read what dates are available and which are taken
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var dates = doc.getRange("dates!A1:A10").getValues(); //available options
  var taken_dates = doc.getRange("responses!F2:F51").getValues(); //just getting first 50 responses 
  // joining the taken dates into one string instead of an array to compare easier
  var taken_dates_string = taken_dates.join("|");

  var choice = [];
  // loop through our available dates
  for (d in dates){
    // test if date still available
    if (dates[d][0] != "" && taken_dates_string.indexOf(dates[d][0]) === -1){ 
      choice.push(dates[d][0]); // if so we add to temp array
    }
  }
  var formItems = form.getItems(FormApp.ItemType.LIST); // our form list items
  // assumption that first select list is the one you want to change
  // and we just rewrite all the options to ones that are free
  formItems[0].asListItem().setChoiceValues(choice); 
}