La secuencia de comandos de Google (.gs) devuelve filas duplicadas

1

He creado una aplicación web CRUD basada en Googlesheet. Obtengo resultados de búsqueda duplicados cuando intento buscar en varias filas y columnas de la tabla de datos html en la aplicación web. Esto sucede cuando la prueba de búsqueda coincide con los datos de varias columnas de la misma fila. ¿Cómo puedo hacer que muestre solo resultados únicos? ¿Cómo puedo modificar mi código para buscar solo en las primeras 3 ~ 4 columnas?

Cuando intento buscar Prueba (Producto), enumera 4 filas, pero solo debería devolver 1 fila.

Fragmento adjunto.

.gs código

function searchData(formObject){  
      var result = [];
      if(formObject.searchtext){//Execute if form passes search text
          var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
          for(var i=0;i<data.length;i++){
            for(var j=0;j<data[i].length;j++){
              if(data[i][j].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
                result.push(data[i])
              }
            }
          }
      }
      return result;
    }

.js código

    function handleSearchForm(formObject) {
    google.script.run.withSuccessHandler(createTable).searchData(formObject);
    document.getElementById("search-form").reset();
  }
    <!-- SEARCH FORM-->
<form id="search-form" class="form-inline" onsubmit="handleSearchForm(this)">
  <div class="form-group mx-sm-3 mb-2">
    <label for="searchtext" class="sr-only">Search Text</label>
    <input type="search" class="form-control form-control-sm" id="searchtext" name="searchtext" placeholder="Search">
  </div>
  <button type="submit" class="btn btn-sm btn-primary mb-2">Search</button>

Intenté hacer esto, pero no ayudó.

function searchData(formObject){  
      var result = [];
      if(formObject.searchtext){//Execute if form passes search text
          var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
          for(var i=0;i<data.length;i++){
              const COLUMN_INDEX = 4;
              if(data[i][COLUMN_INDEX].toLowerCase().search(formObject.searchtext.toLowerCase())!=-1){
                result.push(data[i])
              }
          }
      }
      return result;
    }
2

De only first 3~4 columnssu pregunta, entendí que desea buscar el texto de las columnas "C" y "D". En este caso, ¿qué tal el siguiente script modificado? En esta modificación, se modifica su secuencia de comandos de Google Apps.

Guión modificado 1:

Cuando se modifica su secuencia de comandos, se convierte en lo siguiente.

function searchData(formObject){ 
  const COLUMN_INDEXES = [2, 3]; // 2 and 3 means the columns "C" and "D".
  var result = [];
  if (formObject.searchtext) {
    var data = Sheets.Spreadsheets.Values.get(globalVariables().spreadsheetId, globalVariables().dataRange).values;
    for (var i = 0; i < data.length; i++) {
      if (COLUMN_INDEXES.some(e => data[i][e].toLowerCase().includes(formObject.searchtext.toLowerCase()))) {
        result.push(data[i]);
      }
    }
  }
  return result;
}
  • Acerca de const COLUMN_INDEX = 4;en su script, en este caso, se usa la columna "E". Cuando desee comprobar las columnas "C" y "D", utilice los índices de 2y 3.

  • Si desea marcar solo la columna "D", modifique const COLUMN_INDEXES = [2, 3]a const COLUMN_INDEXES = [3].

Guión modificado 2:

En esta modificación, no se utiliza Sheets API. Establezca el nombre de la hoja y el ID de la hoja de cálculo.

function searchData(formObject) {
  const sheetName = "Sheet1"; // Please set the sheet name.
  const spreadsheetId = "###"; // Please set the Spreadsheet ID.

  const searchText = formObject.searchtext.toLowerCase();
  const result = SpreadsheetApp
    .openById(spreadsheetId)
    .getSheetByName(sheetName)
    .getDataRange()
    .getValues()
    .filter(r => [r[2], r[3]].some(c => c.toLowerCase().includes(searchText)));
  return result;
}
  • En este script modificado, searchTextse busca desde las columnas "C" y "D". Cuando el valor de searchTextse incluye en los valores de las columnas "C" y "D", se recupera la fila.

  • En este script, getDataRangese utiliza. Si desea buscar los valores de otro rango, modifique el rango del script anterior.

  • Si desea marcar solo la columna "D", modifique [r[2], r[3]].some(c => c.toLowerCase().includes(searchText)))a [r[3]].some(c => c.toLowerCase().includes(searchText))).

Nota:

Referencias:

6
  • Intenté usar el Método 1, pero no parece funcionar. Bueno, la función de búsqueda no parece funcionar ahora. después de cambiar el código. ¿Alguna idea? Lo mismo ocurre con el segundo método. 14 de oct a las 6:04
  • @ user3558255 Gracias por responder. Pido disculpas por las molestias. Desafortunadamente, no puedo replicar tu respuesta. Cuando probé mi secuencia de comandos con valores de muestra, los valores buscados se devuelven como una matriz bidimensional. Esto se debe a mi poca habilidad. Me disculpo profundamente por esto. Entonces, para comprender correctamente su problema actual, ¿puedo preguntarle sobre el flujo detallado para replicar correctamente su problema? Con esto, me gustaría intentar comprenderlo.
    Tanaike
    14 de oct a las 6:08
  • @ user3558255 Si puede hacerlo, para comprender correctamente su situación, ¿puede proporcionar la hoja de cálculo de muestra que incluya el script actual usando mi script propuesto? Con esto, me gustaría verificar su problema actual. Porque cuando probé mi script usando valores de muestra, los valores buscados se devuelven como una matriz bidimensional. Esto se debe a mi poca habilidad. Me disculpo profundamente por esto nuevamente. Por cierto, no puedo entender This is how the global variables looks like.. ¿Puedo preguntarte por el detalle del mismo?
    Tanaike
    14 de oct a las 6:10
  • Estoy intentando replicar esta aplicación: bpwebs.com/crud-operations-on-google-sheets-with-online-forms GS: script.google.com/home/projects/… 14 de octubre a las 6:13
  • @ user3558255 Ahora noté que se muestra una hoja de cálculo de muestra en la URL de presentación. Si está utilizando esta hoja de cálculo, las columnas "C" y "D" son "Sexo", "Fecha de nacimiento". ¿Quiere buscar el valor de estas columnas? Entendí que desea buscar las columnas "C" y "D" de su pregunta.
    Tanaike
    14 de oct a las 6:30