2021年10月18日月曜日

原木椎茸栽培をデータ化する。


昨年から原木椎茸栽培のデータ化に取り組み始めました。今年も、多少のアップデートをしつつ、同様に栽培を開始しました。

そこで、データ化の全体像について、自身の頭の整理も兼ねて書いてみたいと思います。


▼ 栽培施設と栽培の流れ


原木椎茸の栽培には、3つのビニールハウスを使っています。

・ホダ化ハウス
 →植菌からホダ化を行うビニールハウス

・発生ハウス
 →浸水後、ホダ木を設置して収穫を行うビニールハウス

・休養ハウス
 →収穫後、ホダ木を設置して休養を行うビニールハウス


シーズン中(10月頃〜翌5月頃)の栽培の流れは以下のようになります。

ホダ化ハウス→(浸水→発生ハウスへ移動→収穫→休養ハウスへ移動) × 3〜4回

ホダ化が済んだら、あとは発生ハウスと休養ハウスを行ったり来たりしながら、浸水と収穫を3、4回繰り返します。

データ化は、浸水後から収穫までの発生ハウス内での工程で行っています。


▼ IoT機器を活用して基礎情報を取得


IoT機器を活用して、発生ハウス内で温度と湿度を取得します。これが、基礎情報となります。

測定には、Raspberry Pi ZeroとDHT22(AM2302)センサーで作った温湿度データロガーを使用しています。(参考:「Raspberry Pi Zero WHを使って、格安で温湿度データロガーを作る」)


基礎情報を元に、栽培管理の補助となる『温度・湿度の通知機能』と『栽培管理のためのデータ閲覧ページ』を作成します。

温度・湿度の通知機能は、発生ハウス内の温度や湿度が設定した値よりも上がったり下がったりした際に通知がされます。通知には、LINEを使用しています。

対応が必要であれば、温度を下げたり、湿度を上げたりといった操作(ハウス窓の開閉や撒水等)をすることになります。この部分も、自作での自動化は可能そうですが、さわの場合は、栽培施設が自宅から徒歩1分圏内なので、手動でやっています。栽培施設が遠い場合には、費用対効果を考慮の上、自動化するのがよさそうです。

栽培管理のデータ閲覧ページでは、以下のデータを表示しています。

・直近の測定温度・湿度
・過去24時間の最高温度、最低温度
・温度、湿度、有効温度量のグラフ
・積算温度
・温度の平均
・温度の標準偏差
・湿度の平均
・湿度の標準偏差

「積算温度」「温度の平均」「温度の標準偏差」「湿度の平均」「湿度の標準偏差」は、それぞれ過去1日間、3日間、10日間で算出。有効温度量、積算温度は、「原木椎茸の有効積算温度の計算」に沿って計算しています。


ページは、GAS(Google Apps Script)にて作成しています(参考:「GASで動的な栽培管理用データ閲覧Webページを作る」)。GASであれば、自前でサーバーを準備する必要がなく、基本的に維持費もかかりません。スマホからも確認ができます。



▼ 栽培管理情報をデータ化(インプット)


栽培管理情報を以下の通りデータ化します。

発生開始(浸水終了後、発生ハウスの棚にほだ木を設置)時に、以下の項目を記録。

・タイムスタンプ
・棚番号
・品種
・使用回数
・浸水時間

収穫時に、以下の項目を記録。

・タイムスタンプ
・棚番号
・収穫タイミング
・品質

収穫タイミングや品質は、入力する人によってぶれがでないよう基準を作っておくことが必要になります。

記録には、Googleフォームを使用しています。タイムスタンプは自動的に記録されます。


▼ 得られるデータ(アウトプット)


基礎情報と栽培管理情報を組み合わせることで、各棚で発生させた原木椎茸について以下のデータが得られます。

・収穫までの積算温度
・温度 - 平均
・温度 - 標準偏差
・湿度 - 平均
・湿度 - 標準偏差
・収穫までの時間

これらを品質と照らし合わせ、栽培管理にフィードバックします。


以上が、(現状の)原木椎茸栽培のデータ化の全体像になります。

システム構築にかかった費用は、温湿度データロガーの作成費5〜6,000円のみです。運用にあたっては、通信費が月々200円程度かかります。

