Google apps script 谷歌表单/谷歌工作表删除选项脚本

Google apps script 谷歌表单/谷歌工作表删除选项脚本,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我已经搜索了许多其他的答案,但还没有找到解决办法。我有一个谷歌表格,客户每周都会用它来注册志愿者。我们填写了一年中的所有周数,以便客户可以浏览并注册他们感兴趣的各个周数。寻找一个脚本,可以引用链接谷歌表中的答案来更改表单上的问题 所以如果我们有 四月十日 4月17日 四月二十四日 在谷歌表单的选项列表中(我们的上限是6人注册),如果4月10日有4人,4月17日有6人,4月24日有1人,脚本将从谷歌表单中删除4月17日的问题。我在谷歌的表单上有一个计算每天注册的总人数的计数,所以它是列表中每个

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

所以如果我们有

  • 四月十日
  • 4月17日
  • 四月二十四日
在谷歌表单的选项列表中(我们的上限是6人注册),如果4月10日有4人,4月17日有6人,4月24日有1人,脚本将从谷歌表单中删除4月17日的问题。我在谷歌的表单上有一个计算每天注册的总人数的计数,所以它是列表中每个对应天的一个简单的参考单元格范围


脚本应该如下所示:

代码:
var ssID='1kmVW8fbHnRIwcJawPlTJ hwhnnmuvovtqbscinktkw';
变量formID='1Z5KPKGAG9E7K7T5NMKBFA9J9MMX6HNBBJL5HWPCOOO';
var wsData=SpreadsheetApp.openById(ssID).getSheetByName(“数据”);
var form=FormApp.openById(formID);
风险值选项=[“1人”、“2人”、“3人”、“4人”];
函数main(){
//直接从表单而不是工作表获取响应列表
var formResponses=form.getResponses();
//获取日期问题列表
var dates=wsData.getRange(2,1,wsData.getLastRow(),1).getValues().flat().filter(布尔值);
变量计数={};
对于(var i=0;i
数据表:

表格:

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

好的,我想我就快到了,两件事。1-我的谷歌表单日期都是各自独立的问题,这对删除此脚本功能有影响吗?2.在我的数据表上,我在每个日期选项旁边都有一列(每个日期选项在谷歌表单上都是一个单独的问题),上面有每个日期注册的总人数。我想我需要更改脚本,只需查看对应于每个日期的第二列单元格,并查看总数是否等于6,而不是使用count函数(每次看到重复日期时都要计数?)Hi@dwilliams,除非我能够可视化工作表和表单,你刚记下来的东西有点难理解。你能试着在你的原始帖子中展示它们吗?嗨@NaziA-我在原始帖子中添加了图片。嗨@dwilliams,我想澄清一下,每个日期的选项有点像“加入”和“不加入”吗?那么你想删除问题而不是选项?我把你原来的帖子理解为删除了一个选项(我想,一个问题的选择之一),而不是一个项目/问题(询问你是否加入)。多亏了@NaziA,我才解决了这个问题。在我的数据表的列表中有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]);
    }
  });
}