03_家計簿アプリ

【03_家計簿アプリ】家計簿アプリ〔解説編Vol.4〕過去の日付別シートの読み込み

家計簿は当日の記録だけでなく、過去の記録も見返すことがあるものです。この記事では、日付を設定して、該当する日付の記録をGoogleスプレッドシートから読み出し、作成済のオブジェクトのテキスト値や数値に反映させる方法を解説します。

この記事は主にテンプレートでの記事になります。テンプレートでテーブルの上側にある以下の様な日付設定部分の表示とその処理の説明です。

ユーザの日付入力部

このアプリでは、Googleスプレッドシートで日付を名前としたシートを自動作成します。そして、デフォルトではその日付は今日(作業した日)になっています。詳しい解説は以下にありますので、ご参照ください。

今日の日付をgetDate()などで取得して、シートの名称として新規作成するのでした。

 

そこを、ユーザに入力した日付に差し替えるだけです。

ユーザの日付入力ボックスは以下の様に記述しています。

input type=”number” id=”mY” class=”myDate” value=”<?=Number(myDate.substring(1,5)) ?>”年<br>
<input type=”number” id=”mM” class=”myDate” value=”<?=Number(myDate.substring(5,7)) ?>”月<br>
<input type=”number” id=”mD” class=”myDate” value=”<?=Number(myDate.substring(7,9)) ?>”日<br>

<span >読込みシート名</span>
<span id=”myrDate“><?=myDate ?></span>

ごく普通の<INPUT>タグですので細かい説明は不要と思いますが、入力ボックスの年、月、日のid名を、mYmMmDでそれぞれ決めている点、デフォルトで今日の日付 myDate(今日の日付のシート名)から抽出した数字を入れている点がポイントです。

また、クラスという属性を指定しています。クラスは複数のオブジェクトに跨って設定できるのが特徴です。

入力ボックスの下には、現状の読み込みシート名を示すテキストがあり、id名をmyrDate、デフォルトの値をmyDateとしています。

入力が切り替わったら即テキストに反映させる

このアプリでは、ユーザが入力を終えたら、「読み込みシート」のテキストに反映させています。

どういう事かと言うと・・・以下の「読み込みシート名」が

日付を変えると・・・

ユーザがボタンなどをクリックしなくても即反映されます。

それはどうやっているのでしょうか?

コードを抜き出してみます。

$(function() {
 
  //セレクトボックスが切り替わったら発動
  $('.myDate').change(function() {
  
(中略)
  var newDate = "D" + tDate.getFullYear() + tNames[tDate.getMonth()]+  

(中略) 
    //選択したvalue値をp要素に出力
    $('#myrDate').text(newDate);
  });
});

JQueryには要素の値が変わったら発動する以下の様な関数があり、それを用いてテキストを変更しています。(全体では、以下を含めた一連の流れを改めて関数として指定しています)

$(セレクタ).change(function(){関数の中身})・・・セレクタが指すオブジェクトの変更時に関数の中身を実行する。

セレクタにはクラスを使っています。クラスは「.(ドット)」で指定します。

JQueryの$(セレクタ).changeを使っているのでした。(ここでtextというJQueryの関数があるのですが、これについては次に説明します)

入力情報から呼び出すシート名を生成する

ユーザは日付を入れ終わったら、以下にある「読込み」ボタンをクリックします。このボタンを押すと、該当シートの値が読み込まれます。

上記のボタンのHTMLコードは以下の様なものです。

<button onclick=”doUpdateTable(<?=myRows ?>, <?=myCols ?>)“>読込み</button>

 

doUpdateTable(行数, 列数)関数はユーザ定義関数です。この関数を発動している訳です。(具体的な行数、列数は、インラインコード<?= ?>で変数として表現しています)

上記の関数をみてみます。

function doUpdateTable(myRows, myCols){
<!—- JQuery記述-【↓ここから】–>
var nDate = $(‘#myrDate‘).text();
$(‘#myDate‘).text(nDate);
var myDate0 = $(‘#myDate‘).text();
<!—- JQuery記述-【↑ここまで】–>
google.script.run.withSuccessHandler(onSuccess2).GetSheet(myRows, myCols, myDate0);
}

変数nDateに、myrDateオブジェクトのテキストを代入しています。ここではまたもやJQueryを使っています。この部分の構文は以下です。

$(セレクタ).text()・・・セレクタが指すオブジェクトのテキストを取得
$(セレクタ).text(変数)・・・セレクタが指すオブジェクトのテキストを変数の値にする。

やっている事は、ヘッダに表示されているシート名を取得して、

テーブル上のシート名(以下のテキストです)に反映し、改めてその値を取得し・・・

google.script.run.関数を使って、スクリプト側のGetSheet(行、列、シート名という関数を発動させることです。

GetSheetについては以下の記事とほぼ同じ内容です。(指定シート名が引数として追加されている点、スプレッドシートへの読み込み/書き込みが違うだけです)

全体は後の記事で紹介するとして、ここでは抜粋だけ表示します。

//シートの値をHTMLに返す関数
function GetSheet(myRows, myCols, myDate0){

  //アプリケーションの取得
  var myApp = SpreadsheetApp.openById('☆各自のスプレッドシートのID☆');

(中略)
  
  //対象シートをシートの名前を指定して取得
  var myDate =myDate0  
  var mySheet = myApp.getSheetByName(myDate);
  
//対象シートが無ければコピー
  var myFrmSheet = myApp.getSheetByName('書式');
  if(!mySheet){
    var mySheet = myFrmSheet.copyTo(myApp);
    mySheet.setName(myDate);
  }
  
  

 //取得範囲として行数、列数を設定
 var nRow=myRows;
  var nCol=myCols;

  //シートの値を返り値として渡す
  var myCells = mySheet.getRange(1,1,nRow,nCol).getValues();

  return myCells;
}

 

取得した該当シートのセルの値をテーブルに反映

スクリプトが返してきたスプレッドシートのセルの値は、以下の要領でテーブルのセルのtextContentを変える事で反映させています。

//セル値に応じた値をテーブルに設定
テーブルオブジェクト.rows[iRow].cells[iCol].textContent = 取得したセルの値;

ただし、プルダウンへの反映はJQueryを使っています。

プルダウンは「テーブルの行数」をiD名にして生成しています

//行数に応じたID名の選択肢をセルの値をもとに設定
$(プルダウンのID(=行番号にしています).closest(‘tr’).find(‘select’).val(取得したセルの値);

テーブル内にあるプルダウンを取得するのはなかなか難しく、JQueryの助けを借りたわけです。なお、

  closest(‘tr’).find(‘select’) は

「指定要素に最も近い<tr(行)>要素に埋め込まれた<select>要素を探す」 という意味です。

それで見つかった要素に

  val(取得したセルの値)

という文で、プルダウンの値(value属性)をセルの値にしています。

一旦作成済みのプルダウンの値を変えるのは上記のvalue文で済みます。

長くなりましたが、以上となります。次回の記事ではコード全体をご紹介します。

結び

にほんブログ村 科学ブログ 技術・工学へ
にほんブログ村