我一直试图让这个工作几天,然后我就放弃了。
我想创建一个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行。)
它不是很优雅,但这是我的能力。祝你好运。
答案 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;创建触发器并创建这两个触发器。它们需要按此顺序出现:
现在你很高兴。如果您打开表单编辑器,则库存表中添加的产品将显示为选项。
每次选择产品时,它都会从表单中消失。要重置所有选定的产品,请转到表单编辑器,然后选择“响应”&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列下面的所有单元格中。
“可用”列将始终包含“尚未取消选择”的库存项目的连续列表。