9

我是洛杉矶的一名高中老师,尝试使用 Apps 脚本创建课程注册系统。我需要用于此注册的 Google 表单:

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

问题 2) 当多项选择选项已达到其“上限”时,从表单中删除选项。

问题 1 示例)一名学生在工作坊 1 中注册“打领带”,并被带到一个新页面。脚本根据学生的第一选择编辑该新页面上的可用选项,并从该新页面上的可能选项列表中删除“tie-tying”,因此“礼节”是他们唯一剩下的选项。

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

如果我的问题已经被提出并回答(相信我,我确实搜索过!)我会很感激重定向。

4

3 回答 3

7

I believe we can achieve your second objective without too much difficulty and modify the form, based on the current state of response.

The approach is to

  1. Create the form and associate it with a response spreadsheet
  2. In that response spreadsheet, create a script with a function (updateForm for instance)
  3. Bind that function with the onFormSubmit event, see Using Container-Specific Installable Triggers.
  4. Analyse the response in the updateForm function and modify your form using the Form Service

For instance

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);
  }
}

When it comes to achieving the goal in your first question, its more delicate, as the form will not submit mid way. What is possible is to go to different pages based on different responses to a Multiple Choice question, your use case may fit this method, although its not very dynamic.

Further its possible to use html Service to create completely dynamic experience.

Let me know if you need further information.

于 2013-09-06T01:07:24.573 回答
4

您无法使用 Google 表单服务创建这种类型的动态表单,因为在表单输入期间服务和脚本之间没有交互,除非在表单提交时。在多页表格的情况下,脚本无法知道学生已完成一页并继续阅读另一页。

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

于 2013-09-06T02:58:05.410 回答
2

每次提交表单时,此问题的另一个答案将继续添加多项选择。使用类似的方法:

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

我使用以下代码修改了可以轻松修改为多项选择的列表选择。

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); 
}
于 2014-11-27T16:18:23.077 回答