Пропуск полей без значения - PullRequest
3 голосов
/ 08 октября 2019

Мне нужно опубликовать результат экзамена из листа Google. Кнопка поиска показывает метки, полученные отлично, если в поле указано значение «Нет», но мне нужно пропустить поля без значения, такие как Тема 3, 5 и т. Д. С их текстовым полем на html-странице

Здесь - это лист, который я использую, и код, который я использую ...

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('index')
       .setSandboxMode(HtmlService.SandboxMode.IFRAME)
       .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

//Search for the id and return the array for that row
function search(id) {
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/16IH3yKJjLwM9XA0c4_BN5MVQSKh8hV7gR6_kLLfe8to/edit#gid=0");
  var sheet = ss.getSheetByName("Sheet1");
  var values = sheet
  .getDataRange()
  .getValues()
  .filter(function(row) {
    return row[0] == id;
  });

   return values[0];
}
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
    .hidden {
     display:none;
     }
    </style>
  </head>
  <body>
  <input type="text" id="txtName"/>
  <button id="show">SHOW</button>
  <h1>FMATS</h1>
    Name <input type="text" id="name"/><br>
    Roll <input type="text" id="roll"/><br>
    Subject 1 <input type="text" id="sub1"/><br>
    Subject 2 <input type="text" id="sub2"/><br>
    Subject 3 <input type="text" id="sub3"/><br>
    Subject 4 <input type="text" id="sub4"/><br>
    Subject 5 <input type="text" id="sub5"/><br>
  </body>
<script>
//When click on show button it will run search function
window.onload = function(e){ 
  document.getElementById('show')
    .addEventListener('click', search);
}

//Get the value for txtName input and run search function in code.gs
function search() {
  var txtName = document.getElementById('txtName').value;
  google.script.run.withSuccessHandler(fillInfo).withFailureHandler(function (e) { console.log(e) }).search(txtName);
}

//It will run when a success response comes from search function in code.gs and updates the input with the sheet info
function fillInfo(values) {
  document.getElementById('name').value = values[1];
  document.getElementById('roll').value = values[0];
  for (var i=0;i<values.length-2;i++) {
    if (values[i+2]==null) {
      toggleElement("sub"+i);
    } else {
      document.getElementById("sub"+i).value = values[i+2];
    }
  }  
  //rest of the code here
  document.getElementById('name').value = values[1];
  document.getElementById('roll').value = values[0];
  document.getElementById('sub1').value = values[2];
  document.getElementById('sub2').value = values[3];
  document.getElementById('sub3').value = values[4];
  document.getElementById('sub4').value = values[5];
  document.getElementById('sub5').value = values[6];
}
</script>
</html>

Мне нужно опустить имя субъекта и текстовое поле без значения со страницы HTML. И «Ничего не найдено» должно быть показано, если в списке найден результат, которого нет в таблице. Это не обязательно, но будет хорошо, если имена субъектов взяты из строки 1 листа.

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

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Есть два способа сделать это:

  1. Создать свой HTML на стороне сервера (как сказал @ Cooper )
  2. Управлять вашим HTML с помощьюJavaScript

Чтобы создать свой HTML на стороне сервера, вы можете использовать строку и автоматически «написать» HTML.

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

//It will run when a success response comes from search function in code.gs and updates the input with the sheet info
function fillInfo(response) {
  document.getElementById("divid").innerHTML=html
});

Если вы абсолютно хотите манипулировать HTML на стороне клиента, вы будете использовать что-то вроде этого:

function toggleElement(id) {
  var td = document.getElementById(id).parentElement;
  var tr = td.parentElement;
  tr.classList.toggle("hidden");
}

использование примерно так:

function fillInfo(values) {
  document.getElementById('name').value = values[1];
  document.getElementById('roll').value = values[0];
  for (var i=0;i<values.length-2;i++) {
    if (values[i+2]==null) {
      toggleElement("sub"+i);
    } else {
      document.getElementById("sub"+i).value = values[i+2];
    }
  }  
  //rest of the code here
}

