Как отправить ответ на вопрос с несколькими ответами в форме Google с помощью Javascript

#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 Спасибо, что ответили и протестировали его еще раз. Я рад, что ваш вопрос был решен. И тебе тоже спасибо.