Jak filtrować dane w kolumnowych arkuszach Google za pomocą parametru adresu URL w skrypcie Google?

Nov 23 2020

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

2 Tanaike Nov 23 2020 at 07:51

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ść searchz kolumny „B”.

Punkty modyfikacji:

  • Z e.parameter.page, e.parameter.limita ?page=1&limit=10&search=San Andreasw skrypcie, zrozumiałem, że używasz Web Apps.
  • W tym przypadku, to jest wymagane do korzystania San Andreasz ?page=1&limit=10&search=San Andreasniczym e.parameter.search.
  • Chciałbym zaproponować, aby zmodyfikować sheet.getDataRange().getValues()w getUsersdodając filter. 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 Andreasjest przeszukiwana z kolumny „B” arkusza „list_film” i San Andreaszwracane są wiersze, które są takie same .
    • Jeśli chcesz pobrać wartości, w tym search, użyj b.toString().includes(search)zamiast b == search.

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), aby sheet.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ść searchz kolumną „C”, zmień filter(([,b]) => b == search)na filter(([,,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);i var rows = sheet.getDataRange().getValues().reverse();wartości są pobierane przy użyciu sheet.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ę getUsersw 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);
      }