通过Google应用脚本提交表单并收集电子邮件

时间:2018-04-30 19:05:23

标签: google-apps-script

在过去几年中,我们使用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,但我找不到任何文件来证实这一点。

有什么想法吗?

2 个答案:

答案 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);