実のところ、いろいろ変えやすい小規模な農園こそ、データを活用した農業って相性が良いような気がしています。


***

昨シーズンのデータを見ますと、目指す品質としては、温度の平均が10〜22℃、標準偏差が5〜8あたりが管理の目安になりそうかなと思われます。湿度は正確なデータが取れませんでしたので、今シーズンに期待。

標準偏差というのはデータのばらつきなので、温度の場合は、寒暖差ですね。


休養ハウスのデータの取得等、まだまだ他にもやってみたいことはたくさんあります。他の作物とかも。まぁ、焦らず一歩ずつですね。

よく言われることですが、実感としても、勘や経験でやっていたことを改めてデータとして見ると理解が深まりますね。

農業、おもしろいですね。


Twitter(@nkkmd)日々更新中です。

2021年10月17日日曜日

徒然じゃない日々

今年の米の概算金価格はえげつない下がり方ですね。一方で、原油価格は上がっているし、円安も進行中。よく分からないですが、大丈夫なやつなのでしょうか。


そういえば最近、SNS(FacebookとInstagram)の利用を減らしました。以前は、業務上の必須作業と考えていたのですが、現状のさわの経営の内容を考えた時に、積極的に利用する価値を見出せなくなってきました。

身の回りのでも、仕事でSNSを使っていた方がちらほら離脱してますね。

印象ですが、事業との相性や戦略をしっかり考えた上でやらないと、効果ゼロどころかマイナスもあり得そうという感じがします。

プライベートでも、それほどヘビーに使っていた方ではないですが、無為に時間を費やし、必要以上に情報に触れていたのかもしれないなと思います。

仕事以外のつぶやきが8割のTwitterだけ生き残っています(笑)。


ここ1、2年で強制的な変化が多々ありましたが、結果的に、やめる決断の大切さを実感しています。




Twitter(@nkkmd)日々更新中です。

2021年10月3日日曜日

判断回数をできるだけ減らす。

判断するのって疲れるそうです。

どうでもいい判断でも割と疲れるので、ある程度自動的に物事が進むようなルール作りが大切なんですね。あとは、計算できるものは面倒がらずに計算するとか。

自作スマート農業の効果としても、費用や労力とともに、いかに判断回数を減らせるかが重要そうだなと思います。

栽培ハウスの温湿度ロガーでも、高温や乾燥に対してアラートを設定しておくと、とりあえず頭の中から忘れられるので、楽なんですよね。温度や湿度の確認のために見に行くという判断をしなくていいですし、温度を下げるたり湿度を上げるという対応をするかしないかの判断をしなくて済みますからね。

そうやって、コツコツ判断回数を減らして余力を保っておくことで、より重要な判断にじっくりのぞめる状態を作れればいいなと。

そんなことを考えたり、考えなかったりした週末でした。




Twitter(@nkkmd)日々更新中です。

2021年9月27日月曜日

【GAS】Google フォームとスプレッドシートを連携して選択肢を動的に入力する。(そして注文フォームを作ってみる)

単体でも便利なGoogle フォームですが、GAS(Google Apps Script)を使うことで、いっそう便利になります。

例えば、スプレッドシートを連携することで、選択肢を動的に変更することができます。

ということで、スプレッドシートと連携して、動的に在庫の反映などをしてくれる「注文フォーム」を作ってみました。

追加で、確認メールの自動送信機能も付けました。


▼ Google フォームの準備


まずは、元となるフォームを作成します。

項目は以下の通りです。商品タイトル、及び各項目の選択肢は、後ほど、GASで入力します。


1) 商品 [プルダウン] ※1~複数個
2) お名前 [記述式](必須)
3) メールアドレス [記述式](必須)
4) お電話番号 [記述式]
5) 住所(都道府県) [プルダウン](必須)
6) 住所(続き) [記述式](必須)
7) お支払い方法 [ラジオボタン](必須)
8) アンケート [チェックリスト]

メールアドレスは、回答の検証を付けておいた方がいいですね。


▼ スプレッドシートの準備


フォームの回答先として、スプレッドシートを作成します。

回答先のシートの他に、「item」「pref」「paym」「ques」という4つのシートを作成します。

