#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. Поэтому я не могу четко ответить на вашу текущую ситуацию. Это связано с моим плохим мастерством. Я глубоко извиняюсь за это.