Обновление выбранного индекса из списка

У меня есть скрипт Google, который читает и записывает между электронной таблицей Google и формой Google. По сути, это форма для доступа к базе данных материалов.

При первом доступе к форме она показывает все поля пустыми, заполненный список «селектор» с идентификаторами материалов (CW_ID) и опцию для «New» части в списке селекторов. Если пользователь остается на «Новый», поля остаются пустыми, чтобы пользователь мог заполнить их вручную и добавить как новый элемент в базу данных. Если пользователь прокручивает список «селектор» и выбирает CW_ID, он извлекает из электронной таблицы и заполняет поля данными, соответствующими выбранному CW_ID, чтобы пользователь мог затем отредактировать (изменить детали о детали).

Поскольку я использую структуру SQL для своей базы данных, у меня есть пара связанных таблиц:

  • таблица материалов (в которой содержится большая часть информации о детали, включая идентификатор производителя [Manufacturer_ID])

  • таблица производителей (которая связана с файлом materials.manufacturer_ID)

Прямо сейчас форма использует только лист материалов для заполнения полей, поэтому в поле для «производителя» отображается только идентификационный номер. Для пользовательских целей я хочу, чтобы сценарий проверял Manufacturer_ID, показанный в листе материалов, переходил в лист производителей, находил совпадение и отображал его в списке производителей как текущий выбранный индекс. (Или просто укажите название производителя в поле)

Это часть моего сценария:

