Запрос : значения автозаполнения HTML на основе выбора пользователя из выпадающего списка

#javascript #html #forms #google-apps-script #google-sheets

Вопрос:

введите описание изображения здесь

В Google листе есть поля: Имя клиента, Мобильный телефон, Электронная почта, День рождения и годовщина

Например, в Google Листе есть следующие данные : имя: прасад, мобильный телефон 9999999, электронная почта xxx@gmial.com День рождения:11/1/1990 День рождения:11/1/2020

В HTML: Имя клиента раскрывается, значения будут поступать из таблицы Google

Мне нужно, чтобы, если имя клиента выбрано из выпадающего списка, все поля заполнялись на основе выбора из Google листа

Например: если я выберу имя прасад, остальное заполнится в соответствии с таблицей Google в приведенном выше примере

 HTML Code :

<h3>Customer Details</h3>

   
 
      <label>Customer Name: : <br>
      <input list="Customer_Name"  name="Customer_Name" ></label>
      <datalist id="Customer_Name" >
      <option value="" style="display:none;"></option> 
        <?!= getVendors(); ?>
      </datalist></td> 

    
    Customer Mobie Number:<br>
    <input type="number" name="Customer_Mobie_Number">
    <br>
    
    Customer Email:<br>
    <input type="email" name="Customer_Email">
    <br>
    
   Birthday Date:<br>
    <input type="date" name="Birthday">
    <br>


JS:

    function getVendors() {
      var active = SpreadsheetApp.getActive();
      var sheet = active.getSheetByName("Cus_Details");
      var lastRow = sheet.getLastRow();
      var myRange = sheet.getRange("A2:A"   lastRow); 
      var data    = myRange.getValues();
      var optionsHTML = "";
      for (var i = 0; i < data.length; i =1) {
        optionsHTML  = '<option>'   data[i][0]   '</option>';
      };
      return optionsHTML;
    }
 

Ответ №1:

Я считаю, что ваша цель заключается в следующем.

  • Когда раскрывающийся список «Customer_Name» изменяется, вы хотите извлечь значения из строки и поместить в каждый входной тег Mobile,Email,Birthday,anniversary .
  • Ваша электронная таблица имеет заголовок Customer Name,Mobile,Email,Birthday,anniversary .

В этом случае, как насчет следующей модификации?

Сторона HTML и Javascript:

 <h3>Customer Details</h3>
<label>Customer Name: : <br>
  <input list="Customer_Name" id="list" name="Customer_Name"></label>
<datalist id="Customer_Name">
  <option value="" style="display:none;"></option>
  <?!= getVendors(); ?>
</datalist></td>
Customer Mobie Number:<br>
<input type="number" id="Customer_Mobie_Number" name="Customer_Mobie_Number">
<br>
Customer Email:<br>
<input type="email" id="Customer_Email" name="Customer_Email">
<br>
Birthday Date:<br>
<input type="date" id="Birthday" name="Birthday">
<br>
Anniversary Date:<br>
<input type="date" id="Anniversary" name="Anniversary">
<br>
<script>
  document.getElementById("list").addEventListener("change", setValues);

  function setValues(e) {
    google.script.run.withSuccessHandler(([b, c, d, e]) => {
      document.getElementById("Customer_Mobie_Number").value = b;
      document.getElementById("Customer_Email").value = c;
      document.getElementById("Birthday").value = d;
      document.getElementById("Anniversary").value = e;
    }).getValues(e.target.value);
  }
</script>
 

Сторона сценария Google Apps:

 function getValues(e) {
  var active = SpreadsheetApp.getActive();
  var sheet = active.getSheetByName("Cus_Details");
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A2:A"   lastRow).createTextFinder(e).matchEntireCell(true).findNext();
  return range.offset(0, 1, 1, 4).getValues()[0].map(e => e instanceof Date ? e.toISOString().split("T")[0] : e);
}
 

Примечание:

  • Когда я увидел ваш HTML и ваше образцовое изображение, мне показалось, что «Дата годовщины» и теги ниже «Дата годовщины». Поэтому в этом ответе я добавил входной тег для «Дата годовщины». Это изменение является примером измененного сценария. Поэтому, пожалуйста, измените это для вашей реальной ситуации.

Добавлен:

О следующем вашем ответе,

спасибо за ваше время, это работает так, как я просил, но когда DOB или универсальное копирование с листа Google в поле происходит на один день меньше (например:14.08.1990 в листе, при вводе он приходит 13.08.1990)

В этом случае, как насчет изменения приведенного выше сценария getValues(e) следующим образом.

От:

 return range.offset(0, 1, 1, 4).getValues()[0].map(e => e instanceof Date ? e.toISOString().split("T")[0] : e);
 

Для:

 return range.offset(0, 1, 1, 4).getValues()[0].map(e => e instanceof Date ? Utilities.formatDate(e, Session.getScriptTimeZone(), "yyyy-MM-dd") : e);
 

или

 return range.offset(0, 1, 1, 4).getValues()[0].map(e => e instanceof Date ? Utilities.formatDate(e, active.getSpreadsheetTimeZone(), "yyyy-MM-dd") : e);
 

Комментарии:

1. спасибо за ваше время, это работает так, как я просил, но когда DOB или универсальное копирование с листа Google в поле происходит на один день меньше (например:14.08.1990 в листе, при вводе он приходит 13.08.1990)

2. @Дурга Прасад Спасибо, что ответили. Я приношу извинения за причиненные неудобства. В этом случае я думаю, что причина проблемы может быть связана с часовым поясом электронной таблицы и скриптом Google Apps. Для этого я добавил точку изменения в предложенный мной сценарий. Не могли бы вы, пожалуйста, подтвердить это? Если это был не тот результат, которого вы ожидали, я еще раз приношу свои извинения.

3. Синтаксическая ошибка: Синтаксическая ошибка. строка: 31 файл: Файл загрузки , ( код строки 31 : диапазон возврата.смещение(0, 1, 1, 4).getValues()[0].карта(e => e экземпляр даты ? Utilities.formatDate(e, active.getSpreadsheetTimeZone(), «гггг-ММ-дд») : e); ) в сценарии я отключаю среду выполнения Chrome V8 , в этом, я думаю, проблема, есть ли способ запустить код без включения V8 (я не могу включить, почему, потому что я загружаю изображения из html-формы на диск, если я включаю файлы ошибок загрузки изображений v8, поэтому…

4. Спасибо, что ответили. Я приношу извинения за причиненные неудобства. О in script i disable Chrome V8 runtime , в таком случае, как насчет того, чтобы изменить его на return range.offset(0, 1, 1, 4).getValues()[0].map(function(e) {return e instanceof Date ? Utilities.formatDate(e, Session.getScriptTimeZone(), "yyyy-MM-dd") : e}); или return range.offset(0, 1, 1, 4).getValues()[0].map(function(e) {return e instanceof Date ? Utilities.formatDate(e, active.getSpreadsheetTimeZone(), "yyyy-MM-dd") : e}); ? Если это был не тот результат, которого вы ожидали, я приношу свои извинения.