使用 google 工作表脚本编辑器自动填充 google 表单时如何修复代码 401?

How to fix code 401 when auto filling google forms using google sheets scripts editor?

我正在尝试开发一个程序,使用 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

}

然而,returns...

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 帐户还是我的代码有误。

我很迷茫,如果有人能帮忙,我将不胜感激。

不需要使用UrlFetchApp because you can use the Class FormResponse and the 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();

}

我所做的是获取您要发送回复的表单和答案所在的 sheet。然后我遍历这些答案,将它们添加到相应的问题中,这些问题将添加到表单响应中。该过程完成后,您只需提交表单回复即可。

编辑

我通过添加以下函数并在我的 autoDataEntry 函数的 forEach 中调用它来修改我的代码:

// 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 中看到所有类型。