Google ScriptのURLパラメータを使用して列Googleスプレッドシートのデータをフィルタリングするにはどうすればよいですか?
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);
}
回答
私はあなたの目標を次のように信じています。
- 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
あなたのスクリプトで、あなたが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 Andreas
、San 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); }