在过去几年中,我们使用Google Apps脚本与Google协作平台和Google云端硬盘来运行数百名代表的年度会议。这是我们拥有的非营利领域的G套件。
我认为谷歌可能已经改变了一些东西,因为去年工作的代码今年无效。
我遇到的问题是当我尝试通过Apps脚本中的代码提交表单时。如果表单设置为收集用户电子邮件以获取响应,那么当我尝试通过应用程序脚本提交时,它会失败并显示错误:
“抱歉,无法提交表单回复。请等待几分钟再试一次。” 错误指向代码中的“提交”行。或者有时,代码会运行,但表单中或表单中的“响应”中仍然没有任何内容。
如果我关闭收集电子邮件的选项,它运行正常,我在Google表格中看到提交,只是没有电子邮件地址。
我设置了一个测试表单,将其附加到新的Google工作表以获取回复,并粘贴在我的代码中:
function codeVoteDoVoteByForm()
{
// Get the Yes/No Google form
var myForm = FormApp.openById('1eJ6Wu63lXHkPMsIUPS5ZIAmZ_hGg18XAFLD5QpvqSSU')
// Get a list of questions on it
var questions = myForm.getItems()
// Get question 0 (only one on this form) and mark it as multiple choice
var qt = questions[0].asMultipleChoiceItem()
// Set the users vote
var qr = qt.createResponse("I am here")
//Create the response
var FormResponse = myForm.createResponse()
var testemail = FormResponse.getRespondentEmail()
// Submit the response
FormResponse.withItemResponse( qr );
var myResponse = FormResponse.submit()
var responseString = myResponse.getTimestamp()
return "Vote recorded at " + responseString
}
我认为谷歌改变了一些东西,所以现在运行脚本时,它无法获得用户的电子邮件地址以获得formresponse,但我找不到任何文件来证实这一点。
有什么想法吗?
答案 0 :(得分:2)
此功能将首先检查问题类型:
function autoFormResponse_(formId) {
var form = FormApp.openById(formId);
//disable restrictions temporaly
form.setCollectEmail(false);
// answer questions
var questions = form.getItems();
var formResponse = form.createResponse();
var required_list = [];
for (var i=0; i<questions.length; i++){
// release required questions
var question = getQuestionItemAs_(questions[i]);
if (question.isRequired())
{
question.setRequired(false);
required_list.push(question);
}
}
// submit
formResponse.submit();
// restore required questions
form.setCollectEmail(true);
for (var i = 0; i < required_list.length; i++)
{
required_list[i].setRequired(true);
}
// return last response
var responses = form.getResponses();
return responses[responses.length - 1];
}
助手功能:
function getQuestionItemAs_(item)
{
var type = '' + item.getType();
switch (type) {
// https://developers.google.com/apps-script/reference/forms/item-type
case 'CHECKBOX': return item.asCheckboxItem();
case 'CHECKBOX_GRID': return item.asCheckboxGridItem();
case 'DATE': return item.asDateItem();
case 'DATETIME': return item.asDateTimeItem();
case 'DURATION': return item.asDurationItem();
case 'GRID': return item.asGridItem();
case 'IMAGE': return item.asImageItem();
case 'LIST': return item.asListItem();
case 'MULTIPLE_CHOICE': return item.asMultipleChoiceItem();
case 'PAGE_BREAK': return item.asPageBreakItem();
case 'PARAGRAPH_TEXT': return item.asParagraphTextItem();
case 'SCALE': return item.asScaleItem();
case 'SECTION_HEADER': return item.asSectionHeaderItem();
case 'TEXT': return item.asTextItem();
case 'TIME': return item.asTimeItem();
case 'VIDEO': return item.asVideoItem();
default: return false;
}
}
答案 1 :(得分:0)
我认为问题是当您向具有收集电子邮件或经过身份验证的用户限制的表单发送答复时,没有添加电子邮件或对用户进行身份验证。不幸的是,我认为无法通过API发送此类信息,因此在我的情况下:
我再次启用限制
//disable restrictions temporaly
form.setLimitOneResponsePerUser(false);
form.setRequireLogin(false);
form.setCollectEmail(false);
var questions = form.getItems();
var formResponse = form.createResponse();
for (var i=0; i<questions.length; i++){
var question = questions[i].asMultipleChoiceItem();
var response = question.createResponse(correctAnswers[i]);
formResponse.withItemResponse(response);
}
formResponse.submit();
form.setLimitOneResponsePerUser(true);
form.setRequireLogin(true);
form.setCollectEmail(true);