bugfix> google-apps-script > 投稿

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

回答 1 件
  • 私はあなたの目標を次のように信じています。

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

あなたの答え