汤姆·霍伍德(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脚本的用户)。我在上面的代码片段中提到了工作表名称和表单字段名称,以期使其更易于理解:
在与您的表单相关联的电子表格中:
- 创建一个新的工作表。这将包含要添加到字段的项目列表。为工作表指定一个合适的名称(例如
TaskCategories
)。将项目列表放在该工作表的第一列中。删除该工作表上所有多余的列和行(这可能是必需的,也可能不是必需的-未测试)
- 从“工具”菜单中,选择“脚本编辑器”。将上面的代码片段复制并粘贴到脚本编辑器中。您将需要更改脚本的以下部分:
- 变量的值
FORMID
将需要更改为表单的ID。ID是浏览器URL栏中所需格式的长代码(正斜杠之间)。
- 该
LIST_DATA
变量将需要修改以适合您的形式和需要。你会注意到,每个项目LIST_DATA
是一个元组formFieldTitle
和worksheetName
。前者是表单字段的名称(必须是“从列表中选择”类型的字段)-在表单编辑器中称为Question Title
。后者是您先前创建的工作表的名称,该工作表包含要用于填充字段的项目列表。根据需要将这些元组添加到列表中。
- 现在保存脚本(单击保存图标)
- 通过从脚本编辑器菜单中选择“运行”并选择“ updateLists”来测试脚本。第一次执行此操作时,它将要求获得许可。如果脚本成功执行,则可以观察到您的表单现在已填充了指定的字段,否则您会在屏幕上看到一条错误消息。
如果返回到电子表格,应该会看到一个名为的新菜单项List Updater
。Update Lists
每次更改列表工作表中的任何一个时,它都需要运行一个项目-它将相应地更新表单。
我还注意到,为了读者的利益,FormRanger不适用于新的Google Spreadsheets。FormRanger开发人员在他们的网站上说了很多。也许/希望将来会有所改变,但是在发布此代码时,以上代码对我有用,并且我正在以已部署的形式为客户使用它。