Как исправить код 401 при автоматическом заполнении форм Google с помощью редактора сценариев листов Google? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь разработать программу, которая автоматически заполняет форму Google, используя данные, предоставленные в листах Google.

Это мой код.

function auto_data_entry() {
  var formURL = "(URL of the form would be put here)";
  var workbook = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet = workbook.getSheetByName("Sheet1");

  var full_name = worksheet.getRange("A2").getValue();
  var year = worksheet.getRange("B2").getValue();   
  var month = worksheet.getRange("C2").getValue();
  var day = worksheet.getRange("D2").getValue();
  var period = worksheet.getRange("E2").getValue();

  var datamap = 
  {
  "entry.1901360617": full_name,
  "entry.43103907_year": year,
  "entry.43103907_month": month,
  "entry.43103907_day": day,
  "entry.1047848587": period
  };

  var options = 
  {
    "method": "post",
    "payload": datamap
  };

  UrlFetchApp.fetch(formURL, options); //Line 27

}

Однако он возвращается. ..

Exception: Request failed for https://docs.google.com returned code 401.
Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" 
content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... 
(use muteHttpExceptions option to examine full response) (line 27, file "Code")

Проблема в том, что я использую школьную учетную запись Google или в моем коде произошла ошибка.

Я очень потерян и буду признателен, если кто-то сможет выручить.

1 Ответ

1 голос
/ 20 апреля 2020

Нет необходимости использовать UrlFetchApp , поскольку вы можете использовать Class FormResponse и Class ItemResponse . Этот код поможет вам в решении вашей проблемы:

function autoDataEntry() {

  // Get the desire form with its questions and create
  // a response to later be submitted 
  var form = FormApp.openById("YOUR-FORM-ID");
  var formResponse = form.createResponse();
  var formQuestions = form.getItems();

  var workbook = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet = workbook.getSheetByName("Sheet1");
  // Get all the needed values in the second row 
  var answers = worksheet.getRange("A2:E2").getValues();

  answers[0].forEach((answer, answerNumber) => {
    // Get the question depending of its type
    var question = getQuestion(formQuestions, answerNumber);
    // Create the response to your question with the value obtained in the sheet
    var formAnswer = question.createResponse(answer);
    // Add the answer to the response
    formResponse.withItemResponse(formAnswer);  
  });
  // submit the form response  
  formResponse.submit();

}

Что я сделал, так это получил бланк, куда вы хотите отправить свой ответ, и лист с ответами. Затем я перебрал эти ответы, чтобы добавить их к соответствующему вопросу, который будет добавлен к ответу формы. Когда этот процесс завершится, вам нужно только отправить ответ формы.

Редактировать

Я изменил свой код, добавив следующую функцию и вызвав его внутри forEach в моем autoDataEntry function:

// This function will return the question as the requiered type
function getQuestion(formQuestions, answerNumber){
  var questionType = formQuestions[answerNumber].getType();
  switch(questionType){
    case FormApp.ItemType.TEXT:
      return formQuestions[answerNumber].asTextItem();
    case FormApp.ItemType.MULTIPLE_CHOICE:
      return formQuestions[answerNumber].asMultipleChoiceItem();
    case FormApp.ItemType.DATE:
      return formQuestions[answerNumber].asDateItem();
  }
}

Таким образом, вы получите правильный тип вопроса, поскольку ситуация требует столько времени, сколько вы задали в качестве условия в операторе switch. Вы можете увидеть все типы в Enum ItemType .

...