从Google表单下拉列表中删除所选项目

时间:2013-10-09 11:05:58

标签: google-apps-script google-sheets google-drive-api google-form

我一直试图让这个工作几天,然后我就放弃了。

我想创建一个Google表单,其中包含从电子表格填充的下拉列表。我没有任何人可以选择任何其他人。 (就像在聚餐的情况下)

示例:

  • 我要放弃了:
    • 梳子
    • 画笔
    • 一碗满满的糊状物

我告诉托马斯,理查德和亨利他们每个人都有一个,并发送链接到我创建的谷歌表格。汤姆很快,打开表格第1。他输入了他的名字并从三项下拉列表中选择了一个梳子。迪克打开表单链接,并在他剩下的两个项目中选择相同的下拉问题。他选择了刷子。哈利有点慢,所以当他回到家时,他会打开我的链接,但是唉,他只能吃一个装满糊状的碗。

我该如何完成?
基于我到目前为止的研究,我将需要在响应电子表格中使用if函数来查看是否有项目的获取(看看单元格是否空缺)并且可能是VLOOKUP,但我无法获得清楚地了解如何使它们一起工作。
谢谢,
晚安

编辑: 根据gssi的回答,我想发布代码并描述我做的方式。

function updateListChoices(item){
  var inventory = (SpreadsheetApp.openById(theIdOfTheResponceSpreadsheet)
              .getSheetByName("inventory")
              .getDataRange()
              .getValues());
  var selected = (SpreadsheetApp.openById("0Al-3LXunCqgodHB5RGNpR0RyQ0pERmVnek1JeUJKS0E")
              .getSheetByName("responses")
              .getDataRange()
              .getValues());

  var choices = [];
  var selectedReal = [];
  for (var i = 0; i< selected.length; i+=1){
 selectedReal.push(selected[i][2]) }
  for (var i = 1; i< inventory.length; i+=1){
    if(selectedReal.indexOf(inventory[i][0])=== -1){
      choices.push(item.createChoice(inventory[i][0]));}
  }
  item.setChoices(choices);
}

var LIST_DATA = [{title:"the title of the question", sheet:"inventory"}]
function updateLists() {
  var form = FormApp.getActiveForm();
  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.getIndex() === 1){
        updateListChoices(item.asListItem(), "inventory");
        break;
      }
    }
  }
}

在表单的构建中,单击tools菜单,然后单击script editor。将代码从此处复制(包含符合您需求的更改)到脚本编辑器并单击“保存”。点击Resources菜单,然后点击project triggers(第一个选项)。点击Add trigger。选择updateLists from form在发送时执行一次,在打开时执行一次(最后应使用2行。)

它不是很优雅,但这是我的能力。祝你好运。

2 个答案:

答案 0 :(得分:2)

我尝试完全相同(列出了可供选择的产品),但我无法使用最终的代码示例。这是我的,详细说明。仅适用于登陆此页面并正在寻找工作代码的任何人。

(菜单名称可能与您的不同,因为我使用的是非英语Google表单,我只是在这里猜测翻译。)

1)创建一个新表单,并创建一个新的基于单选按钮的问题(多选)(在本例中,我使用问题名称:“选择产品”)。不要添加任何选项。保存它。

2)打开要存储回复的电子表格,并在其中添加新工作表(名称:“库存”)

3)修复库存表的第一行(A),并输入A1:“选择产品”

4)在列A中填写您希望以

形式出现的所有产品

5)再次打开表单编辑器,然后转到工具&gt;脚本编辑器

6)将此代码粘贴到编辑器中,放入表单和电子表格ID(3x)并保存。

var LIST_DATA = [{title:"Select a product", sheet:"inventory"}];

function updateLists() {
  //var form = FormApp.getActiveForm();
  var form = FormApp.openById("paste_ID_of_your_FORM_here");
  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[0].title){
        updateListChoices(item.asMultipleChoiceItem(), LIST_DATA[0].sheet);
        break;
    }
    }
  }
}

function updateListChoices(item, sheetName){
  var inventory = (SpreadsheetApp.openById("paste_ID_of_your_RESPONSE_SHEET_here")
              .getSheetByName("inventory")
              .getDataRange()
              .getValues());
  var selected = (SpreadsheetApp.openById("paste_ID_of_your_RESPONSE_SHEET_here")
              .getSheetByName("responses")
              .getDataRange()
              .getValues());

  var choices = [];
  var selectedReal = [];
  for (var i = 0; i< selected.length; i+=1){
     selectedReal.push(selected[i][1]) 
  }
  for (var i = 1; i< inventory.length; i+=1){
    if(selectedReal.indexOf(inventory[i][0])=== -1){
      choices.push(item.createChoice(inventory[i][0]));}
  }
  if (choices.length < 1) {
    var form = FormApp.getActiveForm();
    form.setAcceptingResponses(false); 
  } else {
  item.setChoices(choices); 
  }
}

7)打开代码编辑器,转到Resources&gt;创建触发器并创建这两个触发器。它们需要按此顺序出现:

  1. updateLists - 来自表单 - 发送
  2. updateLists - 来自表单 - 打开
  3. 现在你很高兴。如果您打开表单编辑器,则库存表中添加的产品将显示为选项。

    每次选择产品时,它都会从表单中消失。要重置所有选定的产品,请转到表单编辑器,然后选择“响应”&gt;删除所有回复。您可能还需要手动删除响应表中的所有响应(不知道为什么,但这发生在我身上)。之后,您需要在代码编辑器中手动运行updateLists脚本。

答案 1 :(得分:0)

这是一个描述如何构建电子表格的“操作方法”。

A栏:名为“库存”,包含最初可用商品的名称。

B列:名为'Indices',在单元格B1中包含公式=if(isnumber(match(Inventory,Selected,0)),"",if(row(B1)=1,1,max(offset(Indices,0,0,row(B1)-1,1))+1))。将B1中的公式复制到B列下面的所有单元格中。

C列:名为“已选择”,包含当前从第1行开始选择并连续向下连续的项目名称。

D列:名为“可用”,单元格D1包含公式=if(isnumber(match(row(D1),Indices,0)),index(Inventory,match(row(D1),Indices,0),1),""),然后将其复制到D列下面的所有单元格中。

“可用”列将始终包含“尚未取消选择”的库存项目的连续列表。