回答先のシート名はデフォルト(「フォームの回答 1」)でも問題ありませんが、今回は「form」という名前に変更しています。


各シートの役割は以下の通りです。シートそれぞれの書き方は → こちらを参考にしてください。

・「item」 → 1) 商品のデータ

商品名、価格、在庫数が記載された商品データを入力しておきます。商品数はいくつでも大丈夫です(フォームの商品項目の数を合わせます)。

注文を受けると、在庫が減っていきます。


・「pref」 → 5)住所(都道府県)のデータと対応する送料のデータ

47都道府県の一覧と、対応する送料のデータを入力しておきます。


・「paym」 → 7) お支払い方法のデータ

お支払い方法の一覧を入力しておきます。


・「ques」 → 8) アンケートのデータ

チェックリスト方式のアンケートを入力しておきます。

この項目は、スクリプトの例として、チェックリストを含めたかったために作ったので、不要であれば削除してください。


▼ スクリプトの作成


フォームより、スクリプトを作成します。フォームから作ることで、トリガー作成時に、イベントのソースとしてフォームを選択することができます。

スクリプトは2つ、スプレッドシートの内容に応じて選択肢を動的に入力するための「set-form.gs」と、在庫の計算と確認メールを送信をするための「order.gs」になります。

「set-form.gs」
function setForm() {
  Utilities.sleep(3 * 1000);

  const sp = SpreadsheetApp.openById("スプレッドシートID");
  const itemList = sp.getSheetByName("item");
  const prefList = sp.getSheetByName("pref");
  const paymList = sp.getSheetByName("paym");
  const quesList = sp.getSheetByName("ques");

  let itemNum = itemList.getLastColumn() - 1;

  const form = FormApp.openById("フォームID");
  const ques = form.getItems();
 
  //商品(プルダウン)
  for(let i = 0; i < itemNum; i++) {
    let que_item = ques[i];

    let itemName = itemList.getRange(1,i + 2).getValue();
    let itemAmt = itemList.getRange(2,i + 2).getValue();
    let stock = itemList.getRange(3,i + 2).getValue();
    let que_itemList = [];
    for(let x = 1; x <= stock; x++) {
      que_itemList.push(x); 
    }
    que_item.asListItem().setTitle(itemName + " / ¥" + itemAmt).setChoiceValues(Array.prototype.concat.apply([], que_itemList));
  }

  //都道府県(プルダウン)
  const que_pref = ques[itemNum + 3];
  let pref_lastRow = prefList.getLastRow() - 1;
  let que_prefList = prefList.getRange(2,1,pref_lastRow,1).getValues();
  que_pref.asListItem().setChoiceValues(Array.prototype.concat.apply([], que_prefList));

  //支払い方法(ラジオボタン)
  const que_paym = ques[itemNum + 5];
  let paym_lastRow = paymList.getLastRow() - 1;
  let paym_prefList = paymList.getRange(2,1,paym_lastRow,1).getValues();
  que_paym.asMultipleChoiceItem().setChoiceValues(Array.prototype.concat.apply([], paym_prefList));

  //アンケート(チェックボックス)
  const que_ques = ques[itemNum + 6];
  let ques_lastRow = quesList.getLastRow() - 1;
  let que_quesList = quesList.getRange(2,1,ques_lastRow,1).getValues();
  que_ques.asCheckboxItem().setChoiceValues(Array.prototype.concat.apply([], que_quesList));
  que_ques.asCheckboxItem().showOtherOption(true);
}

書き換えが必要な箇所は以下の通りです。

・4行目「スプレッドシートID」

スプレッドシートURLの下記部分です。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


・12行目「フォームID」

フォーム(編集画面)URLの下記部分です。

https://docs.google.com/forms/d/ここの値をコピペ/edit


アンケートの項目が不要な場合は、8行目、及び41〜46行目を削除してください。


