将“从电子表格创建多选表单问题”脚本转换为“创建复选框等”脚本-错误?

问题描述 投票:0回答:1

问题:将“ asMultipleChoiceItem()”替换为“ asCheckboxItem”时,是什么导致此脚本中的错误?有没有一种明显的方法可以纠正它?

简短版本:我正在尝试通过将“ item.asMultipleChoiceItem()”替换为“ item.asCheckboxItem()”来实现解决方案的复选框版本(found here);但是,我在调试“项目类型的无效转换:MULTIPLE_CHOICE”时遇到错误。 (debug image here)。我在进行故障排除时难以识别/理解,因此想出如何纠正错误。

我的代码:

function DeptUpdate() {
  // User settings
  var OPTIONS_SPREADSHEET_ID = "1q21HxRkwXxVtiw7D5fuO-w0JCQtZRd-A35gRtmJUwKk";
  var OPTIONS_SHEET_NAME = "Present";
  var OPTIONS_RANGE = "A:A"; // We have the options, listed in column A
  var itemNumber = 1;         // which question on form does this apply to
  //
    var options2DArr = SpreadsheetApp.openById(OPTIONS_SPREADSHEET_ID).getSheetByName(OPTIONS_SHEET_NAME).getRange(OPTIONS_RANGE).getValues();
  var options = options2DArr.reduce(function(a, e) {
    if (e[0] != "") {
      return a.concat(e[0]);
    }
    return a;
  }, []);
  var form = FormApp.openById("1JHZoCdJrsRIltMwKqWGZizRQuy-2Ak2-XET83s04goc");
   var item = form.getItems()[itemNumber - 1];
  item.asCheckboxItem()
      .setTitle("SELECT NAME")
      .setChoiceValues(options)
      .showOtherOption(true);
}

加长版

目标:触发时,Google表格中的Google脚本会更新目标表单的清单选项,以反映定义范围内列出的项目(不包括空白)。

目的/背景:这是一系列表格和电子表格的一部分,可让我跟踪到达,自游泳池进入或离开的自修室的学习室,其中来自游泳池的10-20名学生每天有120人可能参加。电子表格已链接到表单,以提供“抬头显示”,其中有学生在场,并且已签到其他位置(这一切正常)。将“大厅通过和离开”表格答案选项(学生姓名)限制为仅当“当场”签到时才可以选择,从而大大减少了日志系统中的时间和用户错误。目前有多种选择,但学生经常成组到达/离开。复选框(多个响应)将进一步加快跟踪过程。否则,将电子表格设置为处理多个响应条目。只需要适当更新表格即可。

Process / Attempts:我读过其他一些将相似(不同目的)脚本调整为从下拉菜单/多项选择更改为没有问题的复选框的人(“我只是更改了它,它很有效,太棒了!”的范围),但是一旦更改为复选框,就会收到showOtherOption字段和setChoiceValues字段(如果已删除)的附加错误。我认为复选框项目与多选项目的读取方式不同可能是一个问题?但是,我无法在文档或Q / A帖子中找到关于两个函数参数之间显着差异的任何内容。在这一点上,我对可能导致问题的原因有些困惑。

背景:我没有进行正式(或大量非正式)的编码培训,但是大约十年来我已经对各种代码进行了调整和改编。我了解代码和编程逻辑的基本过程/概念,但缺乏实质性/内聚的词汇。

如果有帮助,我会提供指向电子表格和表格的虚拟副本的链接。

Spreadsheet

Form

预先感谢您提供任何见解!

白兰地

google-apps-script checkbox google-sheets google-form checkboxlist
1个回答
0
投票

问题是您有一个ListItem,但尝试将其转换为CheckboxItem

这不是直接可能的。 Google的feature request中有一个Public Issue Tracker用于此功能。我建议您给它加一个“星号”以增加知名度。

与此同时,如果要转换项目类型,则需要通过创建一个新项目,将其名称和从旧项目中选择的内容传递给它并删除旧项目来手动进行:

样本

function DeptUpdate() {
  // User settings
  var OPTIONS_SPREADSHEET_ID = "1wHE6b5ZuAKJTM4N7t6nlB5SdU9h24ueuxon4jnH_0sE";
  var OPTIONS_SHEET_NAME = "Present";
  var OPTIONS_RANGE = "A:A"; // We have the options, listed in column A
  var itemNumber = 1;         // which question on form does this apply to
  //
    var options2DArr = SpreadsheetApp.openById(OPTIONS_SPREADSHEET_ID).getSheetByName(OPTIONS_SHEET_NAME).getRange(OPTIONS_RANGE).getValues();
  var options = options2DArr.reduce(function(a, e) {
    if (e[0] != "") {
      return a.concat(e[0]);
    }
    return a;
  }, []);
  var form = FormApp.getActiveForm();
  var listItem = form.getItems()[itemNumber - 1];
  listItem
      .asListItem()
      .setTitle("SELECT NAME")
      .setChoiceValues(options)
  var title = listItem.getTitle();
  var choices = listItem.asListItem().getChoices();
  var checkboxItem = form.addCheckboxItem();
  checkboxItem.setTitle(title)
               .setChoices(choices)
               .showOtherOption(true);
  form.deleteItem(listItem);  
}
© www.soinside.com 2019 - 2024. All rights reserved.