(農業)情報工学・課題 (2023/11/02)

水稲の生育ステージ予測プログラムの作成(1)GAS Version

水稲生育診断の感度解析


calc01.gs
前回の実習では、Googleスプレッドシートに貼り付けた「ボタン」をクリックして、水稲の生育ステージ予測ができるようになったと思う。
ただ、解析で用いた気象データは、METEOという配列に格納し、プログラム中に埋め込んでいた。
今回のプログラム(calc01.gs)が、前回のプログラムと異なっている点は「気温データ」の取り扱いである。今回は気温データを、呼び出しボタンのあるGoogleスプレッドシートに貼り付けて、そこから読み込んで利用する形式とした。 これによって、各種の異なる気温データ(気象データ)を読み込んで、プログラムの挙動を調べることができる。
シート1とTEMP25
今回のGoogleスプレッドシートには、シートが複数必要である。
まず、シート1には、各種の基本情報が書き込まれている。その中には、気温データのシート指定も含まれる。つまり、気温データは別シートになっている。
複数のスプレッドシート
このシートに、スクリプトエディタで次のプログラムを書き込んでいる。
この課題プログラム(Calc01.gsの説明)を使う場合には、次のような操作を行う事となる。
シート1に記入する基本情報
A列B列
1品種名コシヒカリ
2田植え日109
3出穂積算気温1700
4登熟積算気温1000
5気温データTEMP25

なお、今回も課題プログラムは、積算温度の計算ー登熟日の決定部分が未完成である。
該当部分は、// 本日の課題作成部分(登熟日の計算)。 となっている。
つまり、本プログラムの計算部分が、未完成のままにしてあるので、このまま実行すると、登熟日はnullのままとなってしまう。 この重要な部分は、先週と同じなので、自分のプログラムを組み込んで、実行して提出してほしい。
なお、プログラムで用いられている主要な変数名とその意味は、以下の通りである。

Variables in Calc01.html
変数名変数型説 明備 考
VARIETYStirng品種名シート1から読込
TAUE_DATEInteger田植え日(日付連番)シート1から読込
TARGET_EAR_TEMP_SUMFloat出穂に必要な積算温度シート1から読込
TARGET_TOUJUKU_TEMP_SUMFloat登熟に必要な出穂後の積算温度シート1から読込
TEMP_FILEstring気温データのシート名
シート1から読込
debugintegerデバッグのフラグ
プログラム開発中に指定
1ならLogger出力
0ならBrowser出力
METEO[today]Float.Arraytoday日目(日付連番)の平均気温
366日型で提供
気温シートから読込
shussuiDateInteger出穂日(日付連番) 計算して推定する
toujukuDateInteger登熟日(日付連番) 計算して推定する
currentEarTempSumFloat積算気温1の作業用
targetEarTempSumと比較
計算中に利用
currentToujukuTempSumFloat積算気温2の作業用
targetToujukuTempSumと比較
計算中に利用

気温データは、次のような構造をしている。(366日型:2月29日のデータもある)
TEMP25(気象データ例:滋賀県)
行番号読込時数値説明
1METEO[0]4.51月1日の平均気温(以下、計算で利用)
2METEO [1]4.41月2日の平均気温
----------
365METEO[365]4.412月31日の平均気温
ここで25は滋賀県の県番号で、このデータは滋賀県の平均気温データ(平年値)である。

複数の気温データの読込
今回課題の実施方法
今回の課題としては、複数の気温データを読み込んで、利用する事とする。その際に、次の手順で課題を実施すると良い。
  1. Googleドライブで、新しいスプレッドシートを作成する。
  2. スプレッドシートの名前をcalc01などとする。
  3. 気温データ2020をダウンロードして、デスクトップなどに保存する。
  4. スプレッドシートで、「ファイル」→「インポート」→「アップロード」→「デバイスのファイルを選択」
    →ファイルを選択→インポート場所として「新しいシートを挿入する」を選択→「データをインポート」
  5. 自分のシートに、気温データのシート(地点名,TEMP01,TEMP08,TEMP15,TEMP25,TEMP40,TEMP45)が出来ている。
  6. シート1に、品種名、田植え日、出穂積算気温、登熟積算気温、気温データシート名を書き込む。
    シート1に記入する基本情報
    A列B列
    1品種名コシヒカリ
    2田植え日109
    3出穂積算気温1700
    4登熟積算気温1000
    5気温データTEMP25
  7. シート1で「拡張機能」から「Apps Script」を開く
  8. calc01プログラムをコピペする。
  9. シート1に、【生育シミュレーション】ボタンを設置する。
  10. ボタンに、関数(onSimulationButtonClick)を割り当てる。
  11. ボタンをクリックして、実行してみる。
