Google Script의 URL 매개 변수를 사용하여 Google 시트 열의 데이터를 필터링하는 방법은 무엇입니까?

Nov 23 2020

Google Script를 사용하고 있는데 나중에 매개 변수 키워드에서 검색된 내용에 따라 표시되는 데이터 필터로 C 열을 참조하는 키워드 매개 변수를 기반으로 데이터를 표시하고 싶습니다.

예를 들어 이전 프로젝트에서는 페이지 매김으로 매개 변수가 있습니다.

?page=1&limit=10

이제는 검색과 페이지 매김 모두 해결해야 할 새로운 문제가 있습니다. 검색에 대한 참조로 열 b가 있습니다.

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

아래 코드를 어떻게 구현합니까?

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

편집하다:

C 열을 의미합니다.

해결을 위해 편집 :

저를 열심히 도와 주신 @Tanaike에게 감사드립니다!

내 최종 코드는 다음과 같습니다.

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

답변

2 Tanaike Nov 23 2020 at 07:51

나는 당신의 목표를 다음과 같이 믿습니다.

  • Spreadsheet의 "list_film"시트에서 값을 검색하려고합니다 SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/10S8Igzt1tpqUBgJHVKpny-2s6G3Y3-vFsLMvlZVqpkc/edit#gid=810612111").
  • search"B"열에서의 값을 검색하여 값을 검색하려고합니다 .

수정 지점 :

  • 에서 e.parameter.page, e.parameter.limit그리고 ?page=1&limit=10&search=San Andreas스크립트에서, 당신이 웹 앱을 사용하고 있는지 이해했다.
  • 이 경우, 사용하는 데 필요한 San Andreas?page=1&limit=10&search=San Andreas같은 e.parameter.search.
  • 나는 수정 제안하고자 sheet.getDataRange().getValues()에서 getUsers추가 filter. 마치sheet.getDataRange().getValues().filter(([,b]) => b == search)

위의 사항이 스크립트에 반영되면 다음과 같이됩니다.

수정 된 스크립트 :

  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);
}
  • 이 경우, 요청 될 때 https://script.google.com/macros/s/###/exec?page=1&limit=10&search=San Andreas, San Andreas시트 "list_film"의 칼럼 "B"를 가진 동일한 행에서 검색하여 San Andreas반환된다.
    • 을 포함한 값을 검색 search하려면 b.toString().includes(search)대신을 사용하십시오 b == search.

노트 :

  • Web Apps의 스크립트를 수정 한 경우 Web Apps를 새 버전으로 재배포하십시오. 이를 통해 최신 스크립트가 웹 앱에 반영됩니다. 조심하세요.

  • 내가 열 "B"의 값에 대해 확실하지 않다하지만 위의 스크립트가 예상 한 결과가 아닌 경우, 변경하여 사용하시기 바랍니다 sheet.getDataRange().getValues().filter(([,b]) => b == search)sheet.getDataRange().getDisplayValues().filter(([,b]) => b == search)다시 테스트를.

  • 당신은 당신의 가치 비교할 때, 예를 들어, 다른 열 대신 열 "B"와 비교할 경우 search열 "C"와를 수정하시기 바랍니다 filter(([,b]) => b == search)filter(([,,c]) => c == search).

참조 :

  • 필터()
  • 포함 ()

추가 :

수정 지점 :

  • 당신은에서 my last 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 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);
      }
    
  • 에서 var rows = sheet.getDataRange().getValues().slice(1);하고 var rows = sheet.getDataRange().getValues().reverse();, 값을 사용하여 검색됩니다 sheet.getDataRange().getValues(). 이에 따라 값이 필터링되지 않습니다. 이것이 현재 문제의 원인이라고 생각합니다.

현재 스크립트를 수정하면 다음과 같이됩니다.

수정 된 스크립트 :

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);
}
  • 첫 번째 헤더 행을 제거하고 반전 된 값을 반환하려면 getUsers다음과 같이 함수를 수정하십시오 .

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