【问题标题】:Google Forms / Google Sheets Remove Options Script谷歌表单/谷歌表格删除选项脚本
【发布时间】:2021-04-22 16:37:51
【问题描述】:

我已经搜索了许多其他答案,但还没有完全找到解决方案。我有一个 Google 表单,客户可以使用它每周注册志愿者点。我们会填写一年中的所有周数,以便客户可以浏览并注册他们感兴趣的各个周数。寻找可以参考链接的 Google 表格中的答案的脚本以更改表单上的问题。

如果我们有

  • 4 月 10 日
  • 4 月 17 日
  • 4 月 24 日

在 google 表单的选项列表中(我们的上限是 6 人注册),如果 4 月 10 日有 4 人,4 月 17 日有 6 人,4 月 24 日有 1 人,脚本将删除 4 月 17 日的问题谷歌表格。我在 Google 表格上有一个计数论坛,它汇总了每天注册的总人数,因此它是列表中每个相应日期的单个参考单元格的简单范围。

【问题讨论】:

    标签: google-apps-script google-sheets google-forms


    【解决方案1】:

    脚本应如下所示:

    代码:

    var ssID = '1kmVW8fbHnRIwcJawPlTJ-hWHNnMuVovtqbsCinTKTKw';
    var formID = '1z5kPkGAg9e7K7T5NMKBfa9J9mmx6hNVBBjL5hwPcOOo';
    var wsData = SpreadsheetApp.openById(ssID).getSheetByName("data");
    var form = FormApp.openById(formID);
    var options = ["1 person", "2 person", "3 person", "4 person"];
    
    function main() {
      // get list of responses directly from form instead of sheets
      var formResponses = form.getResponses();
      // get list of date questions
      var dates = wsData.getRange(2, 1, wsData.getLastRow(), 1).getValues().flat().filter(Boolean);
      var counts = {};
      for (var i = 0; i < formResponses.length; i++) {
        var formResponse = formResponses[i];
        var itemResponses = formResponse.getItemResponses();
        for (var j = 0; j < itemResponses.length; j++) {
          var itemResponse = itemResponses[j];
          var question = itemResponse.getItem().getTitle();
          // count only answers for date questions
          if (dates.includes(question)) {
            var answer = parseInt(itemResponse.getResponse().replace(' person',''));
            counts[question] = counts[question] ? counts[question] + answer : answer;
          }
        }
      }
      // get list of questions
      var items = form.getItems();
      var titles = items.map(function (item) {
        return item.getTitle();
      });
    
      dates = dates.forEach(function (date, index){
        // get position of each date question
        var pos = titles.indexOf(date)
        if (pos !== -1) {
          // get id
          var item = items[pos];
          var itemID = item.getId();
          var item = form.getItemById(itemID);
          // count remaining slots
          var slots = 6 - counts[date];
          // if all slots are already used, remove question
          if(slots == 0) {
            form.deleteItem(item);
          }
          else {
            // set new options up to remaining slots
            var newOptions = options.slice(0, slots);
            item.asListItem().setChoiceValues(newOptions);
          }
          // assign slots used in sheets
          wsData.getRange(index + 2, 2).setValue(counts[date]);
        }
      });
    }
    

    数据表:

    表格:

    注意:

    • 确保为功能main安装onFormSubmit触发器
    • 这样做的作用是当表单被填写并提交时,它会触发这个函数。
    • 每个表单提交都应该提交一次,避免使用“提交另一个响应”,因为它会使用未更新的表单。
    • 这会使用getResponses 读取响应,而不是读取响应表
    • 如果没有剩余的插槽,这将删除该项目

    【讨论】:

    • 好的,我想我快到了,两件事。 1 - 我的谷歌表单日期都是他们自己的问题,这对删除这个脚本的能力有影响吗? 2. 在我的数据表上,我在每个日期选项旁边有一列(这是谷歌表单上的每个问题),其中包含每个日期注册的总人数。我想我需要更改脚本以简单地查看与每个日期对应的第二列单元格,并简单地查看总数是否等于 6,而不是 count 函数(它会在每次看到重复日期时进行计数? )
    • 嗨@dwilliams,除非我能够可视化表格和表格,否则很难理解您刚刚记下的内容。您可以尝试在您的原始帖子中展示它们吗?
    • 嗨@NaziA - 我在原始帖子中添加了图片。
    • 嗨@dwilliams,我想澄清一下,每个日期的选项有点像“加入”和“不加入”吗?所以你想删除问题而不是选项?我将您的原始帖子理解为删除了 OPTION(我假设是问题的选择之一)而不是 ITEM/QUESTION(询问您是否加入)。
    • 感谢@NaziA 解决了这个问题。在我的数据表中的列表中有 1 个额外的发言权,这与谷歌表单上目前的列表不匹配。现在一切正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多