Wie filtere ich Daten in Google Sheets-Spalten mit URL-Parametern in Google Script?

Nov 23 2020

Ich versuche es mit Google Script und möchte Daten basierend auf Schlüsselwortparametern anzeigen, die später auf Spalte C als Datenfilter verweisen, der entsprechend der Suche im Parameterschlüsselwort angezeigt wird.

Zum Beispiel hatte ich in meinem vorherigen Projekt einen Parameter als Paginierung

?page=1&limit=10

Nun habe ich ein neues Problem zu lösen, das sowohl Suche als auch Paginierung ist. Ich habe Spalte b als Referenz für die Suche

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

Wie implementiere ich den folgenden Code?

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);
}

Bearbeiten:

Ich meine Spalte C.

Bearbeiten für gelöst:

Ich möchte mich bei @Tanaike bedanken, die mir so sehr geholfen hat!

Hier ist mein endgültiger Code

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);
}

Antworten

2 Tanaike Nov 23 2020 at 07:51

Ich glaube Ihr Ziel wie folgt.

  • Sie möchten die Werte aus dem Blatt "list_film" der Tabelle abrufen SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111").
  • Sie möchten die Werte abrufen, indem Sie den Wert von searchaus der Spalte "B" suchen .

Änderungspunkte:

  • Aus e.parameter.page, e.parameter.limitund ?page=1&limit=10&search=San Andreasin Ihrem Skript, verstand ich , dass Sie Web - Apps verwenden.
  • In diesem Fall ist die Verwendung San Andreasvon ?page=1&limit=10&search=San Andreaslike erforderlich e.parameter.search.
  • Ich möchte zu ändern vorzuschlagen sheet.getDataRange().getValues()in getUsersdurch Zugabe filter. Es ist wiesheet.getDataRange().getValues().filter(([,b]) => b == search)

Wenn die oben genannten Punkte in Ihrem Skript wiedergegeben werden, sieht es wie folgt aus.

Geändertes Skript:

  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);
}
  • In diesem Fall, wenn sie anfordert https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas, San Andreaswird von der Säule „B“ von sheet „list_film“ durchsucht und den Zeilen, die mit dem gleichen sind San Andreas, zurückgegeben werden.
    • Wenn Sie die Werte einschließlich abrufen möchten search, verwenden Sie bitte b.toString().includes(search)anstelle von b == search.

Hinweis:

  • Wenn Sie das Skript von Web Apps geändert haben, stellen Sie die Web Apps erneut als neue Version bereit. Auf diese Weise wird das neueste Skript in den Web Apps wiedergegeben. Bitte seien Sie vorsichtig.

  • Obwohl ich mir bei den Werten der Spalte "B" nicht sicher bin, versuchen Sie, das obige Skript nicht zu dem erwarteten Ergebnis zu ändern sheet.getDataRange().getValues().filter(([,b]) => b == search), sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)und testen Sie es erneut.

  • Wenn Sie mit einer anderen Spalte anstelle der Spalte "B" vergleichen möchten, z. B. wenn Sie den Wert von searchmit der Spalte "C" vergleichen möchten , ändern Sie dies bitte filter(([,b]) => b == search)in filter(([,,c]) => c == search).

Verweise:

  • Filter()
  • beinhaltet ()

Hinzugefügt:

Änderungspunkte:

  • Aus Ihren my last codefolgenden Gründen wurde festgestellt, dass mein vorgeschlagenes Skript nicht korrekt verwendet wurde.

       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);
      }
    
  • Bei var rows = sheet.getDataRange().getValues().slice(1);und var rows = sheet.getDataRange().getValues().reverse();werden die Werte mit abgerufen sheet.getDataRange().getValues(). Dadurch werden die Werte nicht gefiltert. Ich denke, dass dies der Grund für Ihre aktuelle Ausgabe ist.

Wenn Ihr aktuelles Skript geändert wird, sieht es wie folgt aus.

Geändertes Skript:

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);
}
  • Wenn Sie die erste Kopfzeile entfernen und die umgekehrten Werte zurückgeben möchten, ändern Sie die Funktion getUserswie folgt.

      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);
      }