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 件
関連記事
- ドロップダウンの結果をGoogleスプレッドシートでフィルタリングしますか?
- Googleスプレッドシートの= filterに「or」を追加する方法
- 行を追加するGoogleスプレッドシートスクリプト
- Googleスプレッドシートは小売業者の価格設定のためにXMLをインポートします
- 別のスプレッドシートにリンクするボタンをGoogleスプレッドシートに追加するにはどうすればよいですか?
- Googleスプレッドシートチェックボックスをオンにすると、行を別のシート(同じ本)に記録します
- パンダなしでリストPythonの列をフィルタリングする方法は?
- タブを新しいシートにコピーするためのGoogleスプレッドシートのappscript
- スペースのみでデータフレーム列をフィルタリングするには
- Google Sheets + Apps Script:IDをループしてファイルを移動する
関連した質問
- メールの日付からのみ年を抽出する方法
- 範囲の内容を他の範囲に揃える
- App Scriptでアクティブな範囲ではなく特定の範囲を選択する
- TypeError:sheetnewChart(…)setChartType(…)setDataViewDefinitionは関数ではありません
- varが空の場合、テキストを置き換えます
- Googleスクリプト:BrowserinputBoxが空白でないかどうかを確認します
- 列の値に基づいて行を自動的に並べ替えるにはどうすればよいですか?
- Google Apps Script HTML Serviceはユーザーの選択に基づいて動的に入力します
- Apps Scriptで日付/時刻の差を秒:ミリ秒としてキャプチャするにはどうすればよいですか?
- Googleスプレッドシートの情報を使用して、2週間後のGoogleカレンダーイベントを作成します
私はあなたの目標を次のように信じています。
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)
上記の点をスクリプトに反映すると、次のようになります。
変更されたスクリプト:この場合、
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
次のように、提案されたスクリプトが正しく使用されていないことがわかりました。で
var rows = sheet.getDataRange().getValues().slice(1);
そしてvar rows = sheet.getDataRange().getValues().reverse();
、値はを使用して取得されますsheet.getDataRange().getValues()
。これにより、値はフィルタリングされません。これがあなたの現在の問題の理由だと思います。現在のスクリプトを変更すると、次のようになります。
変更されたスクリプト:最初のヘッダー行を削除して逆の値を返す場合は、関数を変更してください
getUsers
次のように。