Como filtrar dados em colunas do Planilhas Google com parâmetro de URL no Google Script?

Nov 23 2020

Estou tentando o Google Script e quero exibir dados com base em parâmetros de palavra-chave que mais tarde se referirão à coluna C como um filtro de dados que será exibido de acordo com o que é pesquisado na palavra-chave do parâmetro.

Por exemplo, em meu projeto anterior eu tinha um parâmetro como paginação

?page=1&limit=10

bem, agora eu tenho um novo problema para resolver que é pesquisa e paginação, tenho a coluna b como referência para a pesquisa

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

Como faço para implementar o código abaixo?

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

Editar:

Quero dizer coluna C

Editar para resolvido:

Quero agradecer a @Tanaike que me ajudou tanto!

Aqui está meu código 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);
}

Respostas

2 Tanaike Nov 23 2020 at 07:51

Eu acredito em seu objetivo da seguinte maneira.

  • Você deseja recuperar os valores da planilha "list_film" da planilha SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111").
  • Você deseja recuperar os valores pesquisando o valor de searchna coluna "B".

Pontos de modificação:

  • A partir e.parameter.page, e.parameter.limite ?page=1&limit=10&search=San Andreasem seu script, eu entendi que você está usando Web Apps.
  • Neste caso, é necessário o uso San Andreasde ?page=1&limit=10&search=San Andreaslike e.parameter.search.
  • Eu gostaria de propor modificar sheet.getDataRange().getValues()em getUsersadicionando filter. É comosheet.getDataRange().getValues().filter(([,b]) => b == search)

Quando os pontos acima são refletidos em seu script, torna-se o seguinte.

Script modificado:

  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);
}
  • Neste caso, quando solicita https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas, San Andreasé pesquisado na coluna "B" da planilha "list_film" e as linhas, que são iguais com San Andreas, são retornadas.
    • Se você deseja recuperar os valores incluindo search, use em b.toString().includes(search)vez de b == search.

Nota:

  • Quando você modificou o script de Web Apps, reimplante os Web Apps como uma nova versão. Com isso, o script mais recente é refletido nos Web Apps. Por favor, tome cuidado com isso.

  • Embora eu não tenha certeza sobre os valores da coluna "B", se o script acima não foi o resultado que você esperava, tente modificá sheet.getDataRange().getValues().filter(([,b]) => b == search)- sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)lo e testá-lo novamente.

  • Se você deseja comparar com outra coluna em vez da coluna "B", por exemplo, quando você deseja comparar o valor de searchcom a coluna "C", modifique filter(([,b]) => b == search)para filter(([,,c]) => c == search).

Referências:

  • filtro()
  • inclui ()

Adicionado:

Pontos de modificação:

  • Do my last codeseguinte modo, descobriu-se que meu script sugerido não foi usado corretamente.

       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);
      }
    
  • Em var rows = sheet.getDataRange().getValues().slice(1);e var rows = sheet.getDataRange().getValues().reverse();, os valores são recuperados usando sheet.getDataRange().getValues(). Por isso, os valores não são filtrados. Acho que esse é o motivo do seu problema atual.

Quando seu script atual é modificado, ele se torna da seguinte maneira.

Script modificado:

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);
}
  • Se você deseja remover a primeira linha do cabeçalho e retornar os valores invertidos, modifique a função da getUsersseguinte forma.

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