#javascript #google-apps-script #google-sheets #google-forms
Вопрос:
Я работаю в чартерной школе, и когда у меня появляются новые ученики, я должен заполнить форму запроса оборудования для студента через Google Формы. Я хотел бы иметь возможность автоматически отправлять ответ без необходимости каждый раз заполнять форму. У меня уже есть вся информация о студенте, которая мне понадобится, в таблице Google.
У меня нет доступа к редактированию формы, и я могу использовать скрипт приложения Google только для кодирования, потому что у меня нет доступа к серверу или доступа администратора на моем рабочем ноутбуке. Так что это действительно мой единственный вариант автоматизации.
До сих пор мне удавалось выполнить вызов выборки с URL-адресом формы и объектом, используя идентификаторы входа для вопросов.
const obj = {
"entry.1111": tName,
"entry.2222": sFirst,
"entry.3333": sLast,
"entry.4444": 'Option 1', //multiple answer question
"entry.5555": 'yes',
"entry.6666": 'yes',
"entry.7777": 'minor',
"entry.8888": 'initial'
}
const options = {
'method': 'post',
'payload': obj
}
UrlFetchApp.fetch(url,options)
Это работает до тех пор, пока мне не нужно включать более одного ответа на вопрос, но для некоторых студентов мне нужно сделать именно это. Если я попытаюсь отправить строку типа «Вариант 1, вариант 2», сценарий завершится неудачно.
Изменить: В моем коде нет комментария в объекте.
Комментарии:
1. вы пробовали массив для полезной нагрузки?
2. Да, я это сделал. [«Вариант 1», «Вариант 2»] не удается. Я знаю, как это делается при использовании сервисов Google.
3. Могу ли я задать вам вопрос в форме Google, на который вы хотите отправить несколько ответов? Например, если вопрос является переключателем, можно выбрать 1 вариант. Если я правильно понимаю, когда включен другой вариант, я подумал, что текст
Option 1, Option 2
может быть отправлен. Если я неправильно понял вашу ситуацию, я приношу свои извинения.4. В вопросе используется метод ввода флажка. Он имеет три варианта, и может быть выбрана любая комбинация из трех.
5. Вы проверили различные методы в классе FormResponse ? Является ли сценарий, который вы используете, автономным или он сопряжен с листом, с которого у вас есть данные об учениках? Это весь сценарий?
Ответ №1:
Когда отправляются несколько ответов на один вопрос, к сожалению, я подумал, что объект JSON, возможно, не сможет напрямую использоваться для полезной нагрузки. Потому что в этом случае используется один и тот же ключ. И даже когда для значения используется массив, возникает ошибка. Об этом уже говорилось в вашем комментарии.
Поэтому в этом ответе я хотел бы предложить добавить его в параметр запроса. В этом случае, я думаю, что для вашей ситуации есть 2 модели.
Образец 1:
В этом шаблоне все значения используются в качестве параметров запроса.
// This script is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
String.prototype.addQuery = function(obj) {
return this Object.keys(obj).reduce(function(p, e, i) {
return p (i == 0 ? "?" : "amp;")
(Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
return str e "=" encodeURIComponent(f) (j != obj[e].length - 1 ? "amp;" : "")
},"") : e "=" encodeURIComponent(obj[e]));
},"");
}
function myFunction() {
const url = "### your URL ###"; // Please set your URL.
const query = {
"entry.1111": tName,
"entry.2222": sFirst,
"entry.3333": sLast,
"entry.4444": ['Option 1', 'Option 2'],
"entry.5555": 'yes',
"entry.6666": 'yes',
"entry.7777": 'minor',
"entry.8888": 'initial'
};
const endpoint = url.addQuery(query);
const options = {'method': 'post'};
const res = UrlFetchApp.fetch(endpoint, options);
console.log(res.getContentText());
}
Образец 2:
В этом шаблоне в качестве параметров запроса отправляется только вопрос из нескольких ответов.
// This script is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
String.prototype.addQuery = function(obj) {
return this Object.keys(obj).reduce(function(p, e, i) {
return p (i == 0 ? "?" : "amp;")
(Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
return str e "=" encodeURIComponent(f) (j != obj[e].length - 1 ? "amp;" : "")
},"") : e "=" encodeURIComponent(obj[e]));
},"");
}
function myFunction() {
const url = "### your URL ###"; // Please set your URL.
const query = {
"entry.4444": ['Option 1', 'Option 2'],
};
const obj = {
"entry.1111": tName,
"entry.2222": sFirst,
"entry.3333": sLast,
"entry.5555": 'yes',
"entry.6666": 'yes',
"entry.7777": 'minor',
"entry.8888": 'initial'
};
const endpoint = url.addQuery(query);
const options = {
'method': 'post',
'payload': obj
};
const res = UrlFetchApp.fetch(endpoint, options);
console.log(res.getContentText())
}
Комментарии:
1. Это не работает для меня. Я получаю пустой ответ, например, я получаю метку времени для ответа, но все поля ответа пусты.
2. @Эндрю Валенсуэла Спасибо, что ответили. Я должен извиниться за свое плохое знание английского языка. К сожалению, я не могу понять
I get a blank response, like I get a timestamp for a response but all the response fields are blank.
. Могу я спросить вас об этом в деталях? Потому что, когда я протестировал выше 2 шаблонов, я мог подтвердить, что все ответы помещены в электронную таблицу. Я приношу свои извинения за это.3. Да, на 100% моя вина. Я попробовал ваш код, но при тестировании использовал неправильные идентификаторы ввода. После исправления я могу подтвердить, что это работает. Спасибо!
4. @Andrew Valenzuela Спасибо, что ответили и протестировали его еще раз. Я рад, что ваш вопрос был решен. И тебе тоже спасибо.