Comment filtrer les données dans la colonne Google Sheets avec le paramètre URL dans Google Script?

Nov 23 2020

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

2 Tanaike Nov 23 2020 at 07:51

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 searchdans la colonne "B".

Points de modification:

  • De e.parameter.page, e.parameter.limitet ?page=1&limit=10&search=San Andreasdans votre script, je compris que vous utilisez Web Apps.
  • Dans ce cas, il est nécessaire d'utiliser San Andreasdes éléments ?page=1&limit=10&search=San Andreassimilaires e.parameter.search.
  • Je voudrais proposer de modifier sheet.getDataRange().getValues()en getUsersajoutant filter. 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 Andreasest recherché à partir de la colonne "B" de la feuille "list_film" et les lignes, qui sont les mêmes avec San Andreas, sont retournées.
    • Si vous souhaitez récupérer les valeurs y compris search, veuillez utiliser à la b.toString().includes(search)place de b == search.

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 searchavec la colonne "C", veuillez modifier filter(([,b]) => b == search)en filter(([,,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);et var rows = sheet.getDataRange().getValues().reverse();, les valeurs sont récupérées à l'aide de sheet.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 getUserscomme 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);
      }