「order.gs」
function submitForm(e) {
  let quesResp = e.response.getItemResponses();

  const sp = SpreadsheetApp.openById("スプレッドシートID");
  const itemList = sp.getSheetByName("item");
  const prefList = sp.getSheetByName("pref");
  let itemNum = itemList.getLastColumn() - 1;

  //在庫再計算
  for(let i = 0; i < itemNum; i++) {
    let stock = itemList.getRange(3,i + 2).getValue() - quesResp[i].getResponse();
    itemList.getRange(3,i + 2).setValue(stock);
  }

  //メール
  //内容の作成
  let order = [];
  let total = 0;
  for(let i =0; i < itemNum; i++) {
    if(quesResp[i].getResponse() != null) {
      order.push(itemList.getRange(1,i + 2).getValue() + " 数量:" + quesResp[i].getResponse() + " ¥" + itemList.getRange(2,i + 2).getValue() * quesResp[i].getResponse() + "\n");

      total += itemList.getRange(2,i + 2).getValue() * quesResp[i].getResponse();
    }
  }
  let prefFinder = prefList.getRange("A2:A").createTextFinder(quesResp[itemNum + 3].getResponse()).findAll();
  let pstg = prefList.getRange(prefFinder[0].getRow(),2).getValue();
  total += pstg;
  let content = quesResp[itemNum].getResponse() + ' 様\n\n以下の内容でご注文を承りました。ご確認ください。\n\n-----\n' + order.join("") + '送料 ¥' + pstg + '\n\n合計 ¥' + total + '\n-----\n\nお支払い方法:' + quesResp[itemNum + 5].getResponse();

  //送信
  GmailApp.sendEmail(
    quesResp[itemNum + 1].getResponse(),
    'ご注文を承りました。',
    content,
    {
      from: '送信元メールアドレス',
      name: '送信者名'      
    }
  );
}

書き換えが必要な箇所は以下の通りです。

・4行目「スプレッドシートID」

「set-form.gs」のスプレッドシートIDと同じです。


・37行目「送信元メールアドレス」
・38行目「送信者名」

送信元メールアドレスは、Google アカウントのGmail、もしくはエイリアスとして追加しているメールアドレスを指定できます。送信者名は、自由に指定。

GASによるメールの扱いは「Gmailで定期的にメールを自動送信する。」をご参照ください。


▼ トリガー設定


・「set-form.gs」のトリガー

「実行する関数を選択」→ setForm
「実行するデプロイを選択」→ Head
「イベントのソースを選択」→ フォームから
「イベントの種類を選択」→ フォーム送信時
「エラー通知設定」→ 今すぐ通知を受け取る

setForm関数の冒頭で、3秒間スリープさせて、order.gsによる在庫の計算の後に読み込みが行われるようにしています。


・「order.gs」のトリガー

「実行する関数を選択」→ submitForm
「実行するデプロイを選択」→ Head
「イベントのソースを選択」→ フォームから
「イベントの種類を選択」→ フォーム送信時
「エラー通知設定」→ 今すぐ通知を受け取る


▼ 自動送信される確認メール



今回のスクリプトの例ですと、自動送信される確認メールは、こんな感じの内容になります。適宜変更してください。


ということで、一通りできました。


***

あとは、決済部分ですね。

BASE等、簡単にネットショップを作ることができ、細かい便利機能もいろいろあるECサービスですが、結局、肝となるのは決済部分かと思います。

しかし、最近は、ネット銀行や送金アプリもとても便利なので、自前で用意可能な決済方法でも、それほど障壁にはならない(決済手段によって購入をやめてしまうことが少ない)のではないか、という気がするのですよね。

であれば、このくらいのざっくり自作フォームでも、ECをまかなえてしまうパターンが多々あるのではなかろうかと思います。

そんな仮説を立ててみたので、8年(内7年くらいは開店休業)使っていたBASEを、昨日退会しました。


そういえば、Googleがpringを買収したので今後の展開に期待しています。


Twitter(@nkkmd)日々更新中です。

2021年9月20日月曜日

獣害対策「イノシシ避けマシン」を作った【結果 / 2021年】


先日より、稲刈りが始まりました。まずは、もち米(こがねもち)から。

この、もち米を作っている田んぼには、ここ数年イノシシが入るようになってしまいました。その対策として、今年は「イノシシ避けマシン」を作り、設置してみました。



「イノシシ避けマシン」には、びっくりさせるための「人感センサーが反応したら音声を流す」機能と、警戒させるための「定期的に音声を流す」機能の2つが付いています。電源は太陽光発電で取っています。防水仕様。