(Прокрутите вниз и найдите «// **** ЭТО ЧАСТЬ Я РАБОТАЮ»)

function doGet() {
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/something")
  var materialsSheet = ss.getSheetByName('materials');
  var manufacturersSheet = ss.getSheetByName('manufacturers');
  var vendorsSheet = ss.getSheetByName('vendors');
  var usersSheet = ss.getSheetByName('users');
  var projectApp = UiApp.createApplication();
  projectApp.setTitle("Materials Form");
  var activeEmail = Session.getActiveUser().getEmail();

  //I create the vertical panel.
  var panel = projectApp.createVerticalPanel().setId('face'); 


  //Here is where I actually create the drop down menu, and assign the function "goSelection" to be activated whenever a selection is made.
  var selector = projectApp.createListBox(true);
  selector.setName('selectionBox').setId('selectionBox').addItem('New');
  var materialsData = materialsSheet.getDataRange().getValues();
  //do until row is less than length of 
  for (var i=0; i < materialsData.length; i++){ 
    if (materialsData [i][1] == "Email"){
      //if row in Column B does not equal gmail, skip to i++
      continue;
    }
    //add Column C (CW_ID) of current row to the selector list
    selector.addItem(materialsData [i][2]); 
  }
  selector.setSelectedIndex(0);
  var selectHandler = projectApp.createServerHandler('goSelection');
  selectHandler.addCallbackElement(panel);
  selector.addChangeHandler(selectHandler);



 //Here is where I create the drop down menu to show list of manufacturers from manufacturers sheet
  var manufSelectorLabel = projectApp.createHTML("<br><b>Manufacturer</b><br>").setWidth('100%');
  var manufSelector = projectApp.createListBox(true);
  manufSelector.setName('manufSelectionBox').setId('manufSelectionBox').addItem('New');
  var manufacturersData = manufacturersSheet.getDataRange().getValues();
  //do until row is less than length of 
  for (var i=0; i < manufacturersData.length; i++){ 
    if (manufacturersData [i][1] == "Email"){
      //if row in Column B does not equal gmail, skip to i++
      continue;
    }
    //add Column C (Manufacturers) of current row to the selector list
    manufSelector.addItem(manufacturersData [i][3]); 
  }
  manufSelector.setSelectedIndex(0);
  var manufSelected = manufSelector.SelectedItem;'
  //**I am unsure whether this should have it's own function
  //var manufSelectHandler = projectApp.createServerChangeHandler('goManuf');
  //manufSelectHandler.addCallbackElement(panel);
  //manufSelector.addChangeHandler(manufSelectHandler);


  var gmailLabel = projectApp.createHTML("<br><b>Gmail:</b><br>").setWidth('100%');
  var gmailField = projectApp.createTextArea().setSize('100%', '25px');
  gmailField.setName('gmailArea').setId('gmailArea');
  gmailField.setText(activeEmail);

  var savedLabel = projectApp.createLabel('Thank you for your submission.');
  savedLabel.setVisible(false).setId('sLabel');

  //At this point, I'm actually declaring the variables for all the fields and text for the actual form. 
  var selectorLabel = projectApp.createHTML("<br><b>Select CW_ID from list.</b>").setId('selectLabel');  


  var descriptionLabel = projectApp.createHTML("<br><b>Description</b><br>").setWidth('100%');
  var descriptionField = projectApp.createTextArea().setSize('100%', '100px');
  descriptionField.setName('descriptionArea').setId('descriptionArea');    

  var manufacturerLabel = projectApp.createHTML("<br><b>Manufacturer</b></br>").setWidth('100%');
  var manufacturerField = projectApp.createTextArea().setSize('100%x', '25px');
  manufacturerField.setName('manufacturerArea').setId('manufacturerArea');    

  var manufacturerListLabel = projectApp.createHTML("<br><b>ManufacturerList</b></br>").setWidth('100%');
  var manufacturerListField = projectApp.createTextArea().setSize('100%x', '25px');
  manufacturerListField.setName('manufacturerListArea').setId('manufacturerListArea');

  var modelnumberLabel = projectApp.createHTML("<br><b>Model Number</b><br>").setWidth('100%');
  var modelnumberField = projectApp.createTextArea().setSize('100%', '25px');
  modelnumberField.setName('modelnumberArea').setId('modelnumberArea');   


  //Next, i create the save button and assign the function "saved" to be activated whenever the button is pressed.
  var saveButton = projectApp.createButton('Save');
  var saveHandler = projectApp.createServerHandler('saved');
  saveHandler.addCallbackElement(panel);
  saveButton.addClickHandler(saveHandler);

  //Now that all the componentes of the form have been declared and set up, I'm going to assemble them on the panel.
  panel.setSpacing(6);
  panel.add(nameLabel);
  panel.add(nameField);
  panel.add(gmailLabel);
  panel.add(gmailField);  
  panel.add(selectorLabel);
  panel.add(selector);
  panel.add(descriptionLabel);
  panel.add(descriptionField);
  panel.add(manufSelectorLabel);
  panel.add(manufSelector);
  panel.add(manufacturerLabel);
  panel.add(manufacturerField);
  panel.add(modelnumberLabel);
  panel.add(modelnumberField);
  panel.add(saveButton);
  panel.add(savedLabel);
  projectApp.add(panel);
  return projectApp;
}


  //This function looks to see what has been selected in the drop down menu, and then pulls the appropriate data from the spreadsheet to display in the fields.
   function goSelection(e){
  var activeEmail = Session.getActiveUser().getEmail();
  var app = UiApp.getActiveApplication();
  var gmailField = app.getElementById('gmailArea');
  var nameField = app.getElementById('nameArea');
  var chosen = e.parameter.selectionBox;
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/something")

  var materialsSheet = ss.getSheetByName('materials');
  var manufacturersSheet = ss.getSheetByName('manufacturers');
  var vendorsSheet = ss.getSheetByName('vendors');
  var materialsData = materialsSheet.getDataRange().getValues();
  var manufacturersData = manufacturersSheet.getDataRange().getValues();
  var vendorsData = vendorsSheet.getDataRange().getValues();

  var panel = app.getElementById('face');
  var standardpartField = app.getElementById('standardpartArea');
  var descriptionField = app.getElementById('descriptionArea');
  var manufacturerField = app.getElementById('manufacturerArea');
  var manufacturerListField = app.getElementById('manufSelectionBox');
  var modelnumberField = app.getElementById('modelnumberArea');

if (chosen != 'New') {
 for (var i=1; i < materialsData.length; i++){
    if (materialsData [i][1] == "Email"){
  //if row in Column B does not equal gmail, skip to i++
  continue;
   }
   if (materialsData [i][2] != chosen){
    continue;
    }
    nameField.setText(materialsData [i][0]);
    gmailField.setText(materialsData [i][1]);
    standardpartField.setText(materialsData [i][3]);
    descriptionField.setText(materialsData [i][4]);


    //****THIS IS THE PART I'M WORKING ON
    //set manufacturerField to manufacturer of current row
    //loop through manufacturer sheet until row matches with manufacturersField
    //when a match is found, selector box index to same row

    manufacturerField.setText(materialsData [i][5]);      

    for (var i=1; i < manufacturersData.length; i++){
      if (manufacturersData [i][1] == "Email"){
      //if row in Column B does not equal Email, skip to i++
        continue;
      }
      if (manufacturersData [i][2] != manufacturerField){
        continue;
      }
     manufacturerListField.setSelectedIndex(i);
    }

    modelnumberField.setText(materialsData [i][6]);
    }
}

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

(См. Изображение, чтобы получить представление о том, как выглядит форма)

http://oi61.tinypic.com/6h6tqp.jpg

Отображаются список производителей и поле, но сейчас изменяется только поле производителя, чтобы отображать данные при выборе детали)

Любая помощь будет очень признательна! :)


