Могу ли я обновить вопросы формы Google с помощью электронной таблицы?

#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());
    });
    
  }
}
 

Что он делает?

  1. Получите список идентификаторов Google Forms в разделе Sheet:Forms
  2. Получите все значения флажков в разделе Sheet:Questions «начиная с Cell B2 » .
  3. Проверьте значения каждого флажка, если установлено значение true, затем переместите текущий индекс в questionIndex массив. (Обратите внимание, что в javascript индекс массива начинается с нуля).
  4. Откройте каждую форму, указанную на шаге 1, одну за другой, используя цикл for, используя FormApp.openById(). Затем получите все элементы текущих форм с помощью .GetItems() . Это даст вам массив элементов, доступных в вашей форме (это может представлять ваши вопросы в вашей форме).

Элементы формы могут быть доступны в виде массива. Следовательно, он должен начинаться с нуля. (Вопрос 1 = индекс 0, вопрос 2 = индекс 1… и так далее)

  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