Динамическое редактирование выпадающего списка формы создает дополнительный столбец - PullRequest
2 голосов
/ 26 апреля 2019

Я относительно новичок в Google Scripts for Sheets / Forms и отредактировал этот ответ, чтобы создать сценарий, который обновляет параметры в раскрывающемся вопросе при его запуске. Работает чудесно, но с одним небольшим глюком. Мой код, как показано ниже:

var idColumn = 1; 

function getSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ProjectList");
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var lr = rows.getLastRow();

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

  fillFormData(docId);
}

//fills form with document ID
function fillFormData(docId) {
  var formId = 'form ID goes here'
  var form = FormApp.openById(formId);
  var items = form.getItems();
  var item = items[1];
  //loop variables
  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.setChoices(arrayOfItems)

}

Я надеялся, что при обновлении вопроса с помощью setChoices () ответы будут размещены в том же столбце в листе ответов. Вместо этого каждый триггер этого сценария создает другой лист в листе ответов с именем «Номер проекта», перезаписывая один из столбцов, которые были там ранее. Это ожидаемое поведение, или кто-нибудь знает, как мои ответы попадают в один столбец? Есть ли способ направить ответы на этот вопрос в определенный столбец в листе ответов?

Редактировать: Согласно приведенным ниже советам, я попытался настроить макрос для использования .asListItems () безуспешно. Интересное поведение здесь состоит в том, что новый, дублирующий столбец, кажется, перезаписывает один из моих других столбцов, а не создает новый.

Вот мой ProjectList, всего один столбец:

Project Number
Project A
Project B
Project C
Project D
Project E

Форма состоит из 35 вопросов различного типа, разделенных на 3 раздела.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Вместо использования методов createChoice() и setChoices(), вы должны использовать setChoiceValues(), чтобы он не создавал новый вопрос.Используя setChoiceValues(), вы эффективно обновляете варианты.

См. Код ниже:

function optWriteItem_CHECKBOX_(paramItem, paramItemData) {
  try {
    var thisItem = paramItem.asCheckboxItem();
    var listChoices;
    var n, i;

    n = paramItemData.length;
    if(paramItemData.indexOf('__OTHER__') > 5) {
      listChoices = paramItemData.slice(5, n-1);
      thisItem.showOtherOption(true);
    } else {
      listChoices = paramItemData.slice(5, n);
      thisItem.showOtherOption(false);
    }


    thisItem.setTitle(paramItemData[0]);

    if(paramItemData[3].toLowerCase() == 'yes') thisItem.setRequired(true);
    else thisItem.setRequired(false);

    thisItem.setHelpText(paramItemData[4]);

    if(listChoices.length == 0) listChoices = [ 'Option 1' ];
    thisItem.setChoiceValues(listChoices);
  } catch(err) {
    Logger.log('optWriteAsType/opt=CHECKBOX : ' + err.message);
    console.error("optWriteItem_CHECKBOX_()", err);
    return {s:false, m:err.message};
  }

  return {s:true};
}

Исходный код

1 голос
/ 30 апреля 2019

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

function getSheet() {
   var sheet = SpreadsheetApp.openById('sheet id here');
}

var formId = "form id here";
var question = [{formFieldTitle:"question title here", worksheetName:"linked form sheet name here"}]

function newChoices(item, sheetName) {
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 1; i < data.length; i += 1){
    choices.push(item.createChoice(data[i][0])); 
  }
  item.setChoices(choices); 
}

function addNewChoices() {
  var form = FormApp.openById(formId);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1) {
    for (var j = 0; j < question.length; j += 1) {
      var item = items[i];
      if (item.getTitle() === question[j].formFieldTitle) {
        addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
        break; 
      } 
    } 
  } 
}

Переменная «вопрос» должнаиметь заголовок вопроса и имя листа, из которого добавляются элементы формы.

var question = [{formFieldTitle:"question title here", worksheetName:"sheet name here"}] 

Также обязательно измените «asCheckboxItem», если ваш вопрос не является флажком в строке ниже, см. Документация по элементу интерфейса для определения того, что использовать.

addNewChoices(item.asCheckboxItem(), question[j].worksheetName);
...