(Introduction to Informatics 2)
新規スプレッドシートを作成し、
importrange関数で、A1セル(から始まる4列の範囲)に、 このシート から、
シート名 「アンケート(実習用)(回答)」の、範囲 a1:d
を取り込む。
/d/
よりも後ろ)このあと A〜D列はインポートされたデータに占拠されるので、E列以降に追加のデータは記入可能
例えば以下のような頻度統計を作ってもいい
F | G |
---|---|
B列 | 頻度 |
1 | |
2 | |
3 | |
4 | |
5 |
G2 セルに こんな式を入れる。
=arrayformula(if(isblank(F2:F),"",countif(B$2:B,F2:F)))
もとの(共有された)SpreadSheetを、
SpreadSheetの(他のアプリケーションからも行けるが今回はここから)拡張機能->Apps Script
で新しいタブが開く(これがApps Scriptエディタ; GASエディタなどとも呼ばれる)。
あらかじめ、「ファイルの追加」で HTMLファイルを1つ追加しておく。
Webアプリケーションとなる関数:以下をコード.gs
に追加。
function doGet(e) {
var tmpl=HtmlService.createTemplateFromFile('レポート') // さっきのファイル名
// ここにあとで行を追加する
return tmpl.evaluate() // ここはGASのお決まりの呼び方
}
Ctrl-{
,
Ctrl-}
といったショートカットが
使える(Atomでも同様だが)ことは知っておくといい。「デプロイ」操作(青いボタンから入る)
table の準備
かといって HTMLで表を作るのは煩雑なので、
Atom の markdown モード(文法)で、
|回答|回答数|
|--|--|
|||
のようなものを用意してから、
プレビュー画面で「Copy as HTML」したものを、
(ブラウザに戻って)「レポート.html」にコピペすると楽。
データの取得:
function myFunction() {
var r=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("f2:g6").getValues()
console.log(r)
}
HTMLファイル(実はテンプレート)に渡す:
tmpl.d=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("f2:g6").getValues()
この行を、doGet関数(の予定していた場所)に挟む。
出力させる:
HTMLの中の、
<tr>
<td></td>
<td></td>
</tr>
の部分(見出しの部分ではなく、tableの中身としての空っぽの列を表していた)を、 以下のようなコードに書き換える。
<? d.forEach(v=>{ ?>
<tr>
<td> <?= v[0] ?> </td>
<td> <?= v[1] ?> </td>
</tr>
<? }) ?>
これは、GASの中で使われるテンプレート言語。
<?= ?>
の形で囲まれた式は、その式の値がページに表示される。CSSの調整:
<style>
table{border-collapse: collapse}
td, th{border: 1px solid}
th{background-color: #abcdef}
</style>
アンケートの回答がいくつ入力されるか(SpreadSheetの行数)は予想がつなないので、 範囲を予め指定しておくのは困難。こういう場合は、以下のような関数でデータをgetする。
tmpl.d=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().getValues().slice(1)
上記を実施してみて下さい。
この筋書き通りでもいいし、自分なりのデータ選別をして出力させてもいい。
経過(どんなことを考えて、どんな選択を行ったか、など)と、 結果(どこまでできたか、Webアプリケーションとして成立したらそのURLも)を報告されたし。
それに加えて、(こういう情報処理のアプローチと出会ってみての)感想も、 何かお書き下さい。