Comment filtrer les données dans la colonne Google Sheets avec le paramètre URL dans Google Script?
J'essaie Google Script et je souhaite afficher des données basées sur des paramètres de mot-clé qui se référeront plus tard à la colonne C comme un filtre de données qui sera affiché en fonction de ce qui est recherché dans le mot-clé du paramètre.
Par exemple dans mon projet précédent j'avais un paramètre comme pagination
?page=1&limit=10
Eh bien maintenant j'ai un nouveau problème à résoudre qui est à la fois la recherche et la pagination, j'ai la colonne b comme référence pour la recherche
?page=1&limit=10&search=San Andreas
Comment implémenter le code ci-dessous?
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);
}
Éditer:
Je veux dire la colonne C
Modifier pour résolu:
Je veux dire merci à @Tanaike qui m'a tellement aidé!
Voici mon code 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);
}
Réponses
Je crois que votre objectif est le suivant.
- Vous souhaitez récupérer les valeurs de la feuille "list_film" de Spreadsheet
SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111")
. - Vous souhaitez récupérer les valeurs en recherchant la valeur de
search
dans la colonne "B".
Points de modification:
- De
e.parameter.page
,e.parameter.limit
et?page=1&limit=10&search=San Andreas
dans votre script, je compris que vous utilisez Web Apps. - Dans ce cas, il est nécessaire d'utiliser
San Andreas
des éléments?page=1&limit=10&search=San Andreas
similairese.parameter.search
. - Je voudrais proposer de modifier
sheet.getDataRange().getValues()
engetUsers
ajoutantfilter
. C'est commesheet.getDataRange().getValues().filter(([,b]) => b == search)
Lorsque les points ci-dessus sont reflétés dans votre script, cela devient comme suit.
Script modifié:
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);
}
- Dans ce cas, quand il demande à
https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas
,San Andreas
est recherché à partir de la colonne "B" de la feuille "list_film" et les lignes, qui sont les mêmes avecSan Andreas
, sont retournées.- Si vous souhaitez récupérer les valeurs y compris
search
, veuillez utiliser à lab.toString().includes(search)
place deb == search
.
- Si vous souhaitez récupérer les valeurs y compris
Remarque:
Lorsque vous avez modifié le script des applications Web, veuillez redéployer les applications Web en tant que nouvelle version. Ainsi, le dernier script est reflété dans les applications Web. Veuillez faire attention à cela.
Bien que je ne suis pas sûr sur les valeurs de la colonne « B », si le script ci - dessus n'était pas le résultat que vous attendez, s'il vous plaît essayer de modifier
sheet.getDataRange().getValues().filter(([,b]) => b == search)
àsheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)
et tester à nouveau.Si vous souhaitez comparer avec une autre colonne au lieu de la colonne "B", par exemple, lorsque vous souhaitez comparer la valeur de
search
avec la colonne "C", veuillez modifierfilter(([,b]) => b == search)
enfilter(([,,c]) => c == search)
.
Références:
- filtre()
- comprend ()
Ajoutée:
Points de modification:
De votre my last codecomme suit, il a été constaté que mon script suggéré n'était pas correctement utilisé.
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); }
À
var rows = sheet.getDataRange().getValues().slice(1);
etvar rows = sheet.getDataRange().getValues().reverse();
, les valeurs sont récupérées à l'aide desheet.getDataRange().getValues()
. De cette manière, les valeurs ne sont pas filtrées. Je pense que c'est la raison de votre problème actuel.
Lorsque votre script actuel est modifié, il devient comme suit.
Script modifié:
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 vous souhaitez supprimer la 1ère ligne d'en-tête et renvoyer les valeurs inversées, veuillez modifier la fonction
getUsers
comme suit.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); }