0

我一直试图让这个工作几天,现在我放弃了。从谷歌表格下拉菜单中删除所选项目

我想用电子表格填充下拉列表来创建Google表单。我不会选择任何人与其他人一样。 (如在便饭情况)

例如:

  • 我放弃了:
    • 梳子
    • 满满一碗玉米粥

我告诉Thomas,Richa rd和Henry,他们可以各自拥有一个,然后向他们发送我创建的Google表单的链接。汤姆很快,并打开表格1。他输入他的名字,并从三项下拉列表中选择一个梳子。迪克打开表单链接,并从他剩下的两个项目中选择相同的下拉问题。他选择了画笔。哈利有点慢,所以当他回到家时,他打开了我的链接,但是,唉,他只能有一个碗充满糊状物。

我该如何做到这一点?
基于我迄今为止的研究,我将需要在响应电子表格中使用if函数来查看是否有一个项目需要花费(看看单元格是否空置),也许VLOOKUP,但我可以' t清楚地了解如何使它们一起工作。
谢谢
晚安

编辑: 基于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。选择updateListsfrom form做这一次与发送时,一旦打开(你应该最终与2行)。

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

回答

2

我试图完成完全相同的(列表与产品可供选择),但我不能让它与最终的代码示例一起工作。这是我的,有详细的说明。只适用于登陆此页面并正在寻找工作代码的任何人。

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

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

2)打开,其中的响应将要被存储在电子表格中,并在其中添加新的片材(名:“库存”)

3)修正库存片的第一行(A),并把在A1:“选择产品”列将

4)所有要出现在表单

5)再次打开表单编辑器,然后转到工具产品>脚本编辑器

6)将此代码粘贴到编辑器中,放入您的表单中并展开eet ID's(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)打开代码编辑器,进入资源>创建触发器并创建这两个触发器。他们需要按以下顺序出现:

  1. updateLists - 从形式 - 发送
  2. updateLists - 从形式 - 开放

现在你是好去。如果您打开表单编辑器,则在清单中添加的产品将显示为选项。

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

0

以下是介绍如何构建电子表格的“操作方法”。

列A:命名为“库存”,包含最初可用项目的名称。

列B:命名为'索引',在单元格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:名为'Selected',包含当前从第1行开始并连续向下连续选择的项目的名称。

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

“可用”列将始终包含“尚未选定”清单项目的连续列表。

+0

首先,谢谢您花时间回答。我正试图实现这一点,但我有麻烦。当你说列名时,你的意思是单词A1中的单词“库存”?我知道它不知道'Selected'是什么。另外,这些都与我想创建的表单有什么关系?感谢你的宝贵时间。 – user850498

+0

谢谢你花时间。如果公式中的名字丢失并放入列中,我就可以开始工作。但是,这又如何与我想创建的表单绑定? – user850498

+0

当我说一列是'命名的东西',我的意思是整个专栏。 [单击列标题 - 即包含大写字母的单元格 - 然后单击命令'Data/Named and protected ranges ...'并输入名称。]此构造允许您使用'相对编址' - 即一列中的公式只需引用另一列的名称即可引用该列中相应行中的单元格。 – gssi

相关问题