Динамическое обновление параметров Google Формы "выбрать из списка" из столбца в электронной таблице


Я пытаюсь настроить форму Google, которая создаст вопрос " Выбрать из списка", причем каждый вариант будет извлечен из строк в определенном столбце.

Я пробовал этот код, но он не работал для меня вообще.

Код, который у меня есть до сих пор, приведен ниже. Я могу создать желаемую форму вопроса с данными только из одной строки в определенном столбце (В данном случае последняя строка столбца).

Если кто-нибудь может помочь, указав мне право направление относительно того, как назначить каждую выбранную строку только одному варианту вопросов. Кроме того, если это какой-то способ динамически обновлять параметры вопроса каждый раз, когда электронная таблица обновляется.

var idColumn = 1; // ID of the selected column

//gets document ID from spreadsheet 
//(not 100% sure the role of all of these lines, have worked it out from other examples of code online)
function spreadSheetGetter() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var lr = rows.getLastRow();  

  var docId = sheet.getRange(lr,idColumn,1,1).getValue(); //gets the data from the last row in selected column

fillFormData(docId);
}


//fills for with document ID
function fillFormData(docId) {
var form = FormApp.openById('MY FORMS ID');
var item = form.addListItem();

item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices([
         item.createChoice(docId), //data from row 1
         item.createChoice(docId) //data from row 2 etc...
       ])
}
3 4

3 ответа:

Это утверждение:

var docId = sheet.getRange(lr,idColumn,1,1).getValue();

Получает только одно значение. Я думаю, что вам нужны все значения в столбце, поэтому используйте getValues() ('s' на конце) метод получения двумерного массива значений. И измените параметр numRows (Количество строк, которые нужно получить) на переменную lr. Кроме того, вы хотите начать с строки 2, вероятно. Синтаксис:

getRange(row, column, numRows, numColumns)
  • row-целое число начальной строки диапазона
  • column-целое число начального столбца диапазон
  • numRows-целое число строк для возврата
  • numColumns-целое число возвращаемых столбцов

Итак, параметры должны быть установлены следующим образом:

var docId = sheet.getRange(2,idColumn,lr,1).getValues();

Если в электронной таблице строка one имеет названия заголовков,вы можете не включать заголовок в список элементов. Вот почему первый параметр установлен на число 2, чтобы начать с строки 2.

Затем вам нужно будет обработать данные, которые находятся в двумерном массиве, и создайте новый массив в формате, необходимом для метода setChoices(choices), чтобы добавить каждое значение в список. Вам понадобится цикл программирования. При этом каждый раз будет создаваться новый массив значений элементов, поэтому текущие значения в столбце будут обновляться до списка.

var thisValue = "";
var arrayOfItems = [];
var newItem = "";

for (var i=0;i<docId.length;i++) {
  thisValue = docId[i][0];
  newItem = "item.createChoice('" + thisValue + "')";
  arrayOfItems.push(newItem);
};

Полная функция будет выглядеть примерно так:

//fills item with document ID
function fillFormData(docId) {
  var form = FormApp.openById('MY FORMS ID');
  var item = form.addListItem();

  var thisValue = "";
  var arrayOfItems = [];
  var newItem = "";

  for (var i=0;i<docId.length;i++) {
    thisValue = docId[i][0];
    Logger.log('thisValue: ' + thisValue);
    newItem = item.createChoice(thisValue);
    arrayOfItems.push(newItem);
  };

  item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices(arrayOfItems)
};

Я не уверен, что это поможет вам, но есть более простой способ, чем кодирование этой операции самостоятельно. Существует надстройка google forms под названием FormRanger, которая автоматически заполняет поля в вопросе "выбрать из списка" на основе информации о строках другой электронной таблицы. Вы можете установить его, перейдя в меню надстройки формы, а затем добавив новое дополнение.

Вот ссылка на описание FormRanger. Существует учебник в этом документе, как хорошо.

Https://docs.google.com/document/d/1qidnsrTShKU9kPnYz4nubHs2cK9yWnQ2z_XBoqgdIhs/edit

Надеюсь, что я не слишком поздно для этого, но мне удалось получить решение, упомянутое в вопросе, чтобы работать, и это кажется лучшим вариантом, так как он обновляет форму, которая уже построена, нет необходимости создавать новый или новый вариант для этого. Я также изменил код, представленный Allnatural и ChrsF на оригинальном посте , так что он принимает именованные диапазоны (или регулярные диапазоны, если на то пошло), таким образом уменьшая количество листов, которые вам понадобятся на вашем компьютере. электронная таблица.

Вы должны поместить этот скрипт в электронную таблицу с опциями, чтобы он мог запускаться всякий раз, когда вы его меняете или через заданные интервалы:

//Here you set the options for the question on your form you want to dinamically change and which named range will populate it
var LIST_DATA = [{formFieldTitle:"Who's your tutor", namedRange:"reg_opcoes"}]

//Inserts a menu entry that allows you to run the function to update the options of the form
function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

//The update function itself, it will run for as many options as you set in the LIST_DATA list
function updateLists() {
  var form = FormApp.openById('1Pl3i5Qr8Kq5C2UbBUqA0iZCsmaHXum5eWR1RfIaEL6g'); //Insert your form ID here
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){ //Here the titles of the questions are called
        updateListChoices(item.asListItem(), LIST_DATA[j].namedRange); //Here the range that populates que question with options is called
        break;
      }
    }
  }
}

//Function that actually gets the values from the range you defined
function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              /* 
                 If you want, you might change the option here to .getDataRange() and work with defined ranges.
                 For that, yoiu should also place a .getSheetName() before it, so that'll know of what interval you're talking about
              */
              .getRange(sheetName) 
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

После того, как вы получили его в wokr, вы можете настроить triger для запуска функции "updateLists" при каждом изменении, сделанном в вашей электронной таблице, тогда нет необходимости вручную обновлять опцию с помощью кнопки меню.

Я seraching для этого решения на некоторое время теперь, и я рад, что нашел его. Надеюсь, вам это тоже поможет.