¿Cómo filtrar datos en columnas de Google Sheets con parámetro de URL en Google Script?

Nov 23 2020

Estoy probando Google Script y quiero mostrar datos basados ​​en parámetros de palabras clave que luego se referirán a la Columna C como un filtro de datos que se mostrará de acuerdo con lo que se busque en la palabra clave del parámetro.

Por ejemplo, en mi proyecto anterior tenía un parámetro como paginación

?page=1&limit=10

bueno, ahora tengo un nuevo problema que resolver que es tanto la búsqueda como la paginación, tengo la columna b como referencia para la búsqueda

?page=1&limit=10&search=San Andreas

¿Cómo implemento el siguiente código?

function doGet(e) {
  var page = e.parameter.page || 1;
  var limit = e.parameter.limit || 10;
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
  var sheet = ss.getSheetByName("list_film");
  return getUsers(sheet, page, limit); 
}

function getUsers(sheet, page, limit){
  var rows = sheet.getDataRange().getValues();
  var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
  var jo = {};
  jo.user = dataArray;
  var result = JSON.stringify(jo);
  return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}

Editar:

Me refiero a la columna C

Editar para resuelto:

¡Quiero agradecer a @Tanaike que me ayudó tanto!

Aquí está mi código final

function doGet(e) {
 var page = e.parameter.page || 1;
  var limit = e.parameter.limit || 10;
  var search = e.parameter.search || "";
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
  var sheet = ss.getSheetByName("list_film");
  return getUsers(sheet, page, limit, search);
}

function getUsers(sheet, page, limit, search){
  var lowCase = search.toString().toLowerCase();
  var rows = sheet.getDataRange().getValues().filter(([,,c]) => c.toString().toLowerCase().includes(lowCase));
  var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
  var jo = {};
  jo.user = dataArray;
  var result = JSON.stringify(jo);
  return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}

Respuestas

2 Tanaike Nov 23 2020 at 07:51

Creo que su objetivo es el siguiente.

  • Desea recuperar los valores de la hoja "list_film" de Spreadsheet SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111").
  • Desea recuperar los valores buscando el valor de searchen la columna "B".

Puntos de modificación:

  • A partir e.parameter.page, e.parameter.limity ?page=1&limit=10&search=San Andreasen su script, he entendido que está utilizando Web Apps.
  • En este caso, se requiere el uso San Andreasde ?page=1&limit=10&search=San Andreaslike e.parameter.search.
  • Me gustaría proponer modificar sheet.getDataRange().getValues()en getUsersañadiendo filter. Es comosheet.getDataRange().getValues().filter(([,b]) => b == search)

Cuando los puntos anteriores se reflejan en su guión, se convierte en lo siguiente.

Guión modificado:

  var page = e.parameter.page || 1;
  var limit = e.parameter.limit || 10;
  var search = e.parameter.search || "";
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
  var sheet = ss.getSheetByName("list_film");
  return getUsers(sheet, page, limit, search); 
}

function getUsers(sheet, page, limit, search){
  var rows = sheet.getDataRange().getValues().filter(([,b]) => b == search);
  var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
  var jo = {};
  jo.user = dataArray;
  var result = JSON.stringify(jo);
  return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
  • En este caso, cuando se solicita https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas, San Andreasse busca desde la columna "B" de la hoja "list_film" y se devuelven las filas que son iguales a San Andreas.
    • Si desea recuperar los valores incluidos search, utilice en b.toString().includes(search)lugar de b == search.

Nota:

  • Cuando modificó el script de las aplicaciones web, vuelva a implementar las aplicaciones web como una nueva versión. De esta forma, la última secuencia de comandos se refleja en las aplicaciones web. Tenga cuidado con esto.

  • Aunque no estoy seguro acerca de los valores de la columna "B", si el script anterior no era el resultado que esperas, intenta modificar sheet.getDataRange().getValues().filter(([,b]) => b == search)a sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)una y otra vez prueba de ello.

  • Si desea comparar con otra columna en lugar de la columna "B", por ejemplo, cuando desea comparar el valor de searchcon la columna "C", modifique filter(([,b]) => b == search)a filter(([,,c]) => c == search).

Referencias:

  • filtrar()
  • incluye ()

Adicional:

Puntos de modificación:

  • De la my last codesiguiente manera, se descubrió que mi secuencia de comandos sugerida no se usó correctamente.

       function doGet(e) {
       var page = e.parameter.page || 1;
        var limit = e.parameter.limit || 10;
        var search = e.parameter.search || "";
        var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
        var sheet = ss.getSheetByName("list_film");
        return getUsers(sheet, page, limit, search); 
      }
    
      function getUsers(sheet, page, limit, search){
        var rows = sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search);
        var rows = sheet.getDataRange().getValues().slice(1);
        var rows = sheet.getDataRange().getValues().reverse();
        var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
        var jo = {};
        jo.user = dataArray;
        var result = JSON.stringify(jo);
        return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
      }
    
  • En var rows = sheet.getDataRange().getValues().slice(1);y var rows = sheet.getDataRange().getValues().reverse();, los valores se recuperan mediante sheet.getDataRange().getValues(). Por esto, los valores no se filtran. Creo que esta es la razón de su problema actual.

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

Guión modificado:

function doGet(e) {
 var page = e.parameter.page || 1;
  var limit = e.parameter.limit || 10;
  var search = e.parameter.search || "";
  var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111");
  var sheet = ss.getSheetByName("list_film");
  return getUsers(sheet, page, limit, search);
}

function getUsers(sheet, page, limit, search){
  var rows = sheet.getDataRange().getDisplayValues().filter(([,,c]) => c == search);
  var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
  var jo = {};
  jo.user = dataArray;
  var result = JSON.stringify(jo);
  return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
}
  • Si desea eliminar la primera fila de encabezado y devolver los valores invertidos, modifique la función de la getUserssiguiente manera.

      function getUsers(sheet, page, limit, search){
        var rows = sheet.getDataRange().getValues().slice(1).filter(([,,c]) => c == search).reverse();
        var dataArray = rows.splice(limit * (page - 1), limit).reduce((ar, [a, b, c, d]) => ar.concat({id: a, year: b, title: c, img: d}), []);
        var jo = {};
        jo.user = dataArray;
        var result = JSON.stringify(jo);
        return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);
      }