この記事は #chillSAP 夏の自由研究2022、8/26の記事として執筆しています。
夏休みということで、志賀高原に旅行に行きました。
8月の志賀高原。このような湿地や池が多く見られ、高原のため涼しいので、歩いているとかなり気持ちいいです。
散歩をしていてふと、自分の歩いた記録を残して後から見たいなと思い、表題のものを作るに至りました。(散歩しながらiPhoneで作っていたら池に落ちそうになったのは内緒です)
最近は便利なスマホアプリも存在してそうですが、いいんです、SACの練習なので(笑)。SACを使うことが目的です。
つくったもの
SAP Analytics CloudのTrial環境を用いてこのようなレポートを作りました。志賀高原で自分が歩いたルートが可視化できました!
(位置情報送信の頻度をもっと上げれば、もう少しなめらかなルートになります)
特長は、次になります。
- 自分のiPhoneから定期的に飛ばした位置情報や歩数のデータを可視化していること
- データソースとはLive接続していないものの、importをスケジューリングすることで、ほぼリアルタイムでデータが更新されること
しくみ
今回は手軽さからGoogleスプレッドシートをデータソースとしました。データの書き込みもGoogle App Scriptを使うことで簡単に行えます。
- iPhoneのショートカット機能を利用して、位置情報や歩数のデータを持たせたPOSTリクエストをGASに送信します。なお、iPhoneのオートメーション機能を用いて、定期的に自動送信されるようにしておきます。
- GASはリクエストを受け取ると、Googleスプレッドシートにデータを書き込み、同時にiPhoneに結果をレスポンスします。
- SAC上には、Googleスプレッドシートをデータソースとしたモデルを構築しており、そのモデル上にSACにおけるレポート機能であるストーリーが作られています。SACは、スケジューリングに従って定期的にGoogleスプレッドシートのデータをモデルにimportし、ストーリーを自動更新します。
つくりかた
Googleスプレッドシート
このようなフォーマットで用意しました。
タイムスタンプ、緯度経度、歩数がGASにより書き込まれます。残りの列は関数で導出させるようにしています。
SAC
1. モデルの構築
Googleスプレッドシートのデータをimportしモデルを構築します。
SACでは、Googleアカウントと接続し、Googleドライブのデータをデータソースとして選択できます。
詳細は割愛しますが、今回は緯度経度を用いて地図に表示させたいので、Location Dimensionを作っておきます。
モデルを生成したら、データを定期的に自動importさせるために、Data managementワークスペースでimportのスケジューリングを設定します。
毎時のデータ更新が、最も頻度の高いオプションのようですね。
2. ストーリーの作成
作成したモデルを基に、ストーリー機能を使ってレポートを作成します。
やはり地図をトップに持ってきたい!ということでGeomapを追加します。今回は行動履歴を軌跡として可視化したいため、Flowレイヤを追加します。
他にも、色々とグラフやインジケータを置いてみました。
5k歩や20k歩をマイルストーンとして、しきい値や基準線を引いてみました。二万歩は遠いですね…泣
GAS
下記のようにコーディングしてデプロイしました。
こちらの記事を参考にさせて頂きました!!
コードの内容としては、POSTリクエストをトリガに作動するdoPost関数が、JSON形式で送信されてきたデータを整形してあらかじめ作成しておいたGoogleスプレッドシートに書き込んでいくというものです。
デプロイ時のWebapp urlは、iPhoneからPOSTリクエストを送る際に必要ですので控えておきます。
function doPost(e) {
// iPhone(ショートカット)から送られてきた位置情報を取得
let params = JSON.parse(e.postData.getDataAsString());
let longitudeData = params.location.longitude;
let latitudeData = params.location.latitude;
let walkcountData = params.walkcount.walkcount;
// ショートカットに返すメッセージを格納する為の変数
let result = {};
let output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
// 位置情報が問題なく送られてきてるかの判定
if (longitudeData){
result = {
"success" : {
"message" : "スプレッドシートへの記録が完了しました"
}
};
// 位置情報があればスプレッドシートへ記録する
addLog( JSON.stringify({longitude: longitudeData,latitude:latitudeData,walkcount: walkcountData}) );
} else {
result = {
"error": {
"message": "データがありません"
}
};
}
// ショートカットにメッセージを返す
output.setContent(JSON.stringify(result));
return output;
}
function addLog(text) {
// 記録するスプレッドシートを指定
let spreadsheetId = "xxxxxxxxxxxxxxxxx"; // スプレッドシートID
let sheetName = "xxxxxxx"; // スプレッドシート名
let spreadsheet = SpreadsheetApp.openById(spreadsheetId);
let sheet = spreadsheet.getSheetByName(sheetName);
// ショートカットから送信された位置情報をスプレッドシートに記録
let info = JSON.parse(text)
let today = new Date()
sheet.appendRow([Utilities.formatDate(today,'JST','yyyy-MM-dd HH:mm:ss'),info.longitude,info.latitude,info.walkcount]);
let lastRow = sheet.getLastRow();
let copyRange = sheet.getRange(lastRow - 1, 5, 1, 20);
let pasteRange = sheet.getRange(lastRow , 5, 1, 20);
copyRange.copyTo(pasteRange);
let range = sheet.getDataRange();
range.setHorizontalAlignment("left"); // 文字を左揃えに統一
}
iPhone
iPhoneのショートカット機能を利用して、GASにデータを送信します。
ショートカットの内容は以下です。GPSから位置情報を、ヘルスケアアプリから歩数のデータを取得し、先ほど作成したGASのWebアプリに送信しています。かなり直感的に作成することが出来ました!
なお、iPhoneのオートメーション機能を利用すると、設定した時刻にショートカットを自動実行させることが出来ます。今回は15分間隔で実行するように設定しました。
まとめ
・SACのストーリー機能を用いることで、見やすくキレイなレポートを直感的かつ簡単に作成できる。
・SACはGoogle Drive含め多様なデータソースと接続させることが可能
・Live接続を行わなくてもimport接続で定期importをスケジュールすることで、ある程度リアルタイムなデータ更新が可能
・身近なデータを収集するにはiPhoneのショートカット機能が便利
良い夏休みとなりました。それでは。