#google-sheets #google-forms
#google-таблицы #google-forms
Вопрос:
У меня есть тонны форм Google для проекта, и в каждой из них одинаковые разделы и вопросы, просто разные варианты выбора. Каждый раз, когда я хочу обновить вопрос, мне приходится изменять каждую форму по отдельности, что занимает много времени. Мне было интересно, есть ли способ связать форму с листом, чтобы я мог изменить вопрос в электронной таблице, и он будет обновляться в каждой подключенной форме.
Ответ №1:
Один из вариантов, который я мог бы предложить, — создать сценарий, привязанный к контейнеру, в ваших таблицах Google, чтобы обновлять вопросы для нескольких форм Google с помощью Apps Script.
Примерный лист:
У нас есть таблица Google с 2 листами с именами «Вопросы» и «Формы» соответственно.
Лист: Вопросы содержит список вопросов, доступных в ваших формах Google. Столбец «Обновить» можно использовать в качестве флага, чтобы определить, какие вопросы вы хотите обновить в формах Google.
Лист: Формы содержит список идентификаторов Google Forms, в которых вы хотите обновить вопросы.
Пример кода скрипта приложений:
function updateFormsQuestions() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formsSheet = ss.getSheetByName("Forms");
var questionsSheet = ss.getSheetByName("Questions");
//Get the list of forms to update
var formsList = formsSheet.getRange(2,1,formsSheet.getLastRow()-1).getValues();
Logger.log(formsList);
//Get the list of questions to update
var questionIndex = [];
var qCheckbox = questionsSheet.getRange(2,2,questionsSheet.getLastRow()-1,1).getValues();
Logger.log(qCheckbox);
qCheckbox.forEach(function(currentValue, index){
if(currentValue[0] == true)questionIndex.push(index);
});
Logger.log(questionIndex);
//Open Form and get all items
for( var i = 0; i < formsList.length; i ){
var forms = FormApp.openById(formsList[i][0]);
var items = forms.getItems();
//Update question
questionIndex.forEach(function(index){
Logger.log(index);
Logger.log(questionsSheet.getRange(index 2, 1).getValue());
items[index].setTitle(questionsSheet.getRange(index 2, 1).getValue());
});
}
}
Что он делает?
- Получите список идентификаторов Google Forms в разделе
Sheet:Forms
- Получите все значения флажков в разделе
Sheet:Questions
«начиная сCell B2
» . - Проверьте значения каждого флажка, если установлено значение true, затем переместите текущий индекс в
questionIndex
массив. (Обратите внимание, что в javascript индекс массива начинается с нуля). - Откройте каждую форму, указанную на шаге 1, одну за другой, используя цикл for, используя FormApp.openById(). Затем получите все элементы текущих форм с помощью .GetItems() . Это даст вам массив элементов, доступных в вашей форме (это может представлять ваши вопросы в вашей форме).
Элементы формы могут быть доступны в виде массива. Следовательно, он должен начинаться с нуля. (Вопрос 1 = индекс 0, вопрос 2 = индекс 1… и так далее)
- Обновите вопросы в текущем элементе с помощью .setTitle(). Новый заголовок будет основан на значении ячейки в таблице: столбец вопросов A. Вы можете получить значение ячейки с помощью .GetValue() при условии, что вы уже выбрали правильный диапазон ячеек с помощью .getRange().
Обратите внимание, что мы увеличиваем индекс строки на 2 при получении значения ячейки
questionsSheet.getRange(index 2, 1).getValue()
. Строки и столбцы ячеек начинаются с 1 в листах, если мы хотим получить доступCell A3, row = 3; col = 1
. Индекс, который мы сохранили ранее на шаге 3, начинается с нуля (поскольку мы использовали массив). Если вам интересно, почему мы увеличиваем 2 вместо 1. Причина в том, что мы также скорректировали индексацию, когда начали получать значения флажков из строки 2 вместо строки 1 на шаге 2.
Sheet:Questions
Столбец C покажет вам индексациюqCheckbox
массива, а столбец D покажет вам индексацию листов при доступе к строкам.
Вывод:
ПЕРЕД:
Дополнительные ссылки:
Сервис форм — позволяет сценариям создавать, получать доступ к формам Google и изменять их
Служба электронных таблиц — позволяет скриптам создавать, получать доступ и изменять таблицы Google