是否可以将Google表单中的“从列表中选择”样式问题链接到数据列表(例如,电子表格中)?


10

有没有一种方法可以将表单中的“从列表中选择”样式问题链接到数据列表(例如,电子表格中)?

这意味着,随着新选项被添加到电子表格的列表中(或可能在其他任何地方承载列表),它们将自动显示为将来在表单中选择的选项。

就我而言,这意味着填写表格的受访者将能够从全面的志愿者列表中选择哪些志愿者参加了该特定的志愿者会议(而不是单独输入每个名称),但是由于志愿者是零星地加入的,因此如果可以将这些自动添加到列表中的选项中,而不是每次手动添加一个新选项,则将非常有帮助。

我不知道这是否可行,但如果有人可以提出一种解决办法,我将不胜感激。


要坏了,你不在身边,看到所有的答案给出....
雅各布月Tuinstra

Answers:


3

汤姆·霍伍德(Tom Horwood)的答案很好,但只有在更正了代码中的一个重要错误之后,才能解决。所有对LIST_DATA元素的引用都应使用索引j(不是i)。我没有足够的业力来评论汤姆的帖子,所以这是全部费用:

下面是更正的代码。我还更改了LIST_DATA元素的名称,以使它们更具描述性。它还显示了汤姆如何预先考虑(赞扬!),并提供了使用多个电子表格列表中的内容更新多个表单元素的功能。

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

总结一下如何使它工作(对于像我这样第一次使用Google Apps脚本的用户)。我在上面的代码片段中提到了工作表名称和表单字段名称,以期使其更易于理解:

  1. 在与您的表单相关联的电子表格中:

    • 创建一个新的工作表。这将包含要添加到字段的项目列表。为工作表指定一个合适的名称(例如TaskCategories)。将项目列表放在该工作表的第一列中。删除该工作表上所有多余的列和行(这可能是必需的,也可能不是必需的-未测试)
    • 从“工具”菜单中,选择“脚本编辑器”。将上面的代码片段复制并粘贴到脚本编辑器中。您将需要更改脚本的以下部分:
      • 变量的值FORMID将需要更改为表单的ID。ID是浏览器URL栏中所需格式的长代码(正斜杠之间)。
      • LIST_DATA变量将需要修改以适合您的形式和需要。你会注意到,每个项目LIST_DATA是一个元组formFieldTitleworksheetName。前者是表单字段的名称(必须是“从列表中选择”类型的字段)-在表单编辑器中称为Question Title。后者是您先前创建的工作表的名称,该工作表包含要用于填充字段的项目列表。根据需要将这些元组添加到列表中。
      • 现在保存脚本(单击保存图标)
      • 通过从脚本编辑器菜单中选择“运行”并选择“ updateLists”来测试脚本。第一次执行此操作时,它将要求获得许可。如果脚本成功执行,则可以观察到您的表单现在已填充了指定的字段,否则您会在屏幕上看到一条错误消息。
  2. 如果返回到电子表格,应该会看到一个名为的新菜单项List UpdaterUpdate Lists每次更改列表工作表中的任何一个时,它都需要运行一个项目-它将相应地更新表单。

我还注意到,为了读者的利益,FormRanger不适用于新的Google Spreadsheets。FormRanger开发人员在他们的网站上说了很多。也许/希望将来会有所改变,但是在发布此代码时,以上代码对我有用,并且我正在以已部署的形式为客户使用它。


我认为这是一个很好的答案,因为对于没有经验的脚本或其他相关知识的人,请逐步包括他们。另外,要对js代码格式保持警惕,请在LIST_DATA数组初始化之后添加分号。现在对其进行更多自定义,例如如果您有标题列,请使用“ for(var i = 1; i <data.length; i + = 1){//通过从1开始的索引跳过标题行”。
加里

编辑以修复丢失的分号-感谢@Gary注意:-)
allnatural

2

您可以使用正常形式和脚本来执行此操作,方法是使用Form.getItems(),找到循环中的项目,然后找到Item.asListItem()。setChoices(...)

这是一些示例代码,我在此示例工作表单中使用了这些代码

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

现在的形式链接是固定的
汤姆·霍伍德

1

有一个称为Form Values的Google Forms插件,它至少提供了一种半自动方式:每当您在电子表格中更改答案时,都需要手动重新填充答案中的选项,但至少这样做很简单。


0

您无法使用常规的Google表单执行此操作。

但是,您可以使用Google Apps脚本(特别是UIService)创建自己的GUI 。但是请注意,您将必须重新创建整个GUI-您不能使用现有表单中的某些部分。