今回、設置した期間は、出穂の始まった8月2日〜9月5日の約1ヶ月間でした。

まず、結果として、イノシシの侵入は例年より少なかったです。

しかし、どこまで「イノシシ避けマシン」の効果なのかは、よく分からず。たまたまかもしれません。こういうのって、検証が難しいですね。

以下、雑感です。


・「人感センサーが反応したら音声を流す」機能は、今回役に立たず

草の生えた地面近くに設置したところ、センサーが無駄に反応してしまい、途中で機能を停止。後述のように設置の方法を変更したこともあり、田んぼへの設置においては、この機能は不要そうです。


・設置の方法が重要かも?


当初、農道や畦畔に設置したものの、1週間を過ぎたあたりでイノシシが侵入。

侵入以前から、近くまで来ている気配(足跡)はあったので、はじめは警戒していたものの、慣れてしまったのかもしれません。



思案の結果、コードを延長して片方のスピーカーを稲の中に隠れるように設置方法を変更。このタイミングで人感センサーは停止。結果、これ以降、設置箇所からのイノシシの侵入は無し。

「びっくりさせる」ことよりも、いかに「警戒させ続ける」かが重要そうです。

そのために、どう設置するかですね。イノシシの身になって考えると、音の発生源が見えない方が怖い気がします。

ただし、ちょうど対角あたりからの若干の侵入がありました。これを、もう一台作成して、侵入箇所に同じように設置した時に、効果的に防いでくれるものなのか、警戒しつつ?も意を決して侵入してくるものなのか。


・太陽光発電での運用はけっこういける

8月後半からの長雨の時期に一度だけ電源が切れたのですが、思っていたよりは切れませんでした。切れた場合も、早めに回収してバッテリー充電器で充電すれば大丈夫そうです。

太陽光電源は、他にもいろいろ活用できそうです。


・防水機能

かなりの大雨でも、問題ありませんでした。洪水にでもならなければ、大丈夫そうです。


ということで、「イノシシ避けマシン」の設置結果でした。来年は、2台体制で、スピーカーを稲の中に隠し、実験してみたと思います。

それから、今年はおろそかになりましたが、検証方法も、もう少し考えたいところです。「効く気がする」では、おまじないと同じですからね。


Twitter(@nkkmd)日々更新中です。

2021年9月15日水曜日

「栽培データ検索システム」を作りました。


栽培データを、オープンデータとして登録・検索するための「栽培データ検索システム」を作りました。


ひとまず、テスト運用中です。


ざっくり概要を説明しますと、栽培データを持っている人がオープンデータとして公開していいよーという場合に登録してもらいます。そうすると、みんなが検索して使えるよ、という(素朴な)ものです。

ライセンスは、商用・非商用にかかわらず、自由に再利用が可能となる Open Data Commons Public Domain Dedication and License(PDDL) での公開を想定しています。

やはり、スマート農業の普及においては、ハード部分だけでなく、ソフト部分の整備もセットで必要なんじゃないかと思うのです。

何か自分で便利な機器を作ろうと思ったときに、ネット等でたいていの部品は簡単に手に入ります。作り方も、調べれば何とかなります。あとは、例えば、指標になるような栽培データがあれば、自作した機器を、より一層、幅広く活用することができます。

まぁ、まだ登録データは、私の1件だけ(しかも原木椎茸)なので、お声がけもして、少しずつ増やしていけたらなと。

もちろん、栽培データは秘中の秘なり、というのが普通は当然な気もします(特に品目によっては)。一方で、みんながお互いにデータをうまく使って栽培技術を高めたり、はたまた経営改善につなげれば、全体としては底上げになるんじゃないかと思います。実験ですね。


今回のシステムは、静的なページはGoogle サイト、登録部分はGoogle フォーム、データの検索と削除部分はGAS(Google Apps Script)で作りました。いやはや、GASほんと便利。

当初は、どこかにサーバーを準備して、PHP + MySQLとかで作ろうかと考えていたのですが、GASで作れたので維持費はゼロ(ドメイン代のみ)。ありがたや。しかし、収益性もゼロなので、低燃費でやっていきます。