と言う手順になる。
今回用意した気温データは、次の地域の平年値(1991−2020の30年間の平均値)である。
なお、田植えの日付は、それぞれの地域で異なっている。
準備した複数の気温データ
データシート名地名標準的な田植日日付連番
TAUE_DATE
TEMP01北海道(札幌)5月24日145
TEMP08茨城県(水戸)5月6日127
TEMP15新潟県(十日町)5月9日130
TEMP25滋賀県(彦根)5月15日136
TEMP40福岡県(福岡)6月16日168
TEMP45宮崎県(串間)
超早場米
3月10日68

実行結果の表示方法
現在のブログラムでは、実行結果はBrowser.msgBox関数によってメッセージボックスに表示される。
しかし、プログラムの修正中に元のスプレッドシートに戻って、メッセージボックスを確認するのは不便である。そのため、プログラムの修正中は、debugの数値を1として、次の関数でLogger.logに出力されるようにする。このようにする事によって、スクリプトの画面のログ情報として、出力されるメッセージを確認する事が出来る。
さらに、プログラム開発中には、自分の思い通りに動作したことを示すメッセージがあるとプログラム開発の効率があがる。今回の課題プログラムには、既にコメントアウトしてあるが、シート1からのデータの読込が動いたかどうかを知るためのコマンドも埋め込んである。(44行目と52行目)
情報表示関数
//情報表示関数(デバック時(debugが1)はLogger,完成時(debugが0)はBrowserに出力)
function showMsg(msg) {
  if (debug==1) {
    Logger.log(msg); }
  else{
    Browser.msgBox(msg);
  }
}

今回の課題
今回の課題は、次の内容である。
  1. まず、上の手順どおりに、calc01のGoogleスプレッドシートを完成させる。
  2. そこに、前回の登熟日の計算部分を組み込んで、出穂日と登熟日が計算できるようにする。
  3. データとして、少なくとも3カ所の気象データを用いて、出穂日と登熟日を計算する。
    その際に、用いた地域の移植日(TAUE_DATE)を用いる。
提出するにあたっては、calc01のスプレッドシートを提出する必要は無い。
上記の3.で計算した結果(気象データ名、田植え日、出穂日、登熟日)をメモして、ワードファイルなどにとりまとめて、ITC-LMSの課題として提出する。
なお、プログラム面での応用課題としては、日付の出力を○月○日と表示する手法を組み込んでも良い。現在は日付連番で出力している部分を、○月○日として表示する方法である。
具体的には、daysToMMDDなどという関数を作成し、日付連番(days)を引数として与えれば、’○月○日’(MMDD)という日付文字列を返す関数などが考えられる。なお、これはあくまで「応用課題」なので、全員の必修では無い。興味のある人だけが挑戦する事を想定している。
JavaScriptでの文字列(追加説明)
JavaScriptの文字列は、文字列リテラルと呼ばれる、ダブルクオート"、シングルクオート'、バッククオート`、で囲って利用する。バッククオートはテンプレートリテラルという構文が使える。
moji = "ABC";
moji = 'ABC';
moji = `ABC`;
どの文字列リテラルでも共通であるが文字列リテラルは同じ記号が対になる。対になっていない文字列リテラルを、文字列の中に入れることが出来る。
moji = "I'm OK!";
moji = 'This is "ABC."';
また、文字列の中にリテラルと同じ記号が出現した場合は、\(バックスラッシュ)を使いエスケープする必要がある。
moji = 'I\'m OK!';
文字列の連結は、+で行う。
moji = 'this is ' + 'a pen.';
文字列に変数の値を直接連結することも出来る。
date = 109;
moji = 'Today = ' + date;
バッククオートで囲った場合には、${ }演算子を用いて、変数を直接書き込むことが出来る。(テンプレートリテラル)
moji = `Today = ${date}`
各種プログラムのテスト実行環境