Хранение ответов на все формы в одном файле

#javascript #google-apps-script #google-sheets #google-forms

Вопрос:

Я пытаюсь сохранить каждый ответ из форм, отправленных пользователями, в AppScript. Я использую этот код, но я получаю ошибку:

 'TypeError: id_form.getResponses is not a function'
 

Мой код:

 //store answers in one file
 

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

 function setDestination_responses(form) {
  var id_form = FormApp.openById(form.getId());
  var spreadsheet_responses = SpreadsheetApp.openById('1TX4GOsihKuXFhbZMhtFWPYmGwrxii0XhyGhyTKzPKhc');

  var sheet_spreadsheet_responses = spreadsheet_responses.getSheets()[0];
  var titles = id_form.getItems().map(e => e.getTitle());
  var formResponses = id_form.getResponses();
  var values = formResponses.map(f => f.getItemResponses().reduce((o, i) => {
    var r = i.getResponse();
    return Object.assign(o, {[i.getItem().getTitle()]: Array.isArray(r) ? r.join(",") : r});
  }, {})).map(o => titles.map(t => o[t] || ""));

  if (values.length==0) {console.log(`VALUES EQUAL TO 0 ${values}`)} 
  else{sheet_spreadsheet_responses.getRange(sheet_spreadsheet_responses.getLastRow()   1, 1, values.length, values[0].length).setValues(values)};
}
 

Комментарии:

1. Я думаю, так и должно быть form.getResponses() .

2. Ну, сейчас скрипт не выдает ошибку, но в моей электронной таблице нет ответа. Есть ли что-нибудь, чего мне не хватает?

3. Выполните некоторую базовую отладку. console.log(formResopnses)

4. вы пытаетесь прочитать из идентификатора формы, который является строкой, в то время как вы должны читать из Form объекта

Ответ №1:

Точки изменения:

  • getResponses() возвращает объект FormResponse. В вашей ситуации я думаю, что необходимо получить значения ответа с помощью getItemResponses() .
  • Когда appendRow используется в цикле, стоимость процесса становится высокой. Ссылка

Когда эти моменты будут отражены в вашем сценарии, он будет выглядеть следующим образом.

Измененный сценарий:

 function myFunction() {
  var id_form = FormApp.openById(form.getId());
  var spreadsheet_responses = SpreadsheetApp.openById('1X1rhvgTfFq0-SoecLcgDP1Zu8x93Vba0EKMTBkRFJcw');
  var sheet_spreadsheet_responses = spreadsheet_responses.getSheets()[0];
  var titles = id_form.getItems().map(e => e.getTitle());
  var formResponses = id_form.getResponses();
  var values = formResponses.map(f => f.getItemResponses().reduce((o, i) => {
    var r = i.getResponse();
    return Object.assign(o, {[i.getItem().getTitle()]: Array.isArray(r) ? r.join(",") : r});
  }, {})).map(o => titles.map(t => o[t] || ""));
  sheet_spreadsheet_responses.getRange(sheet_spreadsheet_responses.getLastRow()   1, 1, values.length, values[0].length).setValues(values);
}
 
  • При запуске этого сценария все ответы извлекаются из формы Google и добавляются на 1-й лист электронной таблицы.
  • Примерно var id_form = FormApp.openById(form.getId()); то же самое в вашем сценарии form может быть с FormApp.openById(form.getId()) .
  • В форме Google, когда отправляется пустой ответ, вопрос не имеет значения. При этом необходимо учитывать это. Таким образом, сначала заголовки извлекаются из элементов, а значения создаются с использованием заголовков элементов. Я подумал, что это может быть важным моментом.

Рекомендации:

Комментарии:

1. Спасибо! очень хорошо объяснено!!

2. Ошибка типа: Не удается прочитать свойство «длина» неопределенного. Почему я получаю эту ошибку? это указывает на ценности. длина. Это потому, что нам нужно добавить параметр «значение» в функцию?

3. @alb Спасибо, что ответили. Я приношу извинения за причиненные неудобства. О Cannot read property 'length' of undefined. Why am I getting this error? , в таком случае, я думаю, что values это может не иметь значения. Так, например, как насчет того, чтобы поставить if (values.length == 0) return; перед строкой sheet_spreadsheet_responses.getRange(,,,) ? Если вы хотите это проверить, вы можете сделать это с помощью console.log(values) .

4. Хорошо! Я отредактировал сообщение с вашим предложением, но при отправке ответов в рассылке ничего не списывается. Все еще слишком новичок в JS, извините

5. @alb Спасибо, что ответили. О I edited the post with your suggestion, but nothing is written off in the spreadsheet when submitting responses. , в данном случае я думаю, что потому values что пусто. К if (values.length == 0) return; слову , сценарий закончен. Когда вы проверили console.log(values) , какой результат вы получили? К сожалению, я не могу знать вашу форму Google. Поэтому я не могу четко ответить на вашу текущую ситуацию. Это связано с моим плохим мастерством. Я глубоко извиняюсь за это.