或者,您可以使用GUI Builder。它是用于Google Apps脚本GUI的WYSIWYG编辑器。

无论选择哪种方式,都应该准备进行一些编程以实现所需的功能。


1
GUI Builder已弃用,因此我将不再使用它。
Jacob Jan Tuinstra 2013年

UIService也已弃用。
鲁本

0

有一个名为FormRanger的脚本:https ://docs.google.com/document/d/1YvgrxeZJNb2CBpSra1j59Mh1bVpk4vBQYLOoyVjby7A/edit ?hl= zh-CN & forcehl =1


请注意,只要链接电子表格中的数据发生更改,就需要手动重新运行此脚本!
凯南2015年

0

有一种方法可以通过为设置Trigger [ 1 ] [ 2 ] 来自动执行列表更新Update Lists

路径是脚本编辑器->资源->当前项目的触发器

然后,add a new trigger。对于给定的示例,您可以设置updatesList运行from spreadsheetOn form submission。这样,onOpen将不需要该功能。


-1

是的,它可以完成,花了一天的大部分时间寻找答案,然后为我的目的开发了答案,但这是可以做到的。

我需要有一个志愿者注册表格,人们可以从他们想要志愿者的区域列表中选中多个框。因此,有一个带有多个框的问题,问题在于生成的Google电子表格仅列出了他们在一个单元格中检查的所有内容。有21个志愿者选项,因此显然不是该信息的有用格式。我想做的是我想听的您想说的,我想在自己的一栏中创建一个包含21个选项中的每一个的列。然后,在其时间戳记(生成的表单),名称,电子邮件和电话旁边,有21列带有“是”或留空的列。列标题是他们可以选择的每个选项。有些人可能会奇怪,为什么不只回答21个问题,“是”或“否”。

首先请注意,当某人填写完Google表单时,结果电子表格会插入一行,而不是将数据添加到下一个空行。这意味着该行上的所有公式都被降低了,并且该公式中的新数据在接下来的两个公式中都没有公式可用于输入数据。为了做到这一点,我在电子表格(工作簿)中添加了一张工作表。我在http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw上利用了brettathds的输入,因此将以下公式插入到第二张工作表的单元格A1中:= ARRAYFORMULA(Sheet1!A1:A)。我对E列到E列的每一列都做了类似的操作。E列有21个复选框的问题。

仍在第二张纸上,“ FY列”的第1行具有与他们愿意提供的区域清单中的每个复选框选项相同的标题。然后Z列是表单上的下一个也是最后一个问题,这是一个简短的文本问题,标题为“其他注释”。对于那一栏,我使用= ARRAYFORMULA(Sheet1!F1:F)作为单独的问题进行此操作,而不是在复选框问题末尾使用“其他”选项,因为似乎没有一个很好的方法可以拉数据输入电子表格。

现在到回答您如何从E列中的单元格中获取信息的部分(该列可能最多列出21个项目),以“是”或仅空白的列分开。第二张纸上F2中的公式为= iferror(if(search(F $ 1,$ E2)> 0,“是”,))此公式用于查看是否在列标题(F1)中找到了确切的文本在E2中,如果是,则返回“是”,否则返回“空白”。

编写F2中引用的此公式(通过F4键使用“ $”),以便可以将F2复制/粘贴到GY中第2行的每个单元格中(Google Spreadsheet不支持通过拖动/复制来复制公式在Excel中,但是可以通过选择F2,然后按CTRL + C,然后选择G2:Y2,然后按CTRL + V)来完成。然后,我使用粘贴到F3:Y2到F3:Y100的相同方法复制。

然后,我将E栏隐藏在第二张工作表上,以使生成的电子表格更紧凑(避免冗长的答案包含所有内容)。

现在,我准备通过填写的快速便捷表格接收99名志愿者。利用列顶部的过滤器选项还有助于查看哪些人可以在哪些区域使用。

我没有解决的最后一个挫败感。我完成了一些假表格来测试我的公式和设计,然后从链接的电子表格中删除了这些行。我也有一些人填写了重复的表格,我也删除了他们的行。在产品论坛上值得注意的是,我不是唯一一个沮丧地得知Google仍然以某种方式将测试/伪造/重复数据连接到“响应摘要”(位于电子表格的“表单”标签下)。因此,如果为了删除测试/伪造/重复表格中的数据而删除了行,则响应摘要对于准确性无用。

但这已经完成了,下次我需要保存这些便笺时,我会保存这些便笺,我相信下次可以在不到30分钟的时间内轻松完成。

希望对您有所帮助,如有任何疑问,请通知我。


2
有很多文字。
Jacob Jan Tuinstra 2013年

努力的荣誉
Saariko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.