プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Google spread sheetでオリジナルのレシピ検索システムを作る

レシピ検索システムをつくりました

もともと、Googleのkeepでテキストベースでタイトルと参照元のURLをメモしていました。
その後、よく参照するものは材料を書き出していましたが、今度は行数が増えることで視認性(検索性)が悪くなってしまっていました。

Google spread sheetを使えば、検索する仕組みが作れるのではないか?と思い作ってみました。

List画面
Filter画面

システムの解説

まず、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();
}

まとめ

Google spread sheetでオリジナルのレシピ検索システムを作りました。
もともとはボタンを押して、検索を実行するようにして作ろうと思いましたが、これではスマホ等からはGASを動かすことができないということが分かりました。そこでfunction onEdit(e){}を使いました。
問題として、じつはレシピを編集するときも検索が走ってしまっているはずです。
(検索キーが変わらなければ画面上はなにも変わらないですが…)
変更として受け付けるセルを指定するなどの改良はもしかしたら入れたほうがいいかもしれません。