01_WEBアプリ基本

【01_WEBアプリ基本】テーブル形式フォーム〔解説編Vol.1〕インラインコードで「HTMLタグをループして効率良く書く!」

記事概要

前の記事で、Googles Appps Script (GAS) を利用してGooglスプレッドシートに読み書き可能な、テーブル形式のフォームのプログラムを作成しましたが、そのプログラムの解説をします。

画像2
GASのプログラムは、スクリプトファイル(~.gs)とテンプレートファイル(~.html)から出来ていますが、今回の記事の説明はテンプレートファイル(HTMLファイル)の方になります。
画像3

テーブル関連のHTMLタグ<table><tr><th><td>

GoogleAppsScriptで扱うフォームは、「テンプレート」とよばれる一種のTHMLファイルです。テーブルの表現もHTMLのタグを書いて実装しますが、テーブルを表現するための4種類のタグを以下にご紹介します。

  • <table>~</table>~の記述部がテーブルとなることを表す。
  • <tr>~</tr>tableタグの中で使用。~部が1行分(レコード)表す。
  • <th>~</th>trタグの中で使用。~部が1個の見出し(ヘッダ)表す。
  • <td>~</td>trタグの中で使用。~部が1個のデータ表す。

 

実際のHTMLコードは例えば以下となります。

<table>
    <tr>
  <th>見出し1</th>
  <th>見出し2</th>
  <th>見出し3</th>
 </tr>
 <tr>
    <th>見出しA</th>
  <td>データA1</td>
  <td>データA2</td>
 </tr>
 <tr>
    <th>見出しB</th>
  <td>データB1</td>
  <td>データB2</td>
 </tr>
</table>

 

上記のHTMLはブラウザでは以下の様に見えます。
画像5
<th>と<td>は実質同じものですが、あとで文字装飾する際に区別するなどの目的で使い分けます。
こんな風にしてテーブルはHTMLコードで表現されるのですが、1行ずつの<tr>タグの中に、子要素として各セルを表す<td>や<th>タグを表記するので、ごくシンプルな表でもコードは結構に煩雑になります。
テンプレートはHTMLコードで表現するのですが、大ききな表だとタグの入れ子が複雑で書くのが大変になります。何とか効率よく表現できないでしょうか?

インラインコード(スクリプトレット)を使うと、複雑なテーブルのタグをforループで書けてしまう!

GASにはインラインコード(スクリプトレットとも言います)いう仕組みがあり、HTMLコードの生成そのものをJavaScriptを使って動的に行うことができます。

インラインコードとは、HTMLファイル中で<? ?>タグを入れてその中にJavaScriptコードを書いたものです。

<? ここにJavascriptを書く ?>
javascript は何行になっても良く、さらにユニークなのは、途中にHTMLタグを挿入することでプログラムのフローに沿ってHTMLタグを表記できることです。(例えば10回のループ処理の途中であれば、プログラムの流れに沿って10回表記したのと同じ結果が得られます)
書き方は以下の様になります。(?>~<?で挟んで書くイメージです
<? Javascript ?>HTML表記 <? Javascript?>
この仕組みを使えばHTMLタグの生成そのものをループ処理で効率よく生成できます。
この記法はGAS独自のものです。一般のHTMLファイルでもスクリプトレットの仕組みはありますが、この様な結果はタグそのものを生成する処理は表現できません。
インラインコードを用いると、テーブルの<tr>、<td> といったHTMLタグは、例えば以下の様にfor文を使ってテーブルのサイズによらず効率よく表記できます。(抽象的な表現で書いています。そのまま実装しても動きませんので注意)
<?
 for(行毎のループ){
  ?><tr><?
  for(列毎のループ){
   ?><td>セルのデータ</td><?
    }
?></tr><?

 }
?>

インラインコードには<?=変数 ?>タグで変数を埋め込むこともできる

インラインコードで素晴らしいのは、固定したタグやテキストだけでなく、変数を埋め込むことが出来る点です。変数は「=」を使って以下の様に表現します。

<?=変数 ?>
これを用いると、例えば前述のセルのデータを表す部分は・・・
<td>セルのデータ</td>
配列変数を用いて以下の様に表現できます。(もちろん配列に入る値はプログラムのどこかで表現しておく必要があります)
<td><?=セル[i行][j列] ?></td>
<?= >タグで挟まないで変数を表記した場合は、単に「セル」の様に変数名がテキストとして表現されてしまいます。

 

さきほどのコードで、各セルの値を配列変数セル[i行][j列]に取得しておけば、以下のコードにより大きなテーブルも表現することができるという訳です。

<?
for(行毎のループ)
  ?><tr><?for(列毎のループ)
   ?><td> <?=セル[i行][j列] ?> </td><?
    }  ?></tr><?
 }
?>

 

 

それではスプレッドシートから各セルの値を取得し、テンプレートの変数として引き渡すにはどうすればよいでしょうか?

それについては次の記事でご説明します。

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