Wie filtere ich Daten in Google Sheets-Spalten mit URL-Parametern in Google Script?
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
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
search
aus der Spalte "B" suchen .
Änderungspunkte:
- Aus
e.parameter.page
,e.parameter.limit
und?page=1&limit=10&search=San Andreas
in Ihrem Skript, verstand ich , dass Sie Web - Apps verwenden. - In diesem Fall ist die Verwendung
San Andreas
von?page=1&limit=10&search=San Andreas
like erforderliche.parameter.search
. - Ich möchte zu ändern vorzuschlagen
sheet.getDataRange().getValues()
ingetUsers
durch Zugabefilter
. 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 Andreas
wird von der Säule „B“ von sheet „list_film“ durchsucht und den Zeilen, die mit dem gleichen sindSan Andreas
, zurückgegeben werden.- Wenn Sie die Werte einschließlich abrufen möchten
search
, verwenden Sie bitteb.toString().includes(search)
anstelle vonb == search
.
- Wenn Sie die Werte einschließlich abrufen möchten
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
search
mit der Spalte "C" vergleichen möchten , ändern Sie dies bittefilter(([,b]) => b == search)
infilter(([,,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);
undvar rows = sheet.getDataRange().getValues().reverse();
werden die Werte mit abgerufensheet.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
getUsers
wie 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); }