さてさて、いろいろ、楽しくなるといいなぁ。


Twitter(@nkkmd)日々更新中です。

2021年8月29日日曜日

GASで簡単な検索システムを作る。


栽培データを登録・検索するためのシステム(のテスト版)をGAS(Google Apps Script)で作ってみました。

備忘録として、以下作り方です。


① ベータベースの作成

データベースへのデータの登録は、Google フォームを使います。


登録するデータは、①作成者、②作成者URL(任意)、③作成者メールアドレス(任意)、④栽培地、⑤品目、⑥データ種別、⑦栽培データへのリンク、⑧備考(任意)です。

(テスト版なので、登録できる栽培地、品目、データ種別のリストは一部のみ。)


フォームから登録したデータが入ったスプレッドシート。これが、検索するデータベース(代わり)になります。


①~⑧のデータが、それぞれB~I列に入っています。今回、とりあえず動かすためのサンプルとして、7データほど入れました。

シート名は「cdb」としています(スクリプト内でこの名前で使います)。


② スクリプトファイルの作成

GASのスクリプトファイルを作成します。トップページを表示するためのdoGet関数と、検索結果を返すdoPost関数があります。

function doGet() {
  let htmlIndex = HtmlService.createTemplateFromFile("index");
  let result = "";
  htmlIndex.result = result;
  return htmlIndex.evaluate().setTitle("栽培データ検索システム");
}

function doPost(e) {
  let item = e.parameter.item;
  let typ = e.parameters.typ;
  let pref = e.parameter.pref;
  let kywd = e.parameter.kywd;
  let htmlResult = HtmlService.createTemplateFromFile("index");

  let cdbSt =  SpreadsheetApp.openById("スプレッドシートID").getSheetByName("cdb");
  let rowNum = [];
  
  if(item != "未選択") {
    let itemFinder = cdbSt.getRange("F2:F").createTextFinder(item).findAll();
    for(let i in itemFinder) {
      rowNum.push(itemFinder[i].getRow());
    }
  } else {
    htmlResult.result = "品目を選択してください。";

    return htmlResult.evaluate().setTitle("検索結果 - 栽培データ検索システム");
  }

  if(typ == null) {
    htmlResult.result = "データ種別を選択してください。";

    return htmlResult.evaluate().setTitle("検索結果 - 栽培データ検索システム");
  } else if(typ[0] != "全部") {
    let num = 0;
    const itemRowNum = rowNum.length;
    for(let x = 0; x < itemRowNum; x++) {
      let check = false;
      for(let y = 0; y < typ.length; y++){
        let typCheck = cdbSt.getRange(rowNum[x - num], 7).getValue().split(", ");
        for(let i = 0; i < typCheck.length; i++) {
          if(typ[y] == typCheck[i]) {
            check = true;
          }
        }
      }
      if(check == false) {
        let dlt = rowNum.indexOf(rowNum[x - num]);
        rowNum.splice(dlt,1);
        num++;
      }
    }
  }

  if(pref != "全国") {
    let prefFinder = cdbSt.getRange("E2:E").createTextFinder(pref).findAll();
    for(let i in prefFinder) {
      rowNum.push(prefFinder[i].getRow());
    }
    rowNum = rowNum.filter(function (x, i, self) {
      return self.indexOf(x) === i && i !== self.lastIndexOf(x);
    });
  }

  if(kywd != "") {
    let kywdFinder = cdbSt.getRange("B2:I").createTextFinder(kywd).findAll();
    for(let i in kywdFinder) {
      rowNum.push(kywdFinder[i].getRow());
    }
    rowNum = rowNum.filter(function (x, i, self) {
      return self.indexOf(x) === i && i !== self.lastIndexOf(x);
    });
  }

  rowNum.sort((a, b) => {return a - b;});
  
  let num = rowNum.length;
  let result = ["<table><tr><th>作成者</th><th>作成者URL</th><th>作成者メールアドレス</th><th>栽培地</th><th>品目</th><th>データ種別</th><th>栽培データへのリンク</th><th>備考</th></tr>"];
  for (let i = 0; i < num; i++) {
    result.push("<tr><td>");
    result.push(Array.prototype.concat.apply([], cdbSt.getRange(rowNum[i], 2, 1, 8).getValues()).join("</td><td>"));
    result.push("</td></tr>");
  }
  result.push("</table>");

  htmlResult.result = result.join("");

  return htmlResult.evaluate().setTitle("検索結果 - 栽培データ検索システム");
}
※ コードを一部修正しました。(2021-8-31)

