google-apps-script - 使用谷歌表格脚本编辑器自动填写谷歌表单时如何修复代码401?
问题描述
我正在尝试开发一个使用谷歌表格中提供的数据自动填写谷歌表单的程序。
这是我的代码。
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")
是我使用学校拥有的谷歌帐户还是我的代码有错误的问题。
我很迷茫,如果有人能提供帮助,我将不胜感激。
解决方案
无需使用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
函数中调用它来修改我的代码:
// 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中查看所有类型。
推荐阅读
- php - 如何在usgin googlechart(或chart.js等)的每一行中显示图表
- sql-server - 具有不同工作表选项卡的不同服务器的结果
- python - 如何从python中的输入中随机选择
- c++ - int64_t 和类似类型是否有可移植的文字后缀?
- java - 使用 super() 构造函数时未初始化空白最终字段
- django - Django - 解析作为request.GET上下文参数接收的多选值到模板的问题
- javascript - 如何使用布尔条件在 jQuery datepicker 中禁用以前的日期?
- react-native - 在 ItemSeparatorComponent 中使用索引
- python - pyinstaller 要求在 venv 和 -p 中确实提供了依赖项
- python - 如何允许 iframe 从 Django 网站访问其他网站?