【FileMaker】2020年AdventCalendarをGoogle Chartsで振り返る

今年2020年の[Qiita FileMaker Advent Calendar](https://qiita.com/advent-calendar/2020/filemaker)の購読、応援をありがとうございました。
今回もめでたく25日全日埋まり、FileMakerに関わるみなさんのパワーを感じました。
全部出揃ったということで、今回の記事がどんなものがあったか、[Google Charts](https://developers.google.com/chart)でグラフ化してみました。

ちなみにこの記事を書いたりFileMakerでチャートを作っている時のBGMは、"[Tell Your World](https://www.youtube.com/results?search_query=tell+your+world)"です。
Advent Calendarも本当にいろいろな角度からの記事があり、教わることが多かったです。

# 結果！
最初に作り云々よりも、まずは、どんな記事があったのかの集計です。
![スクリーンショット 2020-12-27 12.26.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e0d2b12f-73a1-dd28-5acd-6ebffe1ea9c0.png)
こうしてみると、FileMaker内でのデータ操作Tipsが多いですが、合わせて多いのが外部接続(API)の記事でした。
FileMakerが他のシステムや環境のHUBとなってきていることがわかる傾向です。
また、FileMaker Serverネタでは、CentOSなどLinux環境の記事もあり、FileMakerがLinuxで稼働する元年にふさわしい記事でしたね。
その他、ポップアップヘルプで遊ぶネタで、読んでいるこちら側にクイズを投げかけて手を動かしてみるものなど、書き手と読み手が参加するイベントとして最も楽しい瞬間ですね！

# 実装の方法
## FileMaker バージョン
Google ChartsはWebビューアが使えるバージョン(8.5以降?)であれば、実装可能と思います。
ただ、集計した情報をJavaScriptに変換する段階でJSON操作を行っていますので、JSON関連が追加されたバージョン16以上がおすすめです。
今回は、FileMaker 19バージョンで作成しました。

## 集計
集計自体はFileMakerで行いました。
[Qiita API](https://qiita.com/api/v2/docs)で集計するのもいいかな、と思ったのですが、Qiitaではタグが5つまでしか指定できないことから、内容が正しく反映されていない可能性もありましたので、全記事を読んで、独断と偏見で記事カテゴリを作って集計しました。

## グラフ化
また、グラフ化については、Google Chartsの[Bar Charts](https://developers.google.com/chart/interactive/docs/gallery/barchart)で作りました。
本来であれば、FileMaker 19から追加になった[addon](https://marketplace.claris.com/ja/category/add-on.html)の[簡易グラフ](https://marketplace.claris.com/ja/detail/1599.html)がホットな話題ですが、「簡易」グラフなだけに、こちらで表示したい項目の数と合わず、、、ならば、JavaScriptで実装を、といくつかピックアップし、割と簡単に実装できそうだったのがGoogle Chartsでした。

Bar Chartsは、マウスを当てるとガイドが出ます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/googecharts?src=hash&amp;ref_src=twsrc%5Etfw">#googecharts</a> の#barchart 、こんな感じでガイドが出ます。<br>いいね。 <a href="https://t.co/lnwZFUGxnr">pic.twitter.com/lnwZFUGxnr</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1343047700145528833?ref_src=twsrc%5Etfw">December 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

FileMakerのグラフオンリーで実装しようと思っても、痒いところに手が届かなかった部分が、JavaScriptだと手が届きますね。

# 実装
## 集計部分
集計テーブルに、集計内容を詰め込みました。
![スクリーンショット 2020-12-27 13.26.45のコピー4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/34f18480-74f1-9a3b-164c-adfa9e44baab.png)
FileMakerカテゴリと記事カテゴリは、値一覧で設定しています。
![スクリーンショット 2020-12-27 13.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/f8fe3a2b-ea5d-04c2-46cc-4ad68c021166.png)
レイアウトには、リスト表示をして次、次、と入力しやすくしています。
![スクリーンショット 2020-12-27 13.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/852697c0-8548-c2fa-7fb0-b50cc354e436.png)
今回は、Google Chartsの話題に絞りたいので、レイアウトの詳細については割愛します。

## 記事カテゴリ集計
今回は、記事カテゴリをチェックボックスにして一つのフィールドに値一覧から拾ってきたデータを改行つきで保存しています。
FileMakerでは、この一つのフィールドにある複数データのカウントについて、集計する項目分のフィールドを作って実装せよ、とアドバイスが出ていますが、いくつ増えるかわからない集計項目なのに、いちいち管理画面を開いてもいられないですよね。
Claris ナレッジベース：[ラジオボタンやチェックボックスでチェックした数を数える方法](https://support.claris.com/s/article/%E3%83%A9%E3%82%B8%E3%82%AA%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%84%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%97%E3%81%9F%E6%95%B0%E3%82%92%E6%95%B0%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%95-1503692975326?language=ja)

なので、スクリプトでチェックボックス全てを舐めてJSONにストックしました。
![スクリーンショット 2020-12-27 13.36.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/74cc77a9-7695-ecbb-375e-d57c032df172.png)

## JSONに集計
集計した結果のJSONは、こんな感じです。
記事カテゴリをkeyに、記事数をvalueにしています。
![スクリーンショット 2020-12-27 13.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/70266380-cbd8-22be-8c37-785a34d1d7c7.png)
JSONを保存するグローバルフィールドの他、表示用に計算フィールドを作っていますが、確認する必要がなければなくても構いません。
![スクリーンショット 2020-12-27 13.26.45のコピー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/e068cabc-57e6-466f-1ace-d62b7f192875.png)

## Google Chartsにする
Google Chartsでは、[コードスニペット](https://jsfiddle.net/api/post/library/pure/)がブラウザ上で動くので、Bar Chartもサンプルを実際の動きとコードを確認しながらコードをコピペできました。
とはいえ、組み込むhtmlとJavaScriptが必要最低限さらっと書いてあるだけなので、htmlに直したり整形するのは各自、ということになります。
今回は、元となるBar ChartをFileMakerで加工できるように編集したhtmlコードを「htmlデータ」フィールドに保存し、そのhtmlデータをスクリプト内で動的に変換し、「整形済htmlデータ」に仕上げました。
この「整形済htmlデータ」をWebビューアで表示させます。
![スクリーンショット 2020-12-27 13.26.45のコピー3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/361e53eb-1b06-802d-c9da-77c66bc80866.png)

### htmlデータ
サンプルではoptionにchart_divのスタイルを指定していましたが、それだと出来上がったチャートが全項目表示されず、サイズのバランスがよくなかったので、bodyのchart_divタグに直接スタイルをセットしました。
実際の運用では、この値もアドホックに設定できるような作りにすればいいかもしれませんね。

```
<!DOCTYPE html>
<html>
<head>
<title>集計チャート</title>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</script>
</head>
<body>
  <div id="chart_div" style="width: 75%; height: 1000px;"></div>
<script>
google.charts.load('current', {packages: ['corechart', 'bar']});
google.charts.setOnLoadCallback(drawBasic);

function drawBasic() {

      var data = google.visualization.arrayToDataTable([
@@@guide@@@
@@@chartdata@@@
      ]);

      var options = {
        title: '@@@title@@@',
        hAxis: {
          title: '@@@hTitle@@@',
          minValue: 0
        },
        vAxis: {
          title: '@@@vTitle@@@'
        }
      };

      var chart = new google.visualization.BarChart(document.getElementById('chart_div'));

      chart.draw(data, options);
    }
</script>
</body>
</html>
```

JavaScriptのdrawBasicで変換する部分は、以下の通りです。

|変換する文字列|セットする内容|
|:-----------|------------:|
|＠＠＠guide＠＠＠|チャートのX軸、Y軸|
|＠＠＠chartdata＠＠＠|チャートデータ|
|＠＠＠title＠＠＠|チャートのタイトル|
|＠＠＠hTitle＠＠＠|縦軸のタイトル|
|＠＠＠vTitle＠＠＠|横軸のタイトル|
※「＠」がマークダウン記法だとリンクと判断されてしまうので、表内では全角で記載しています。

出来上がったチャートでどこに配置されるかを確認すると、わかりやすいです。
![スクリーンショット 2020-12-27 12.26.49のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/43445e7f-ab4a-99f2-6ef5-b40bb3efc46c.png)
「＠＠＠guide＠＠＠」は、チャートデータの配列の並びを示しているので、縦軸のタイトルと横軸のタイトルに合わせておきます。

これをスクリプトで変換すると、下のようになります。
![スクリーンショット 2020-12-27 13.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/9e6fbfaf-5f8b-8541-1edb-6fa4fe03f5bf.png)
記事カテゴリ分LOOPで１行ずつ作り、その後、テンプレートのhtmlのデータを変数にコピーし、それぞれを変換しています。
整形済htmlデータフィールドに出来上がったhtmlを入れていますが、これは1回スクリプトを実行たあとは、整形済htmlを表示するだけにするためです。
一度の実行で終わらせる場合は、単純にグローバル変数に整形済htmlフィールドにセットするだけでいいかもしれません。

最後、Webビューアをレイアウトに配置し、整形済htmlを指定するのみです。
![スクリーンショット 2020-12-27 15.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/ba2b9513-0169-5966-d96f-b9c953f06b3d.png)

# 外部ツールを取り込みやすくするために
今回のAdvent Calendarの記事カテゴリをみるとおり、外部連携がかなり多くなってきています。
FileMakerのことだけでなく、それ以外のことも多く知る必要がありますが、やれることが広がりますので、まずはJavaScriptの組み込みから、というのもいいかもしれません。

来年2021年のAdvent Calendarは、どんな記事が公開されるか、楽しみですね。