15行目の「スプレッドシートID」は、書き換えてください。当該スプレッドシートURLの下記部分です。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


③ HTMLファイルの作成

GASのHTMLファイルを作成します。ファイル名は「index.html」としています(スクリプト内でこの名前で使っています)。検索フォームと検索結果を表示します。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <center><h1><a href="ウェブアプリURL">栽培データ検索システム</a>(β版)</h1></center>
    <form method="post" action="ウェブアプリURL">
      <p><b><品目>*</b><br>
        <select name="item">
          <option value="未選択">選択してください…</option>
          <option value="シイタケ">シイタケ</option>
          <option value="キクラゲ">キクラゲ</option>
          <option value="エノキ">エノキ</option>
        </select>
      <p><b><データ種別></b><br>
       <input type="checkbox" name="typ" value="全部" checked="checked">全部
        <input type="checkbox" name="typ" value="温度">温度
        <input type="checkbox" name="typ" value="湿度">湿度
        <input type="checkbox" name="typ" value="照度">照度
      </p>
      <p><b><栽培地></b><br>
       <input type="radio" name="pref" value="全国" checked="checked">全国
        <input type="radio" name="pref" value="福島県">福島県
        <input type="radio" name="pref" value="茨城県">茨城県
        <input type="radio" name="pref" value="栃木県">栃木県
      </p>
      <p><b><キーワード></b><br>
        <input type="text" name="kywd" size="30">
      <p>
        <input type="submit" value="検索">
      </p>
    </form>
    <p>
      * 必須
    </p>
    <br>
    <p>
      <?!=result?>
    </p>
  </body>
</html>

7、8行目の「ウェブアプリURL」は、ウェブアプリケーションの公開後に取得できるウェブアプリのURLを記述します。


④ ウェブアプリケーションの公開と共有

作成したスクリプとHTMLトファイルを、ウェブアプリケーションとして公開、共有します。

「デプロイ」→「新しいデプロイ」から、

「説明」→「簡単検索システム」(適当に)
「次のユーザーとして実行」→「自分」
「アクセスできるユーザー」→「全員」

として、デプロイを実行。

「アクセスを承認」がまだの場合は、承認します。

ウェブアプリのURLが発行されますので、HTMLファイルにウェブアプリURLを記述し、「デプロイを管理」から「新バージョン」のデプロイを実行します。

プロジェクトの「共有」設定を、「リンクを知っている全員」に変更。

これで、ウェブアプリURLから検索トップページにアクセスして、検索ができるようになります。


⑤ 動かしてみる

動かしてみます。


品目は、選択必須。

データ種別は、チェックボックスで複数選択が可能となっているので、選択された品目のうちチェックされたデータ種別を1つでも含むものが検索されます。

栽培地は、ラジオボタンで1つ選択。キーワードは、入力されたキーワードを含むものを検索します。

また、品目が未選択、もしくはデータ種別が1つも選択されていないと検索されません。


上の写真の条件での検索結果。


こんな感じになります。


こちら↓から動かせます。


***

ということで、GASで作る簡易的な検索システムでした。

スプレッドシートの1シートに収まる程度の小規模なデータの運用であれば、けっこう十分なのではなかろうかと(厳密にはどの程度まで耐えられるのか分かりませんけども)。何よりGASの場合、サーバーの準備を考える必要がなく、維持ゼロというのが素晴らしいですね。

先日、BloggerでTwitterカードを表示するために投稿ULRから画像のURLをリダイレクトするウェブアプリケーションを作ろうとして失敗しましたが、この検索システムはそこから転生したので、何でもやってみるものですね。

表示する情報を整理したり、URLはリンクにしたり等々、もう少し手を加えて、栽培データのオープンデータ化に活用していきたいと思います。




Twitter(@nkkmd)日々更新中です。