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.pagee.parameter.limitそして?page=1&limit=10&search=San Andreasあなたのスクリプトで、あなたがWebアプリを使用していることを理解しました。
  • この場合には、使用する必要があります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 AndreasSan Andreasシート「list_film」の列「B」から検索され、と同じ行San Andreasが返されます。
    • を含む値を取得する場合はsearch、のb.toString().includes(search)代わりにを使用してくださいb == search

注意:

  • Web Appsのスクリプトを変更した場合は、WebAppsを新しいバージョンとして再デプロイしてください。これにより、最新のスクリプトがWebアプリに反映されます。これに注意してください。

  • 列「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)

参照:

  • フィルタ()
  • include()

追加:

変更点:

  • あなたはより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);
      }