Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 使用应用程序脚本动态编辑live Google表单中的多项选择选项_Google Apps Script_Google Forms - Fatal编程技术网

Google apps script 使用应用程序脚本动态编辑live Google表单中的多项选择选项

Google apps script 使用应用程序脚本动态编辑live Google表单中的多项选择选项,google-apps-script,google-forms,Google Apps Script,Google Forms,我是洛杉矶的一名高中教师,试图使用应用程序脚本创建一个课程注册系统。我需要用于此注册的谷歌表单: 问题1)根据学生当前的回答选择,更新新页面上后续多项选择题中可用的选项 问题2)当多项选择选项达到其“上限”时,从表格中删除选项 问题1(示例) 一名学生在车间1中注册“打领带”,并进入新页面。脚本根据学生的第一选择编辑新页面上的可用选项,并从新页面上的可能选项列表中删除“领带”,因此“礼仪”是他们唯一剩下的选项 问题2(示例) 学生可以注册“打领带”或“礼仪”,这两种回答最初都可以在谷歌表格中找到

我是洛杉矶的一名高中教师,试图使用应用程序脚本创建一个课程注册系统。我需要用于此注册的谷歌表单:

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

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

问题1(示例) 一名学生在车间1中注册“打领带”,并进入新页面。脚本根据学生的第一选择编辑新页面上的可用选项,并从新页面上的可能选项列表中删除“领带”,因此“礼仪”是他们唯一剩下的选项

问题2(示例) 学生可以注册“打领带”或“礼仪”,这两种回答最初都可以在谷歌表格中找到。30名学生参加了这项调查,所有30名学生都参加了“打领带”研讨会。应用程序脚本引用了响应电子表格,意识到“搭售”研讨会已满,然后将其从谷歌表单的可能选择列表中删除。学生31去注册,他们唯一的选择就是“礼仪”


如果我的问题已经被问到并回答了(相信我,我确实搜索过!),我将非常感谢重新定向。

我相信我们可以轻松实现您的第二个目标,并根据当前的响应状态修改表单

方法是

  • 创建表单并将其与响应电子表格关联
  • 在该响应电子表格中,创建一个带有函数的脚本(例如updateForm)
  • 将该函数与onFormSubmit事件绑定,请参阅
  • 分析updateForm函数中的响应,并使用表单服务修改表单
  • 比如说

    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服务来创建完全动态的体验


    如果您需要进一步的信息,请告诉我。

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


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

    此问题的另一个答案将在每次提交表单时不断添加多选项选择。采用类似的方法:

  • 创建表单并将其与响应电子表格关联
  • 在该响应电子表格中,创建一个带有函数的脚本(例如updateForm)
  • 将该函数与onFormSubmit事件绑定,请参阅使用特定于容器的可安装触发器
  • 分析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); 
    }
    

    更新Submit上的选项并不保证保持在上限之下,但在某些情况下可能已经足够好了。