0

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

我想创建一个带有下拉列表的 Google 表单,该表单填充了电子表格。我没有任何人选择与其他任何人一样的东西。(就像在聚餐的情况下)

例子:

  • 我正在放弃:
    • 梳子
    • 一把刷子
    • 一碗糊状

我告诉 Thomas、Richard 和 Henry,他们每个人都可以拥有一个,然后向他们发送一个指向我创建的 Google 表单的链接。汤姆很快就打开了第一张表格。他输入他的名字并从三项下拉列表中选择一个梳子。迪克打开表单链接,并在同一个下拉问题中从剩余的两个项目中选择。他选择画笔。哈利有点慢吞吞,所以当他回到家时,他打开了我的链接,但是,唉,他只能有一个装满糊状的碗。

我怎样才能完成这项工作?
根据我到目前为止的研究,我将需要使用响应电子表格上的 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 行结束。)

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

4

2 回答 2

3

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

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

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

2) 打开要存储响应的电子表格,并在其中添加一个新工作表(名称:“inventory”)

3)固定库存表的第一行(A),并放入A1:“选择产品”

4)在A列中放入您想要出现在表格中的所有产品

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

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) 打开代码编辑器,转到资源 > 创建触发器并创建这两个触发器。它们需要按以下顺序出现:

  1. updateLists - 从表单 - 发送
  2. updateLists - 从表单 - 打开

现在你可以走了。如果您打开表单编辑器,库存表中添加的产品将作为选项显示。

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

于 2015-03-27T14:51:39.043 回答
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 列:命名为“已选择”,包含当前选择的项目的名称,从第 1 行开始并连续向下。

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

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

于 2013-10-15T15:36:11.447 回答