表单下拉列表的动态编辑创建额外的列
Dynamic Editing of Form Dropdown Creates Extra Column
我对 Sheets/Forms 的 Google 脚本还比较陌生,并且编辑了 答案以创建一个脚本,该脚本在下拉问题被触发时更新选项。它工作得很好,但有一个小故障。我的代码如下:
var idColumn = 1;
function getSheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ProjectList");
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var lr = rows.getLastRow();
var docId = sheet.getRange(2,idColumn,lr,1).getValues(); //gets the data from the last row in selected column
fillFormData(docId);
}
//fills form with document ID
function fillFormData(docId) {
var formId = 'form ID goes here'
var form = FormApp.openById(formId);
var items = form.getItems();
var item = items[1];
//loop variables
var thisValue = "";
var arrayOfItems = [];
var newItem = "";
for (var i=0;i<docId.length;i++) {
thisValue =docId[i][0];
Logger.log('thisValue: ' + thisValue);
newItem = item.createChoice(thisValue);
arrayOfItems.push(newItem);
};
item.setChoices(arrayOfItems)
}
我的希望是,通过使用 setChoices() 更新问题,回复将被放置在回复 sheet 的同一列中。相反,此脚本的每个触发器都会在名为 "Project Number" 的响应 sheet 中创建另一列,覆盖之前存在的列之一。这是预期的行为,还是有人知道确保我的回复进入同一列的方法?有没有办法将对此问题的回复定向到回复中的特定列 sheet?
编辑: 根据下面的建议,我尝试调整宏以使用 .asListItems() 但没有成功。这里有趣的行为是,新的重复列似乎覆盖了我的其他列之一,而不是创建一个新列。
这是我的项目列表,只有一列:
Project Number
Project A
Project B
Project C
Project D
Project E
该表格包含 35 个问题,类型各异,分为 3 个部分。
我认为您需要明确设置要向其添加选项的问题,请参阅下面的工作脚本示例以向表单添加新项目。
function getSheet() {
var sheet = SpreadsheetApp.openById('sheet id here');
}
var formId = "form id here";
var question = [{formFieldTitle:"question title here", worksheetName:"linked form sheet name here"}]
function newChoices(item, sheetName) {
var data = (SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(sheetName)
.getDataRange()
.getValues());
var choices = [];
for (var i = 1; i < data.length; i += 1){
choices.push(item.createChoice(data[i][0]));
}
item.setChoices(choices);
}
function addNewChoices() {
var form = FormApp.openById(formId);
var items = form.getItems();
for (var i = 0; i < items.length; i += 1) {
for (var j = 0; j < question.length; j += 1) {
var item = items[i];
if (item.getTitle() === question[j].formFieldTitle) {
addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
break;
}
}
}
}
变量 "question" 应该有问题 header 和 sheet 从中添加表单项的名称。
var question = [{formFieldTitle:"question title here", worksheetName:"sheet name here"}]
此外,如果您的问题不是下面一行中的复选框,请务必更改 "asCheckboxItem",请参阅 Interface Item documentation 以确定要使用的内容。
addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
您应该使用 setChoiceValues()
而不是使用方法 createChoice()
和 setChoices()
,这样它就不会创建新问题。通过使用 setChoiceValues()
,您可以有效地更新选择。
查看下面的代码:
function optWriteItem_CHECKBOX_(paramItem, paramItemData) {
try {
var thisItem = paramItem.asCheckboxItem();
var listChoices;
var n, i;
n = paramItemData.length;
if(paramItemData.indexOf('__OTHER__') > 5) {
listChoices = paramItemData.slice(5, n-1);
thisItem.showOtherOption(true);
} else {
listChoices = paramItemData.slice(5, n);
thisItem.showOtherOption(false);
}
thisItem.setTitle(paramItemData[0]);
if(paramItemData[3].toLowerCase() == 'yes') thisItem.setRequired(true);
else thisItem.setRequired(false);
thisItem.setHelpText(paramItemData[4]);
if(listChoices.length == 0) listChoices = [ 'Option 1' ];
thisItem.setChoiceValues(listChoices);
} catch(err) {
Logger.log('optWriteAsType/opt=CHECKBOX : ' + err.message);
console.error("optWriteItem_CHECKBOX_()", err);
return {s:false, m:err.message};
}
return {s:true};
}
我对 Sheets/Forms 的 Google 脚本还比较陌生,并且编辑了
var idColumn = 1;
function getSheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ProjectList");
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var lr = rows.getLastRow();
var docId = sheet.getRange(2,idColumn,lr,1).getValues(); //gets the data from the last row in selected column
fillFormData(docId);
}
//fills form with document ID
function fillFormData(docId) {
var formId = 'form ID goes here'
var form = FormApp.openById(formId);
var items = form.getItems();
var item = items[1];
//loop variables
var thisValue = "";
var arrayOfItems = [];
var newItem = "";
for (var i=0;i<docId.length;i++) {
thisValue =docId[i][0];
Logger.log('thisValue: ' + thisValue);
newItem = item.createChoice(thisValue);
arrayOfItems.push(newItem);
};
item.setChoices(arrayOfItems)
}
我的希望是,通过使用 setChoices() 更新问题,回复将被放置在回复 sheet 的同一列中。相反,此脚本的每个触发器都会在名为 "Project Number" 的响应 sheet 中创建另一列,覆盖之前存在的列之一。这是预期的行为,还是有人知道确保我的回复进入同一列的方法?有没有办法将对此问题的回复定向到回复中的特定列 sheet?
编辑: 根据下面的建议,我尝试调整宏以使用 .asListItems() 但没有成功。这里有趣的行为是,新的重复列似乎覆盖了我的其他列之一,而不是创建一个新列。
这是我的项目列表,只有一列:
Project Number
Project A
Project B
Project C
Project D
Project E
该表格包含 35 个问题,类型各异,分为 3 个部分。
我认为您需要明确设置要向其添加选项的问题,请参阅下面的工作脚本示例以向表单添加新项目。
function getSheet() {
var sheet = SpreadsheetApp.openById('sheet id here');
}
var formId = "form id here";
var question = [{formFieldTitle:"question title here", worksheetName:"linked form sheet name here"}]
function newChoices(item, sheetName) {
var data = (SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(sheetName)
.getDataRange()
.getValues());
var choices = [];
for (var i = 1; i < data.length; i += 1){
choices.push(item.createChoice(data[i][0]));
}
item.setChoices(choices);
}
function addNewChoices() {
var form = FormApp.openById(formId);
var items = form.getItems();
for (var i = 0; i < items.length; i += 1) {
for (var j = 0; j < question.length; j += 1) {
var item = items[i];
if (item.getTitle() === question[j].formFieldTitle) {
addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
break;
}
}
}
}
变量 "question" 应该有问题 header 和 sheet 从中添加表单项的名称。
var question = [{formFieldTitle:"question title here", worksheetName:"sheet name here"}]
此外,如果您的问题不是下面一行中的复选框,请务必更改 "asCheckboxItem",请参阅 Interface Item documentation 以确定要使用的内容。
addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
您应该使用 setChoiceValues()
而不是使用方法 createChoice()
和 setChoices()
,这样它就不会创建新问题。通过使用 setChoiceValues()
,您可以有效地更新选择。
查看下面的代码:
function optWriteItem_CHECKBOX_(paramItem, paramItemData) {
try {
var thisItem = paramItem.asCheckboxItem();
var listChoices;
var n, i;
n = paramItemData.length;
if(paramItemData.indexOf('__OTHER__') > 5) {
listChoices = paramItemData.slice(5, n-1);
thisItem.showOtherOption(true);
} else {
listChoices = paramItemData.slice(5, n);
thisItem.showOtherOption(false);
}
thisItem.setTitle(paramItemData[0]);
if(paramItemData[3].toLowerCase() == 'yes') thisItem.setRequired(true);
else thisItem.setRequired(false);
thisItem.setHelpText(paramItemData[4]);
if(listChoices.length == 0) listChoices = [ 'Option 1' ];
thisItem.setChoiceValues(listChoices);
} catch(err) {
Logger.log('optWriteAsType/opt=CHECKBOX : ' + err.message);
console.error("optWriteItem_CHECKBOX_()", err);
return {s:false, m:err.message};
}
return {s:true};
}