¿Cómo filtrar datos en columnas de Google Sheets con parámetro de URL en Google Script?
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
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 Andreaslikee.parameter.search. - Me gustaría proponer modificar
sheet.getDataRange().getValues()engetUsersañadiendofilter. 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 aSan Andreas.- Si desea recuperar los valores incluidos
search, utilice enb.toString().includes(search)lugar deb == search.
- Si desea recuperar los valores incluidos
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)asheet.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", modifiquefilter(([,b]) => b == search)afilter(([,,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);yvar rows = sheet.getDataRange().getValues().reverse();, los valores se recuperan mediantesheet.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); }