提问人:EJ Saldana 提问时间:11/18/2023 最后编辑:TedinozEJ Saldana 更新时间:11/22/2023 访问量:70
如何填充来自另一个 Google 表单的复选框 Google 表单回复?
How do I populate checkbox google form responses from another google form?
问:
我在将复选框响应从谷歌表格填充到另一个谷歌表单中时遇到了问题。 这是我的工作流程。有人填写了原始的谷歌表单。回复将填写到谷歌表格中。
我想要每个提交的谷歌表单都有一个链接,该链接会将每行的回复预先填充到一个单独的谷歌表单中。我特别在复选框字段上遇到了问题。
这是包含公式的电子表格,该公式在填充其他字段时没有问题。(可编辑)
我尝试使用电子表格公式中所示的替代函数,但这并不能解决问题。我也回顾了上一个问题的回答,但无济于事。
答:
0赞
Tedinoz
11/20/2023
#1
您有 2 个用于“学生事件”的 Google 表单:
- 表格“A”包含 11 个字段/问题,由用户(也许是老师??)填写,并链接到电子表格。
- 表格“B”与表格“A”相同,但有4个与学校行政有关的额外问题。
该过程是:
- 用户提交表格“A”;
- 表单“A”响应传递到电子表格;
- sheets 脚本构建一个链接,用于使用 Form“A” 响应预填充 Form“B”。
- 用户点击链接,回答额外的问题并提交表格“B”。
注意:没有指示器显示是否/何时运行了 Form“B” 链接。
您在理解如何在表单中填充复选框时遇到问题(“复选框”类型的问题允许用户选择多个选项。表格“A”包含两个带有复选框的项目:“教师在撰写推荐之前的行动”(7 个选项)和“违规类型”(20 个选项,包括一个用户可定义的“其他”)
StackOverflow 问题 如何预填充 Google 表单复选框? 提供了一个出色的解决方案,可以通过额外的用户输入来处理任何问题类型(包括复选框),但是...此脚本包含一些需要针对 OP 情况进行修改的功能。
- 该脚本是手动执行的,并处理每个响应行;解决方案应使用触发器和事件对象在收到每个提交时对其进行更新。
onFormSubmit
- 该脚本假定电子表格数据应预先填写表单“A”;解决方案应预先填写表格“B”
- 该脚本假定表格“A”和表格“B”具有相同数量的问题;表格“B”有另外 4 个问题。
除了为满足这些功能而进行的更改外,引用的脚本是一个很好的资源。
在执行脚本之前检查和更新
电子表格
- 将脚本复制到链接到表单“A”的电子表格的脚本编辑器中
- 在电子表格中,在表格“A”的“表单响应”表上,
- 确定包含最后一个问题的回答的列,
- 预填充链接将保存在下一个相邻的列中
- 在下一个相邻列的行 #1(标题)中,输入“预填充的 URL”作为标题值
- 为函数创建可安装的触发器。
- “事件类型”:
on Form submit
- “事件类型”:
- 确定包含最后一个问题的回答的列,
脚本
- 确认/输入表格A的“答卷”名称
- 确认/输入表格“B”的表格编号
- 确认/输入表格“A”中的问题数目
/**
*
* Pre-fill answers for Form "B" from answers in From"A"
* and create hyperlink for Form"B" submission
* The script should be in the Editor of the sheet linked to Form"A"
* Create an installable trigger: "Event type": `on Form submit`
* Line 19: Confirm Response sheet for FormA
* Line 22: Enter the FORM ID for Form"B"
* Line 24: Enter the number of questions in Form"A"
*/
function prefillFormB(e) {
// Logger.log(JSON.stringify(e)) // DEBUG
// use Event Objects
var editedRow = e.range.rowStart
// force script to take data from Form"A"
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet = ss.getSheetByName("<<INSERT SHEET NAME - FORMA RESPONSES >>");
// reference Form"B"
var form = FormApp.openById('<<INSERT ID FOR FORMB >>');
// number of questions in Form "A"
var itemLength = 3
// number of columns on Response sheet
// number of questions on Form"A", plus timestamp plus "Prefilled URL" column
var colCount = itemLength+2
//Logger.log("DEBUG: the number of columns in the spreadsheet A = "+colCount)
// build Data array for this submission
var data = sheet.getRange(editedRow,1,1,colCount).getValues()
// build Header data array in Row 1
// Sheet headers == form titles (questions)
var headerData = sheet.getRange(1,1,1,colCount).getValues()
var headers = headerData[0];
var items = form.getItems();
// If there is a column labeled this way, we'll update it
var urlCol = headers.indexOf("Prefilled URL");
// Logger.log("DEBUG: urlCol = "+urlCol)
// loop through the submission row
for (var row = 0; row < data.length; row++ ) {
// Logger.log("DEBUG: Generating pre-filled URL from spreadsheet for row#:"+editedRow);
// build a response from spreadsheet info.
var response = form.createResponse();
for (var i=0; i<itemLength; i++) {
var ques = items[i].getTitle(); // Get text of question for item
// Logger.log("DEBUG: i="+i+", ques= "+ques)
var quesCol = headers.indexOf(ques); // Get col index that contains this question
// Logger.log("DEBUG: i="+i+", quesCol= "+quesCol)
var resp = ques ? data[row][quesCol] : "";
// Logger.log("DEBUG: i="+i+", resp= "+resp)
var type = items[i].getType().toString();
Logger.log("DEBUG: Question='"+ques+"', resp='"+resp+"' type:"+type);
// Need to treat every type of answer as its specific type.
switch (items[i].getType()) {
case FormApp.ItemType.TEXT:
var item = items[i].asTextItem();
break;
case FormApp.ItemType.PARAGRAPH_TEXT:
item = items[i].asParagraphTextItem();
break;
case FormApp.ItemType.LIST:
item = items[i].asListItem();
break;
case FormApp.ItemType.MULTIPLE_CHOICE:
item = items[i].asMultipleChoiceItem();
break;
case FormApp.ItemType.CHECKBOX:
item = items[i].asCheckboxItem();
// In a form submission event, resp is an array, containing CSV strings. Join into 1 string.
// In spreadsheet, just CSV string. Convert to array of separate choices, ready for createResponse().
if (typeof resp !== 'string')
resp = resp.join(','); // Convert array to CSV
resp = resp.split(/ *, */); // Convert CSV to array
break;
case FormApp.ItemType.DATE:
item = items[i].asDateItem();
resp = new Date( resp );
resp.setDate(resp.getDate()+1);
break;
case FormApp.ItemType.DATETIME:
item = items[i].asDateTimeItem();
resp = new Date( resp );
break;
default:
item = null; // Not handling DURATION, GRID, IMAGE, PAGE_BREAK, SCALE, SECTION_HEADER, TIME
break;
}
// Add this answer to our pre-filled URL
if (item) {
// Checking if there is any value
if(resp[0].length != 0){
var respItem = item.createResponse(resp);
response.withItemResponse(respItem);
}
}
// else if we have any other type of response, we'll skip it
else Logger.log("Skipping i="+i+", question="+ques+" type:"+type);
}
// Generate the pre-filled URL for this row
var editResponseUrl = response.toPrefilledUrl();
// Logger.log("DEBUG: the pre-filled url is "+editResponseUrl)
// If there is a "Prefilled URL" column, update it
if (urlCol >= 0) {
var urlRange = sheet.getRange(editedRow,urlCol+1).setValue(editResponseUrl);
// Logger.log("DEBUG: the url range = "+sheet.getRange(editedRow,urlCol+1).getA1Notation())
// Logger.log("DEBUG: wrote the url")
}
}
}
表格“A”
电子表格“A”
表格“B”
电子表格“B”
评论
0赞
EJ Saldana
11/21/2023
我已经输入了代码,并编辑了您提到的部分。我在执行时收到错误:TypeError:无法读取 prefillFormB 的未定义属性(读取“length”)(代码:96:20) 所有修改都在原始帖子中共享的谷歌表格上。
0赞
Tedinoz
11/21/2023
问题与“电子邮件地址”有关。请参阅我在问题评论中的评论/问题“关于表格”A“与表格”B”。
0赞
Tedinoz
11/21/2023
I am getting an error when executed:
好的,但是这是发生在中间任何人的第一个项目还是最后一个项目上。您要么需要自己进行一些故障排除,要么授予电子表格和两种表单的完全编辑权限。您收到了我今天发送的访问请求的电子邮件。
0赞
EJ Saldana
11/27/2023
我已授予完全编辑权限。感谢您提供的任何帮助。
0赞
EJ Saldana
11/28/2023
我没有检查我的电子邮件。我只是做了。一切都适用于您提供的脚本和详尽的指导。非常感谢!
0赞
Tedinoz
11/28/2023
我很高兴你已经解决了这个问题。你会考虑“接受”这个答案吗?
评论
I have also reviewed this response from a previous question to no avail.
你好。如何预填Google表单复选框的答案非常全面。您问题的答案不会是一个公式;它将是一个脚本,因为这是预填充 Google 表单(并建立必要链接)的唯一方法。我会说你的问题是这个问题的重复。请您解释一下您的意思以及该问题如何不符合您的需求。to no avail
I tried using the script and couldn’t get it to work. I should say, though, I only know how to use script a little
.关键是你确实尝试过——这很好。而且每个人都开始知道“一些关于脚本的知识”,所以这不是问题。通过尝试或让某人帮助您克服特定问题,您将学到更多,而不是有人只是为您编写脚本。onFormSubmit
and couldn’t get it to work
.如果你看一下我的回答,你会发现“如何预填谷歌表单复选框?”中的答案做出了一些不适用于你的假设。这些会引起相当多的头疼。OTOH,因为表格“A”和“B”基本相同,它不需要任何额外的工作就可以处理复选框的预填充。