Google apps script 从谷歌电子表格填充谷歌表单响应
我正在尝试(目前还没有成功)从谷歌电子表格中填充一个谷歌表单,使用我从这个网站上获取的项目和Mogsdad提供的这个非常有用的答案 理想情况下,我正在寻找:Google apps script 从谷歌电子表格填充谷歌表单响应,google-apps-script,google-sheets,google-forms,Google Apps Script,Google Sheets,Google Forms,我正在尝试(目前还没有成功)从谷歌电子表格中填充一个谷歌表单,使用我从这个网站上获取的项目和Mogsdad提供的这个非常有用的答案 理想情况下,我正在寻找: Logger.log(URL)记录电子表格中存储的所有数据的URL,是否可以只记录最后一个条目并使用它生成URL 那么,一旦填充了数据,预填充的URL是否可以自动提交?我发现了这篇有用的文章,它表明这是可以做到的 存储在Google电子表格中的数据是从另一个Google表单捕获的数据。这是因为需要使用Excel(缺少Internet连接)和
Logger.log()
语句只是为了证明您可以生成正确的URL,如果您想分发它的话。您只需使用变量url
的内容,而不是记录它
但让我们继续,因为我认为这有点偏离你的方向
那么,一旦填充了数据,预填充的URL是否可以自动提交
有一个更好的起点。我们可以通过编程将电子表格中的信息提交到google表单中吗?当然看见这是一种比你在“URL技巧”帖子中看到的更可靠的方法
在“自动提交”或模拟表单提交的情况下,您根本不需要担心预填充的URL。这是讨厌的人类的捷径。您想要的是将有效负载
放在一起,用于POST
请求,让计算机完全绕过表单UI
关于Excel的一些信息。。。这是否会影响提交时自动提交所需的触发器
(听起来像…)您使用Form1将数据输入电子表格1,然后期望在将数据与Form1分离后,让机器提交Form2,从而对Form1的(人类?)提交做出反应
是的,在您尝试阅读信息以提交Form2之前,您需要注意列拆分已经完成
我建议您最好使用Spreadsheet1的表单提交触发函数,该函数将从Form1收到的字符串拆分,然后立即将帖子发送到Form2。然后,我将使用来自的技术记录此操作已经发生的事实
/**
* Use Form API to populate form
*
* Addapted from https://stackoverflow.com/a/26395487/1677912
*/
function populateFormResponses() {
//var ss = SpreadsheetApp.getActive();
var id = '11KDxp1C6jAZaTMNlGHke8zEzQ7aZrFSFGABdwUHEV80';
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheetByName("Form Responses 1");
var data = ss.getDataRange().getValues(); // Data for pre-fill
var headers = data[0]; // Sheet headers == form titles (questions)
var formUrl = ss.getFormUrl(); // Use form attached to sheet
var form = FormApp.openByUrl(formUrl);
var items = form.getItems();
//var urlCol = headers.indexOf("Prefilled URL"); // If there is a column labeled this
// way, we'll update it
// Skip headers, then build URLs for each row in Sheet1.
for (var row = 1; row < data.length; row++ ) {
//Logger.log("Generating pre-filled URL from spreadsheet for row="+row);
Logger.log("Generating response from spreadsheet for row="+row);
// build a response from spreadsheet info.
var response = form.createResponse();
for (var i=0; i<items.length; i++) {
var ques = items[i].getTitle(); // Get text of question for item
var quesCol = headers.indexOf(ques); // Get col index that contains this
// question
var resp = ques ? data[row][quesCol] : "";
var type = items[i].getType().toString();
Logger.log("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 );
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) {
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);
}
// Submit response
response.submit();
// Generate the pre-filled URL for this row
//var editResponseUrl = response.toPrefilledUrl();
// If there is a "Prefilled URL" column, update it
//if (urlCol >= 0) {
// var urlRange = sheet.getRange(row+1,urlCol+1).setValue(editResponseUrl);
//}
}
};
/**
*使用表单API填充表单
*
*加入https://stackoverflow.com/a/26395487/1677912
*/
函数populateFormResponses(){
//var ss=SpreadsheetApp.getActive();
变量id='11KDxp1C6jAZaTMNlGHke8zEzQ7aZrFSFGABdwUHEV80';
var ss=电子表格应用程序openById(id);
var sheet=ss.getSheetByName(“表单响应1”);
var data=ss.getDataRange().getValues();//预填充的数据
var headers=data[0];//工作表headers==表单标题(问题)
var formUrl=ss.getFormUrl();//使用附在工作表上的表单
var form=FormApp.openByUrl(formUrl);
var items=form.getItems();
//var urlCol=headers.indexOf(“预填充URL”);//如果有一列标记为this
//好的,我们会更新的
//跳过标题,然后为Sheet1中的每一行构建URL。
对于(变量行=1;行 对于(var i=0;iThanks Mogsdad-这确实有助于回答这个问题,并且通过您的建议,我已经能够使这个问题生效了!谢谢。第二个问题的答案现在已经过时了。谢谢!这对我想要批量上传的9/10列有效。在剩余的1/10列中,应用程序脚本不喜欢用户在提交时提交的文本字符串在复选框中使用了“Other”。我必须手动从工作表中删除该数据,然后在脚本完成后将其粘贴回结果中。var data=ss.getDataRange().getValues();
应该是var data=sheet.getDataRange().getValues()
@masofund请参阅。只有当表单响应表不是第一张时,才需要您建议的代码。我发现该选项更好,可以防止错误。但我理解,谢谢。感谢您的代码,它工作得很好(只需稍加修改即可处理空白的多项选择题响应)。