person khelza    schedule 20.03.2015    source источник
comment
Класс UiApp устарел. Документация Google - UiApp Вы вкладываете силы и время в то, что не поддерживается и будет отключено в будущем.   -  person Alan Wells    schedule 20.03.2015


Ответы (1)


Вот немного HTML, с которого вы можете начать работу со службой HTML:

Форма ввода HTML

<div>
  <div>
      Name:
     <select>
      <option value="one">One</option>
      <option value="two">Two</option>
      <option value="three">Three</option>
      <option value="four">Four</option>
    </select>
  </div>

  <br/>

  <div>
    Gmail:
     <select>
      <option value="one">One</option>
      <option value="two">Two</option>
      <option value="three">Three</option>
      <option value="four">Four</option>
    </select>
  </div>

  <br/>

  <div>Select_CW_ID_From List:</div>
    <select name="CW_ID" multiple>
    <option value="one">One</option>
    <option value="two">Two</option>
    <option value="three">Three</option>
    <option value="four">Four</option>
    </select>
  </div>

  <br/>

  <div>Standard Part</div>

  <input type="text"/>

  <br/>
  <br/>
  <div>Description</div>
  <textarea rows="4" cols="50" name="comment" form="usrform">
Enter text here...</textarea>
</div>

<script>
  function onSuccess(argReturnValue) {
    alert('was successful ' + argReturnValue);
  }

  google.script.run.withSuccessHandler(onSuccess)
      .nameOfFunctionInGS_File();
</script>

Загрузите Notepad ++: Notepad plus plus

И создайте свой HTML в этом формате. Затем создайте HTML-файл в своем проекте скрипта приложений.

В вашем doGet() должен быть только код, обслуживающий HTML.

Code.gs

function doGet() {

  return HtmlService.createTemplateFromFile('myHTML_File_Name_Here')
    .evaluate() // evaluate MUST come before setting the NATIVE mode
    .setTitle('Materials Form')
    .setSandboxMode(HtmlService.SandboxMode.NATIVE);
};

Создайте еще один .gs файл для работы с данными. Вот куда пойдет весь ваш код для записи данных в электронную таблицу.

Если вам нужно заполнить поля выбора, вы можете сделать это с помощью JavaScript в теге скрипта HTML.

С помощью того, что я вам дал, вы сможете создать приложение Stand Alone Apps Script HTML Service. Опубликуйте и запустите. Вероятно, вы сделали это со своим текущим проектом.

person Alan Wells    schedule 20.03.2015