итогда у вас будет несколько CSS, которые делают это:

.hidden {
  display:none;
}

Редактировать:

Вот как вы реализуете первое решение:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
  <input type="text" id="txtName"/>
  <button id="show">SHOW</button>
  <h1>FMATS</h1>
  <div id="dataDiv"></div>
  </body>
<script>
//When click on show button it will run search function
window.onload = function(e){ 
  document.getElementById('show')
    .addEventListener('click', search);
}

//Get the value for txtName input and run search function in code.gs
function search() {
  var txtName = document.getElementById('txtName').value;
  google.script.run.withSuccessHandler(fillInfo).withFailureHandler(function (e) { console.log(e) }).search(txtName);
}

//It will run when a success response comes from search function in code.gs and updates the input with the sheet info
function fillInfo(values) {
  console.log(values);
  document.getElementById("dataDiv").innerHTML=values
}
</script>
</html>
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('index')
       .setSandboxMode(HtmlService.SandboxMode.IFRAME)
       .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

//Search for the id and return the array for that row
function search(id) {
  var ss = SpreadsheetApp.openByUrl("SHEETS URL");
  var sheet = ss.getSheetByName("Sheet1");
  var values = sheet
  .getDataRange()
  .getValues()
  .filter(function(row) {
    return row[0] == id;
  })[0];
  var legends = sheet.getRange(1,1,1,sheet.getMaxColumns()).getValues()[0];
  return createHTML(legends, values);
}

function createHTML(legends, values) {
  Logger.log(legends);
  var htmlResult = "";
  for (var i=0; i<values.length; i++) {
    if (values[i]!=null && values[i]!=="") {
      htmlResult += '<div class="field">' + (legends[i]+"").replace("Sub", "Subject ") + '<input type="text" id="sub1" value="'+values[i]+'"></div>';
    }
  }
  return htmlResult;
}

Надеюсь, этопомогает!

0 голосов
/ 09 октября 2019

Вот простой пример полного решения вашей проблемы, выполненного в основном на стороне сервера.

Мне нравится делать это таким образом, потому что мне нравится иметь возможность использовать Utilities.formatString ().

Функции сервера: Файл: aq3.gs:

function search(sObj) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var hA=vA[0];
  var dObj={dA:[]};
  for(var i=1;i<vA.length;i++) {
    if(vA[i][0]==sObj.roll) {
      var row=vA[i];
      for(var j=0;j<hA.length;j++) {
        dObj[hA[j]]=row[j];
      }
      break;
    }
  }
  var html="<style>input{margin:2px 5px 0 2px}</style>";
  for(var i=0;i<row.length;i++) {
    if(dObj[hA[i]]) {
      html+=Utilities.formatString('<br /><input id="txt-%s" type="text" value="%s" /><label for="txt-%s">%s</label>',i,dObj[hA[i]],i,hA[i]);
    }
  }
  sObj['results']=html;
  return sObj;
}

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

function launchExamResultsSearchDialog() {
  var userInterface=HtmlService.createHtmlOutputFromFile('aq5');
  SpreadsheetApp.getUi().showModelessDialog(userInterface, "Exam Results");
}

html: File: aq5.html:

<!DOCTYPE html>
<html>
  <head>
  <base target="_top">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
    function search() {
      var text=$('#srchtext').val();
      google.script.run
      .withSuccessHandler(function(sObj) {
        document.getElementById("results").innerHTML=sObj.results;
      })
      .search({roll:text});
    }

    console.log("My Code");
  </script>
  </head>  
  <body>
    <input type="text" id="srchtext" /><input type="button" value="Search" onClick="search();" />
    <div id="results"></div>
  </body>
</html>

Вот как выглядит диалоговое окно:

Вы можете просто изменить номер поискового ролика, и диалоговое окно заменит данные новыми данными. Вы можете контролировать предметы, изменяя заголовки.

enter image description here

enter image description here

enter image description here

enter image description here

Связь клиент-сервер

Utilities.formatString ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...