Jak filtrować dane w kolumnowych arkuszach Google za pomocą parametru adresu URL w skrypcie Google?
Próbuję Google Script i chcę wyświetlić dane w oparciu o parametry słów kluczowych, które później będą odnosić się do kolumny C jako filtr danych, który będzie wyświetlany zgodnie z tym, czego szuka się w słowie kluczowym parametru.
Na przykład w moim poprzednim projekcie miałem parametr jako paginację
?page=1&limit=10
cóż, teraz mam nowy problem do rozwiązania, który jest zarówno wyszukiwaniem, jak i paginacją, mam kolumnę b jako odniesienie do wyszukiwania
?page=1&limit=10&search=San Andreas
Jak zaimplementować poniższy kod?
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);
}
Edytować:
Mam na myśli kolumnę C.
Edytuj, aby rozwiązać:
Chcę podziękować @Tanaike, która tak bardzo mi pomogła!
Oto mój ostateczny kod
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);
}
Odpowiedzi
Wierzę, że twój cel jest następujący.
- Chcesz pobrać wartości z arkusza „list_film” arkusza kalkulacyjnego
SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111")
. - Chcesz pobrać wartości, wyszukując wartość
search
z kolumny „B”.
Punkty modyfikacji:
- Z
e.parameter.page
,e.parameter.limit
a?page=1&limit=10&search=San Andreas
w skrypcie, zrozumiałem, że używasz Web Apps. - W tym przypadku, to jest wymagane do korzystania
San Andreas
z?page=1&limit=10&search=San Andreas
niczyme.parameter.search
. - Chciałbym zaproponować, aby zmodyfikować
sheet.getDataRange().getValues()
wgetUsers
dodającfilter
. To jest jaksheet.getDataRange().getValues().filter(([,b]) => b == search)
Kiedy powyższe punkty zostaną odzwierciedlone w twoim skrypcie, wygląda to następująco.
Zmodyfikowany skrypt:
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);
}
- W tym przypadku, gdy zażąda
https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas
,San Andreas
jest przeszukiwana z kolumny „B” arkusza „list_film” iSan Andreas
zwracane są wiersze, które są takie same .- Jeśli chcesz pobrać wartości, w tym
search
, użyjb.toString().includes(search)
zamiastb == search
.
- Jeśli chcesz pobrać wartości, w tym
Uwaga:
Po zmodyfikowaniu skryptu aplikacji internetowych należy ponownie wdrożyć aplikacje internetowe jako nową wersję. W ten sposób najnowszy skrypt jest odzwierciedlany w aplikacjach internetowych. Proszę, uważaj na to.
Chociaż nie jestem pewien o wartości kolumnie „B”, jeśli powyższy scenariusz nie był wynikiem można się spodziewać, spróbuj zmodyfikować
sheet.getDataRange().getValues().filter(([,b]) => b == search)
, abysheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)
i przetestować go ponownie.Jeśli chcesz porównać z inną kolumną zamiast kolumny „B”, na przykład, gdy chcesz porównać wartość
search
z kolumną „C”, zmieńfilter(([,b]) => b == search)
nafilter(([,,c]) => c == search)
.
Bibliografia:
- filtr()
- zawiera ()
Dodany:
Punkty modyfikacji:
Z twoich my last codeponiższych wyników wynika, że mój sugerowany skrypt nie został poprawnie użyty.
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); }
W
var rows = sheet.getDataRange().getValues().slice(1);
ivar rows = sheet.getDataRange().getValues().reverse();
wartości są pobierane przy użyciusheet.getDataRange().getValues()
. W ten sposób wartości nie są filtrowane. Myślę, że to jest powód twojego obecnego problemu.
Kiedy twój bieżący skrypt jest modyfikowany, wygląda to następująco.
Zmodyfikowany skrypt:
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);
}
Jeśli chcesz usunąć pierwszy wiersz nagłówka i zwrócić odwrócone wartości, zmodyfikuj funkcję
getUsers
w następujący sposób.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); }