レシピ検索システムをつくりました
もともと、Googleのkeepでテキストベースでタイトルと参照元のURLをメモしていました。
その後、よく参照するものは材料を書き出していましたが、今度は行数が増えることで視認性(検索性)が悪くなってしまっていました。
Google spread sheetを使えば、検索する仕組みが作れるのではないか?と思い作ってみました。
Google spread sheetとGASを使って、オリジナルのレシピ検索システムを構築しました。
— とりてん (@s51517765) 2023年3月19日
「検索キー」にキーワードを入れると、タイトルか材料に一致するレシピを抽出します。 pic.twitter.com/BL3fEEPvpi
システムの解説
まず、keepのレシピ内容をspread sheetに移植します。
これをListというsheetにします。
また、抽出結果を出力するFilterというsheetを作成します。
Filter sheetには検索キーの入力欄を作っておきます。
Listは抽出の単位(レシピの単位)として空行を使っています。
GASで行っていることとしては、以下のようになります。
①検索キーを取得
②ListのsheetのA列を取得
③キーワードを含む行を抽出
④⑤その上下を探索し空行の前までを一塊として配列に追加
⑥レシピの区切りの空行を配列に追加
⑦Filter sheetに出力
③~⑦を繰り返す
⑧List sheetのEOFで終了
また、検索キーが変更された(入力された)ときに、このScriptが動くようにfunction onEdit(e){}
に登録しておきます。
function myFunction() { var listSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("List"); var filterSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filter"); var range = listSheet.getRange("A:A"); //② var values = range.getValues(); var TargetRow = 3; var upperCount; var lowerCount; var array = []; var searchString = filterSheet.getRange(1,3).getDisplayValue(); //① var range2 = filterSheet.getRange("A:A"); // 列をクリア range2.clearContent(); values.unshift("");//配列のインデックスと行を一致 for (var i = 1; i < values.length; i++) { //③~⑦の繰り返し if (values[i].toString().indexOf(searchString) !== -1) { //③ upperCount = 1; lowerCount = 1; array.push(values[i]); while (values[i - upperCount] != "") { //④ array.unshift(values[i - upperCount]); upperCount += 1; } while (values[i + lowerCount] != "") { //⑤ array.push(values[i + lowerCount]); lowerCount += 1; } array.push("")//区切り ⑥ console.log(array); for (var j = 0; j < array.length; j++) { //⑦ filterSheet.getRange(TargetRow, 1).setValue(array[j]); TargetRow += 1; } array = []; i += lowerCount; } else if (values[i].toString().indexOf("EOF") !== -1) { //⑧ return; } } } function onEdit(e) { myFunction(); }